browser_accessibility_win.cc revision 868fa2fe829687343ffae624259930155e16dbd8
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" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/enum_variant.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/scoped_comptr.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/windows_version.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/accessibility/browser_accessibility_manager_win.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/accessibility_messages.h" 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/common/content_client.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/accessibility/accessible_text_utils.h" 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/base/win/accessibility_ids_win.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/win/accessibility_misc_utils.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// These nonstandard GUIDs are taken directly from the Mozilla sources 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// (accessible/src/msaa/nsAccessNodeWrap.cpp); some documentation is here: 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://developer.mozilla.org/en/Accessibility/AT-APIs/ImplementationFeatures/MSAA 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GUID GUID_ISimpleDOM = { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x0c539790, 0x12e4, 0x11cf, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0xb6, 0x61, 0x00, 0xaa, 0x00, 0x4c, 0xd6, 0xd8}; 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const GUID GUID_IAccessibleContentDocument = { 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0xa5d8e1f3, 0x3571, 0x4d8f, 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0x95, 0x21, 0x07, 0xed, 0x28, 0xfb, 0x07, 0x2e}; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char16 BrowserAccessibilityWin::kEmbeddedCharacter[] = L"\xfffc"; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)LONG BrowserAccessibilityWin::next_unique_id_win_ = 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::win::kFirstBrowserAccessibilityManagerAccessibilityId; 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BrowserAccessibilityRelation 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A simple implementation of IAccessibleRelation, used to represent 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a relationship between two accessible nodes in the tree. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserAccessibilityRelation 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public CComObjectRootEx<CComMultiThreadModel>, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public IAccessibleRelation { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BEGIN_COM_MAP(BrowserAccessibilityRelation) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COM_INTERFACE_ENTRY(IAccessibleRelation) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) END_COM_MAP() 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_EXPORT BrowserAccessibilityRelation() {} 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_EXPORT virtual ~BrowserAccessibilityRelation() {} 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_EXPORT void Initialize(BrowserAccessibilityWin* owner, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& type); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_EXPORT void AddTarget(int target_id); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IAccessibleRelation methods. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_EXPORT STDMETHODIMP get_relationType(BSTR* relation_type); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_EXPORT STDMETHODIMP get_nTargets(long* n_targets); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_EXPORT STDMETHODIMP get_target(long target_index, IUnknown** target); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_EXPORT STDMETHODIMP get_targets(long max_targets, 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IUnknown** targets, 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* n_targets); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IAccessibleRelation methods not implemented. 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_EXPORT STDMETHODIMP get_localizedRelationType(BSTR* relation_type) { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 type_; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::ScopedComPtr<BrowserAccessibilityWin> owner_; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<int> target_ids_; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserAccessibilityRelation::Initialize(BrowserAccessibilityWin* owner, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& type) { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) owner_ = owner; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type_ = type; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserAccessibilityRelation::AddTarget(int target_id) { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_ids_.push_back(target_id); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityRelation::get_relationType( 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* relation_type) { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!relation_type) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!owner_->instance_active()) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *relation_type = SysAllocString(type_.c_str()); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(*relation_type); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityRelation::get_nTargets(long* n_targets) { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!n_targets) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!owner_->instance_active()) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_targets = static_cast<long>(target_ids_.size()); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityManager* manager = owner_->manager(); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (long i = *n_targets - 1; i >= 0; --i) { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibility* result = manager->GetFromRendererID(target_ids_[i]); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result || !result->instance_active()) { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_targets = 0; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityRelation::get_target(long target_index, 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IUnknown** target) { 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!owner_->instance_active()) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (target_index < 0 || 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_index >= static_cast<long>(target_ids_.size())) { 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityManager* manager = owner_->manager(); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibility* result = 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager->GetFromRendererID(target_ids_[target_index]); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result || !result->instance_active()) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *target = static_cast<IAccessible*>( 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result->ToBrowserAccessibilityWin()->NewReference()); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityRelation::get_targets(long max_targets, 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IUnknown** targets, 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* n_targets) { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!targets || !n_targets) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!owner_->instance_active()) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long count = static_cast<long>(target_ids_.size()); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (count > max_targets) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) count = max_targets; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_targets = count; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (count == 0) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (long i = 0; i < count; ++i) { 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HRESULT result = get_target(i, &targets[i]); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result != S_OK) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BrowserAccessibilityWin 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserAccessibility* BrowserAccessibility::Create() { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CComObject<BrowserAccessibilityWin>* instance; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HRESULT hr = CComObject<BrowserAccessibilityWin>::CreateInstance(&instance); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(SUCCEEDED(hr)); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return instance->NewReference(); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserAccessibilityWin* BrowserAccessibility::ToBrowserAccessibilityWin() { 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<BrowserAccessibilityWin*>(this); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserAccessibilityWin::BrowserAccessibilityWin() 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : ia_role_(0), 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_(0), 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_(0), 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_(0), 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_time_(true), 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_ia_state_(0) { 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Start unique IDs at -1 and decrement each time, because get_accChild 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // uses positive IDs to enumerate children, so we use negative IDs to 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // clearly distinguish between indices and unique IDs. 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) unique_id_win_ = next_unique_id_win_; 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (next_unique_id_win_ == 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::win::kLastBrowserAccessibilityManagerAccessibilityId) { 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) next_unique_id_win_ = 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::win::kFirstBrowserAccessibilityManagerAccessibilityId; 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) next_unique_id_win_--; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserAccessibilityWin::~BrowserAccessibilityWin() { 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < relations_.size(); ++i) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relations_[i]->Release(); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IAccessible methods. 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Conventions: 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Always test for instance_active_ first and return E_FAIL if it's false. 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Always check for invalid arguments first, even if they're unused. 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Return S_FALSE if the only output is a string argument and it's empty. 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT BrowserAccessibilityWin::accDoDefaultAction(VARIANT var_id) { 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->DoDefaultAction(*target); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::accHitTest(LONG x_left, 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG y_top, 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VARIANT* child) { 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!child) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point point(x_left, y_top); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetGlobalBoundsRect().Contains(point)) { 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return S_FALSE and VT_EMPTY when the outside the object's boundaries. 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->vt = VT_EMPTY; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibility* result = BrowserAccessibilityForPoint(point); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result == this) { 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Point is within this object. 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->vt = VT_I4; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->lVal = CHILDID_SELF; 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->vt = VT_DISPATCH; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->pdispVal = result->ToBrowserAccessibilityWin()->NewReference(); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::accLocation(LONG* x_left, 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* y_top, 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* width, 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* height, 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VARIANT var_id) { 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!x_left || !y_top || !width || !height) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bounds = target->GetGlobalBoundsRect(); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *x_left = bounds.x(); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *y_top = bounds.y(); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *width = bounds.width(); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *height = bounds.height(); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::accNavigate(LONG nav_dir, 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VARIANT start, 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VARIANT* end) { 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(start); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((nav_dir == NAVDIR_LASTCHILD || nav_dir == NAVDIR_FIRSTCHILD) && 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start.lVal != CHILDID_SELF) { 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MSAA states that navigating to first/last child can only be from self. 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibility* result = NULL; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (nav_dir) { 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NAVDIR_DOWN: 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NAVDIR_UP: 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NAVDIR_LEFT: 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NAVDIR_RIGHT: 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These directions are not implemented, matching Mozilla and IE. 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NAVDIR_FIRSTCHILD: 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target->children_.empty()) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = target->children_.front(); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NAVDIR_LASTCHILD: 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target->children_.empty()) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = target->children_.back(); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NAVDIR_NEXT: 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = target->GetNextSibling(); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NAVDIR_PREVIOUS: 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = target->GetPreviousSibling(); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result) { 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end->vt = VT_EMPTY; 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end->vt = VT_DISPATCH; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end->pdispVal = result->ToBrowserAccessibilityWin()->NewReference(); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accChild(VARIANT var_child, 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDispatch** disp_child) { 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!disp_child) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *disp_child = NULL; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_child); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*disp_child) = target->NewReference(); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accChildCount(LONG* child_count) { 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!child_count) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *child_count = children_.size(); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accDefaultAction(VARIANT var_id, 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* def_action) { 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!def_action) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return target->GetStringAttributeAsBstr( 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_SHORTCUT, def_action); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accDescription(VARIANT var_id, 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* desc) { 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!desc) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return target->GetStringAttributeAsBstr( 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_DESCRIPTION, desc); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accFocus(VARIANT* focus_child) { 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!focus_child) 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* focus = static_cast<BrowserAccessibilityWin*>( 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->GetFocus(this)); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (focus == this) { 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_child->vt = VT_I4; 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_child->lVal = CHILDID_SELF; 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (focus == NULL) { 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_child->vt = VT_EMPTY; 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_child->vt = VT_DISPATCH; 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_child->pdispVal = focus->NewReference(); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accHelp(VARIANT var_id, BSTR* help) { 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!help) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return target->GetStringAttributeAsBstr( 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_HELP, help); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accKeyboardShortcut(VARIANT var_id, 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* acc_key) { 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!acc_key) 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return target->GetStringAttributeAsBstr( 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_SHORTCUT, acc_key); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accName(VARIANT var_id, BSTR* name) { 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!name) 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 name_str = target->name_; 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the name is empty, see if it's labeled by another element. 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (name_str.empty()) { 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int title_elem_id; 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (target->GetIntAttribute(AccessibilityNodeData::ATTR_TITLE_UI_ELEMENT, 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &title_elem_id)) { 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibility* title_elem = 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->GetFromRendererID(title_elem_id); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (title_elem) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name_str = title_elem->GetTextRecursive(); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (name_str.empty()) 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *name = SysAllocString(name_str.c_str()); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(*name); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accParent(IDispatch** disp_parent) { 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!disp_parent) 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IAccessible* parent = parent_->ToBrowserAccessibilityWin(); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (parent == NULL) { 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This happens if we're the root of the tree; 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // return the IAccessible for the window. 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent = manager_->ToBrowserAccessibilityManagerWin()->parent_iaccessible(); 49490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // |parent| can only be NULL if the manager was created before the parent 49590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // IAccessible was known and it wasn't subsequently set before a client 49690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // requested it. Crash hard if this happens so that we get crash reports. 49790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) CHECK(parent); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent->AddRef(); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *disp_parent = parent; 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accRole(VARIANT var_id, 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VARIANT* role) { 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!role) 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target->role_name_.empty()) { 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role->vt = VT_BSTR; 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role->bstrVal = SysAllocString(target->role_name_.c_str()); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role->vt = VT_I4; 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role->lVal = target->ia_role_; 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accState(VARIANT var_id, 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VARIANT* state) { 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!state) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state->vt = VT_I4; 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state->lVal = target->ia_state_; 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (manager_->GetFocus(NULL) == this) 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state->lVal |= STATE_SYSTEM_FOCUSED; 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accValue(VARIANT var_id, 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BSTR* value) { 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!value) 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *value = SysAllocString(target->value_.c_str()); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(*value); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accHelpTopic(BSTR* help_file, 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VARIANT var_id, 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* topic_id) { 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accSelection(VARIANT* selected) { 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (role_ != AccessibilityNodeData::ROLE_LISTBOX) 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long selected_count = 0; 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < children_.size(); ++i) { 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (children_[i]->HasState(AccessibilityNodeData::STATE_SELECTED)) 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++selected_count; 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (selected_count == 0) { 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected->vt = VT_EMPTY; 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (selected_count == 1) { 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < children_.size(); ++i) { 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (children_[i]->HasState(AccessibilityNodeData::STATE_SELECTED)) { 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected->vt = VT_DISPATCH; 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected->pdispVal = 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) children_[i]->ToBrowserAccessibilityWin()->NewReference(); 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Multiple items are selected. 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::EnumVariant* enum_variant = 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new base::win::EnumVariant(selected_count); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum_variant->AddRef(); 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long index = 0; 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < children_.size(); ++i) { 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (children_[i]->HasState(AccessibilityNodeData::STATE_SELECTED)) { 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum_variant->ItemAt(index)->vt = VT_DISPATCH; 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum_variant->ItemAt(index)->pdispVal = 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) children_[i]->ToBrowserAccessibilityWin()->NewReference(); 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++index; 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected->vt = VT_UNKNOWN; 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected->punkVal = static_cast<IUnknown*>( 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<base::win::IUnknownImpl*>(enum_variant)); 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::accSelect( 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG flags_sel, VARIANT var_id) { 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags_sel & SELFLAG_TAKEFOCUS) { 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->SetFocus(this, true); 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IAccessible2 methods. 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::role(LONG* role) { 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!role) 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *role = ia2_role_; 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_attributes(BSTR* attributes) { 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!attributes) 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The iaccessible2 attributes are a set of key-value pairs 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // separated by semicolons, with a colon between the key and the value. 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 str; 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned int i = 0; i < ia2_attributes_.size(); ++i) { 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i != 0) 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) str += L';'; 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) str += ia2_attributes_[i]; 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (str.empty()) 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *attributes = SysAllocString(str.c_str()); 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(*attributes); 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_states(AccessibleStates* states) { 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!states) 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *states = ia2_state_; 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_uniqueID(LONG* unique_id) { 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!unique_id) 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *unique_id = unique_id_win_; 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_windowHandle(HWND* window_handle) { 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!window_handle) 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *window_handle = manager_->ToBrowserAccessibilityManagerWin()->parent_hwnd(); 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_indexInParent(LONG* index_in_parent) { 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!index_in_parent) 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *index_in_parent = index_in_parent_; 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nRelations(LONG* n_relations) { 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!n_relations) 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_relations = relations_.size(); 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_relation( 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG relation_index, 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IAccessibleRelation** relation) { 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (relation_index < 0 || 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relation_index >= static_cast<long>(relations_.size())) { 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!relation) 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relations_[relation_index]->AddRef(); 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *relation = relations_[relation_index]; 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_relations( 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG max_relations, 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IAccessibleRelation** relations, 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG* n_relations) { 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!relations || !n_relations) 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long count = static_cast<long>(relations_.size()); 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_relations = count; 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (count == 0) 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (long i = 0; i < count; ++i) { 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relations_[i]->AddRef(); 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relations[i] = relations_[i]; 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::scrollTo(enum IA2ScrollType scroll_type) { 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect r = location_; 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch(scroll_type) { 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_SCROLL_TYPE_TOP_LEFT: 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->ScrollToMakeVisible(*this, gfx::Rect(r.x(), r.y(), 0, 0)); 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_SCROLL_TYPE_BOTTOM_RIGHT: 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->ScrollToMakeVisible( 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *this, gfx::Rect(r.right(), r.bottom(), 0, 0)); 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_SCROLL_TYPE_TOP_EDGE: 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->ScrollToMakeVisible( 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *this, gfx::Rect(r.x(), r.y(), r.width(), 0)); 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_SCROLL_TYPE_BOTTOM_EDGE: 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->ScrollToMakeVisible( 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *this, gfx::Rect(r.x(), r.bottom(), r.width(), 0)); 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_SCROLL_TYPE_LEFT_EDGE: 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->ScrollToMakeVisible( 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *this, gfx::Rect(r.x(), r.y(), 0, r.height())); 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_SCROLL_TYPE_RIGHT_EDGE: 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->ScrollToMakeVisible( 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *this, gfx::Rect(r.right(), r.y(), 0, r.height())); 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_SCROLL_TYPE_ANYWHERE: 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->ScrollToMakeVisible(*this, r); 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<BrowserAccessibilityManagerWin*>(manager_) 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ->TrackScrollingObject(this); 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::scrollToPoint( 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum IA2CoordinateType coordinate_type, 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG x, 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG y) { 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point scroll_to(x, y); 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (coordinate_type == IA2_COORDTYPE_SCREEN_RELATIVE) { 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scroll_to -= manager_->GetViewBounds().OffsetFromOrigin(); 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (coordinate_type == IA2_COORDTYPE_PARENT_RELATIVE) { 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (parent_) 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scroll_to += parent_->location().OffsetFromOrigin(); 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->ScrollToPoint(*this, scroll_to); 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<BrowserAccessibilityManagerWin*>(manager_) 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ->TrackScrollingObject(this); 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_groupPosition( 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG* group_level, 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG* similar_items_in_group, 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG* position_in_group) { 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!group_level || !similar_items_in_group || !position_in_group) 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (role_ == AccessibilityNodeData::ROLE_LISTBOX_OPTION && 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent_ && 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent_->role() == AccessibilityNodeData::ROLE_LISTBOX) { 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *group_level = 0; 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *similar_items_in_group = parent_->child_count(); 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *position_in_group = index_in_parent_ + 1; 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 860c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// IAccessibleApplication methods. 861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 862c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 863c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_appName(BSTR* app_name) { 864c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // No need to check |instance_active_| because this interface is 865c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // global, and doesn't depend on any local state. 866c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 867c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!app_name) 868c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return E_INVALIDARG; 869c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 870c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string product_name = GetContentClient()->GetProduct(); 871c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *app_name = SysAllocString(UTF8ToUTF16(product_name).c_str()); 872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(*app_name); 873c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return *app_name ? S_OK : E_FAIL; 874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 875c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 876c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_appVersion(BSTR* app_version) { 877c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // No need to check |instance_active_| because this interface is 878c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // global, and doesn't depend on any local state. 879c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 880c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!app_version) 881c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return E_INVALIDARG; 882c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 883c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string user_agent = GetContentClient()->GetUserAgent(); 884c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *app_version = SysAllocString(UTF8ToUTF16(user_agent).c_str()); 885c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(*app_version); 886c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return *app_version ? S_OK : E_FAIL; 887c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 888c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 889c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_toolkitName(BSTR* toolkit_name) { 890c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // No need to check |instance_active_| because this interface is 891c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // global, and doesn't depend on any local state. 892c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 893c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!toolkit_name) 894c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return E_INVALIDARG; 895c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 896c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This is hard-coded; all products based on the Chromium engine 897c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // will have the same toolkit name, so that assistive technology can 898c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // detect any Chrome-based product. 899c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *toolkit_name = SysAllocString(L"Chrome"); 900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(*toolkit_name); 901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return *toolkit_name ? S_OK : E_FAIL; 902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 903c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 904c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_toolkitVersion( 905c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BSTR* toolkit_version) { 906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (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 (!toolkit_version) 910c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return E_INVALIDARG; 911c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string user_agent = GetContentClient()->GetUserAgent(); 913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *toolkit_version = SysAllocString(UTF8ToUTF16(user_agent).c_str()); 914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(*toolkit_version); 915c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return *toolkit_version ? S_OK : E_FAIL; 916c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 917c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 918c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IAccessibleImage methods. 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_description(BSTR* desc) { 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!desc) 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetStringAttributeAsBstr( 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_DESCRIPTION, desc); 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_imagePosition( 9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum IA2CoordinateType coordinate_type, 9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* x, 9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* y) { 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!x || !y) 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (coordinate_type == IA2_COORDTYPE_SCREEN_RELATIVE) { 9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HWND parent_hwnd = 9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) manager_->ToBrowserAccessibilityManagerWin()->parent_hwnd(); 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) POINT top_left = {0, 0}; 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::ClientToScreen(parent_hwnd, &top_left); 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *x = location_.x() + top_left.x; 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *y = location_.y() + top_left.y; 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (coordinate_type == IA2_COORDTYPE_PARENT_RELATIVE) { 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *x = location_.x(); 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *y = location_.y(); 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (parent_) { 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *x -= parent_->location().x(); 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *y -= parent_->location().y(); 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_imageSize(LONG* height, LONG* width) { 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!height || !width) 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *height = location_.height(); 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *width = location_.width(); 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IAccessibleTable methods. 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accessibleAt( 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long row, 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long column, 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IUnknown** accessible) { 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!accessible) 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int columns; 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rows; 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetIntAttribute( 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_COLUMN_COUNT, &columns) || 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !GetIntAttribute( 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_ROW_COUNT, &rows) || 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) columns <= 0 || 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rows <= 0) { 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (row < 0 || row >= rows || column < 0 || column >= columns) 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(columns * rows, static_cast<int>(cell_ids_.size())); 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cell_id = cell_ids_[row * columns + column]; 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = GetFromRendererID(cell_id); 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell) { 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *accessible = static_cast<IAccessible*>(cell->NewReference()); 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *accessible = NULL; 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_caption(IUnknown** accessible) { 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!accessible) 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): implement 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_childIndex(long row, 10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long column, 10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* cell_index) { 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!cell_index) 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int columns; 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rows; 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetIntAttribute( 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_COLUMN_COUNT, &columns) || 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !GetIntAttribute( 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_ROW_COUNT, &rows) || 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) columns <= 0 || 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rows <= 0) { 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (row < 0 || row >= rows || column < 0 || column >= columns) 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(columns * rows, static_cast<int>(cell_ids_.size())); 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cell_id = cell_ids_[row * columns + column]; 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < unique_cell_ids_.size(); ++i) { 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unique_cell_ids_[i] == cell_id) { 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *cell_index = (long)i; 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_columnDescription(long column, 10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BSTR* description) { 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!description) 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int columns; 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rows; 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetIntAttribute( 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_COLUMN_COUNT, &columns) || 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !GetIntAttribute(AccessibilityNodeData::ATTR_TABLE_ROW_COUNT, &rows) || 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) columns <= 0 || 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rows <= 0) { 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (column < 0 || column >= columns) 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < rows; ++i) { 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cell_id = cell_ids_[i * columns + column]; 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = static_cast<BrowserAccessibilityWin*>( 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->GetFromRendererID(cell_id)); 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell && cell->role_ == AccessibilityNodeData::ROLE_COLUMN_HEADER) { 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell->name_.size() > 0) { 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *description = SysAllocString(cell->name_.c_str()); 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cell->GetStringAttributeAsBstr( 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_DESCRIPTION, description); 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_columnExtentAt( 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long row, 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long column, 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* n_columns_spanned) { 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!n_columns_spanned) 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int columns; 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rows; 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetIntAttribute( 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_COLUMN_COUNT, &columns) || 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !GetIntAttribute(AccessibilityNodeData::ATTR_TABLE_ROW_COUNT, &rows) || 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) columns <= 0 || 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rows <= 0) { 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (row < 0 || row >= rows || column < 0 || column >= columns) 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cell_id = cell_ids_[row * columns + column]; 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = static_cast<BrowserAccessibilityWin*>( 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->GetFromRendererID(cell_id)); 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int colspan; 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell && 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cell->GetIntAttribute( 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_CELL_COLUMN_SPAN, &colspan) && 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) colspan >= 1) { 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_columns_spanned = colspan; 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_columnHeader( 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IAccessibleTable** accessible_table, 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* starting_row_index) { 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): implement 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_columnIndex(long cell_index, 11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* column_index) { 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!column_index) 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cell_id_count = static_cast<int>(unique_cell_ids_.size()); 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell_index < 0) 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell_index >= cell_id_count) 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cell_id = unique_cell_ids_[cell_index]; 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin(); 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int col_index; 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell && 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cell->GetIntAttribute( 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_CELL_COLUMN_INDEX, &col_index)) { 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *column_index = col_index; 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nColumns(long* column_count) { 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!column_count) 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int columns; 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetIntAttribute( 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_COLUMN_COUNT, &columns)) { 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *column_count = columns; 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nRows(long* row_count) { 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!row_count) 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rows; 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetIntAttribute(AccessibilityNodeData::ATTR_TABLE_ROW_COUNT, &rows)) { 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *row_count = rows; 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nSelectedChildren(long* cell_count) { 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!cell_count) 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): add support for selected cells/rows/columns in tables. 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *cell_count = 0; 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nSelectedColumns(long* column_count) { 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!column_count) 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *column_count = 0; 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nSelectedRows(long* row_count) { 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!row_count) 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *row_count = 0; 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_rowDescription(long row, 12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BSTR* description) { 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!description) 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int columns; 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rows; 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetIntAttribute( 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_COLUMN_COUNT, &columns) || 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !GetIntAttribute(AccessibilityNodeData::ATTR_TABLE_ROW_COUNT, &rows) || 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) columns <= 0 || 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rows <= 0) { 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (row < 0 || row >= rows) 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < columns; ++i) { 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cell_id = cell_ids_[row * columns + i]; 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin(); 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell && cell->role_ == AccessibilityNodeData::ROLE_ROW_HEADER) { 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell->name_.size() > 0) { 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *description = SysAllocString(cell->name_.c_str()); 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cell->GetStringAttributeAsBstr( 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_DESCRIPTION, description); 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_rowExtentAt(long row, 12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long column, 12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* n_rows_spanned) { 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!n_rows_spanned) 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int columns; 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rows; 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetIntAttribute( 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_COLUMN_COUNT, &columns) || 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !GetIntAttribute(AccessibilityNodeData::ATTR_TABLE_ROW_COUNT, &rows) || 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) columns <= 0 || 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rows <= 0) { 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (row < 0 || row >= rows || column < 0 || column >= columns) 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cell_id = cell_ids_[row * columns + column]; 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin(); 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rowspan; 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell && 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cell->GetIntAttribute( 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_CELL_ROW_SPAN, &rowspan) && 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rowspan >= 1) { 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_rows_spanned = rowspan; 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_rowHeader( 13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IAccessibleTable** accessible_table, 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* starting_column_index) { 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): implement 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_rowIndex(long cell_index, 13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* row_index) { 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!row_index) 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cell_id_count = static_cast<int>(unique_cell_ids_.size()); 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell_index < 0) 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell_index >= cell_id_count) 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cell_id = unique_cell_ids_[cell_index]; 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin(); 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cell_row_index; 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell && 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cell->GetIntAttribute( 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_CELL_ROW_INDEX, &cell_row_index)) { 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *row_index = cell_row_index; 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_selectedChildren(long max_children, 13542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long** children, 13552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* n_children) { 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!children || !n_children) 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_children = 0; 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_selectedColumns(long max_columns, 13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long** columns, 13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* n_columns) { 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!columns || !n_columns) 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_columns = 0; 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_selectedRows(long max_rows, 13822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long** rows, 13832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* n_rows) { 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!rows || !n_rows) 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_rows = 0; 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_summary(IUnknown** accessible) { 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!accessible) 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): implement 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_isColumnSelected( 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long column, 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) boolean* is_selected) { 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_selected) 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *is_selected = false; 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_isRowSelected(long row, 14212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) boolean* is_selected) { 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_selected) 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *is_selected = false; 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_isSelected(long row, 14342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long column, 14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) boolean* is_selected) { 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_selected) 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *is_selected = false; 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_rowColumnExtentsAtIndex( 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long index, 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* row, 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* column, 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* row_extents, 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* column_extents, 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) boolean* is_selected) { 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!row || !column || !row_extents || !column_extents || !is_selected) 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cell_id_count = static_cast<int>(unique_cell_ids_.size()); 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index < 0) 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index >= cell_id_count) 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cell_id = unique_cell_ids_[index]; 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin(); 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rowspan; 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int colspan; 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell && 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cell->GetIntAttribute( 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_CELL_ROW_SPAN, &rowspan) && 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cell->GetIntAttribute( 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_CELL_COLUMN_SPAN, &colspan) && 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rowspan >= 1 && 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) colspan >= 1) { 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *row_extents = rowspan; 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *column_extents = colspan; 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IAccessibleTable2 methods. 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_cellAt(long row, 14912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long column, 14922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IUnknown** cell) { 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return get_accessibleAt(row, column, cell); 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nSelectedCells(long* cell_count) { 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return get_nSelectedChildren(cell_count); 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_selectedCells( 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IUnknown*** cells, 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* n_selected_cells) { 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!cells || !n_selected_cells) 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_selected_cells = 0; 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_selectedColumns(long** columns, 15152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* n_columns) { 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!columns || !n_columns) 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_columns = 0; 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_selectedRows(long** rows, 15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* n_rows) { 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!rows || !n_rows) 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_rows = 0; 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IAccessibleTableCell methods. 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_columnExtent( 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* n_columns_spanned) { 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!n_columns_spanned) 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int colspan; 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetIntAttribute( 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_CELL_COLUMN_SPAN, &colspan) && 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) colspan >= 1) { 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_columns_spanned = colspan; 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_columnHeaderCells( 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IUnknown*** cell_accessibles, 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* n_column_header_cells) { 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!cell_accessibles || !n_column_header_cells) 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_column_header_cells = 0; 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int column; 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetIntAttribute( 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_CELL_COLUMN_INDEX, &column)) { 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibility* table = parent(); 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (table && table->role() != AccessibilityNodeData::ROLE_TABLE) 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) table = table->parent(); 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!table) { 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int columns; 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rows; 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!table->GetIntAttribute( 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_COLUMN_COUNT, &columns) || 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !table->GetIntAttribute( 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_ROW_COUNT, &rows)) { 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (columns <= 0 || rows <= 0 || column < 0 || column >= columns) 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < rows; ++i) { 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cell_id = table->cell_ids()[i * columns + column]; 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin(); 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell && cell->role_ == AccessibilityNodeData::ROLE_COLUMN_HEADER) 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*n_column_header_cells)++; 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *cell_accessibles = static_cast<IUnknown**>(CoTaskMemAlloc( 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*n_column_header_cells) * sizeof(cell_accessibles[0]))); 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index = 0; 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < rows; ++i) { 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cell_id = table->cell_ids()[i * columns + column]; 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin(); 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell && cell->role_ == AccessibilityNodeData::ROLE_COLUMN_HEADER) { 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*cell_accessibles)[index] = 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<IAccessible*>(cell->NewReference()); 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++index; 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_columnIndex(long* column_index) { 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!column_index) 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int column; 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetIntAttribute( 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_CELL_COLUMN_INDEX, &column)) { 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *column_index = column; 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_rowExtent(long* n_rows_spanned) { 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!n_rows_spanned) 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rowspan; 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetIntAttribute( 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_CELL_ROW_SPAN, &rowspan) && 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rowspan >= 1) { 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_rows_spanned = rowspan; 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_rowHeaderCells( 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IUnknown*** cell_accessibles, 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* n_row_header_cells) { 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!cell_accessibles || !n_row_header_cells) 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_row_header_cells = 0; 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int row; 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetIntAttribute( 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_CELL_ROW_INDEX, &row)) { 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibility* table = parent(); 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (table && table->role() != AccessibilityNodeData::ROLE_TABLE) 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) table = table->parent(); 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!table) { 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int columns; 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rows; 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!table->GetIntAttribute( 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_COLUMN_COUNT, &columns) || 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !table->GetIntAttribute( 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_ROW_COUNT, &rows)) { 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (columns <= 0 || rows <= 0 || row < 0 || row >= rows) 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < columns; ++i) { 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cell_id = table->cell_ids()[row * columns + i]; 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin(); 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell && cell->role_ == AccessibilityNodeData::ROLE_ROW_HEADER) 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*n_row_header_cells)++; 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *cell_accessibles = static_cast<IUnknown**>(CoTaskMemAlloc( 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*n_row_header_cells) * sizeof(cell_accessibles[0]))); 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index = 0; 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < columns; ++i) { 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cell_id = table->cell_ids()[row * columns + i]; 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin(); 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell && cell->role_ == AccessibilityNodeData::ROLE_ROW_HEADER) { 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*cell_accessibles)[index] = 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<IAccessible*>(cell->NewReference()); 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++index; 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_rowIndex(long* row_index) { 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!row_index) 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int row; 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetIntAttribute(AccessibilityNodeData::ATTR_TABLE_CELL_ROW_INDEX, &row)) { 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *row_index = row; 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_isSelected(boolean* is_selected) { 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_selected) 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *is_selected = false; 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_rowColumnExtents( 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* row_index, 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* column_index, 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* row_extents, 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* column_extents, 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) boolean* is_selected) { 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!row_index || 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !column_index || 17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !row_extents || 17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !column_extents || 17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !is_selected) { 17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int row; 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int column; 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rowspan; 17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int colspan; 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetIntAttribute(AccessibilityNodeData::ATTR_TABLE_CELL_ROW_INDEX, &row) && 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetIntAttribute( 17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_CELL_COLUMN_INDEX, &column) && 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetIntAttribute( 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_CELL_ROW_SPAN, &rowspan) && 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetIntAttribute( 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_CELL_COLUMN_SPAN, &colspan)) { 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *row_index = row; 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *column_index = column; 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *row_extents = rowspan; 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *column_extents = colspan; 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *is_selected = false; 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_table(IUnknown** table) { 17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!table) 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int row; 17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int column; 17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetIntAttribute(AccessibilityNodeData::ATTR_TABLE_CELL_ROW_INDEX, &row); 17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetIntAttribute(AccessibilityNodeData::ATTR_TABLE_CELL_COLUMN_INDEX, &column); 17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibility* find_table = parent(); 18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (find_table && find_table->role() != AccessibilityNodeData::ROLE_TABLE) 18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) find_table = find_table->parent(); 18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!find_table) { 18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *table = static_cast<IAccessibleTable*>( 18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) find_table->ToBrowserAccessibilityWin()->NewReference()); 18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IAccessibleText methods. 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nCharacters(LONG* n_characters) { 18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!n_characters) 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_characters = TextForIAccessibleText().length(); 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_caretOffset(LONG* offset) { 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!offset) 18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *offset = 0; 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (role_ == AccessibilityNodeData::ROLE_TEXT_FIELD || 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role_ == AccessibilityNodeData::ROLE_TEXTAREA) { 18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int sel_start = 0; 18392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (GetIntAttribute(AccessibilityNodeData::ATTR_TEXT_SEL_START, 18402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &sel_start)) 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *offset = sel_start; 18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nSelections(LONG* n_selections) { 18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!n_selections) 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *n_selections = 0; 18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (role_ == AccessibilityNodeData::ROLE_TEXT_FIELD || 18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role_ == AccessibilityNodeData::ROLE_TEXTAREA) { 18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int sel_start = 0; 18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int sel_end = 0; 18592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (GetIntAttribute(AccessibilityNodeData::ATTR_TEXT_SEL_START, 18602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &sel_start) && 18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetIntAttribute(AccessibilityNodeData::ATTR_TEXT_SEL_END, &sel_end) && 18622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sel_start != sel_end) 18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_selections = 1; 18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_selection(LONG selection_index, 18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG* start_offset, 18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG* end_offset) { 18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!start_offset || !end_offset || selection_index != 0) 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *start_offset = 0; 18792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *end_offset = 0; 18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (role_ == AccessibilityNodeData::ROLE_TEXT_FIELD || 18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role_ == AccessibilityNodeData::ROLE_TEXTAREA) { 18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int sel_start = 0; 18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int sel_end = 0; 18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetIntAttribute( 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TEXT_SEL_START, &sel_start) && 18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetIntAttribute(AccessibilityNodeData::ATTR_TEXT_SEL_END, &sel_end)) { 18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *start_offset = sel_start; 18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *end_offset = sel_end; 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_text(LONG start_offset, 18962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG end_offset, 18972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BSTR* text) { 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!text) 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& text_str = TextForIAccessibleText(); 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handle special text offsets. 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleSpecialTextOffset(text_str, &start_offset); 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleSpecialTextOffset(text_str, &end_offset); 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The spec allows the arguments to be reversed. 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (start_offset > end_offset) { 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG tmp = start_offset; 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start_offset = end_offset; 19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end_offset = tmp; 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The spec does not allow the start or end offsets to be out or range; 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we must return an error if so. 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG len = text_str.length(); 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (start_offset < 0) 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (end_offset > len) 19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 substr = text_str.substr(start_offset, end_offset - start_offset); 19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (substr.empty()) 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *text = SysAllocString(substr.c_str()); 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(*text); 19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_textAtOffset( 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG offset, 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum IA2TextBoundaryType boundary_type, 19372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* start_offset, 19382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* end_offset, 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* text) { 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!start_offset || !end_offset || !text) 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The IAccessible2 spec says we don't have to implement the "sentence" 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // boundary type, we can just let the screenreader handle it. 19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (boundary_type == IA2_TEXT_BOUNDARY_SENTENCE) { 19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *start_offset = 0; 19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *end_offset = 0; 19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *text = NULL; 19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& text_str = TextForIAccessibleText(); 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *start_offset = FindBoundary( 19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_str, boundary_type, offset, ui::BACKWARDS_DIRECTION); 19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *end_offset = FindBoundary( 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_str, boundary_type, offset, ui::FORWARDS_DIRECTION); 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return get_text(*start_offset, *end_offset, text); 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_textBeforeOffset( 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG offset, 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum IA2TextBoundaryType boundary_type, 19672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* start_offset, 19682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* end_offset, 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* text) { 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!start_offset || !end_offset || !text) 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The IAccessible2 spec says we don't have to implement the "sentence" 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // boundary type, we can just let the screenreader handle it. 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (boundary_type == IA2_TEXT_BOUNDARY_SENTENCE) { 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *start_offset = 0; 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *end_offset = 0; 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *text = NULL; 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& text_str = TextForIAccessibleText(); 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *start_offset = FindBoundary( 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_str, boundary_type, offset, ui::BACKWARDS_DIRECTION); 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *end_offset = offset; 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return get_text(*start_offset, *end_offset, text); 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_textAfterOffset( 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG offset, 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum IA2TextBoundaryType boundary_type, 19962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* start_offset, 19972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* end_offset, 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* text) { 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!start_offset || !end_offset || !text) 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The IAccessible2 spec says we don't have to implement the "sentence" 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // boundary type, we can just let the screenreader handle it. 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (boundary_type == IA2_TEXT_BOUNDARY_SENTENCE) { 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *start_offset = 0; 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *end_offset = 0; 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *text = NULL; 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& text_str = TextForIAccessibleText(); 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *start_offset = offset; 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *end_offset = FindBoundary( 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_str, boundary_type, offset, ui::FORWARDS_DIRECTION); 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return get_text(*start_offset, *end_offset, text); 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_newText(IA2TextSegment* new_text) { 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!new_text) 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 text = TextForIAccessibleText(); 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_text->text = SysAllocString(text.c_str()); 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_text->start = 0; 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_text->end = static_cast<long>(text.size()); 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_oldText(IA2TextSegment* old_text) { 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!old_text) 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_text->text = SysAllocString(old_text_.c_str()); 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_text->start = 0; 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_text->end = static_cast<long>(old_text_.size()); 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_offsetAtPoint( 20512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG x, 20522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG y, 20532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum IA2CoordinateType coord_type, 20542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* offset) { 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!offset) 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): implement this. We're returning S_OK for now so that 20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // screen readers still return partially accurate results rather than 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // completely failing. 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *offset = 0; 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::scrollSubstringTo( 20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG start_index, 20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG end_index, 20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum IA2ScrollType scroll_type) { 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): adjust this for the start and end index, too. 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return scrollTo(scroll_type); 20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::scrollSubstringToPoint( 20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG start_index, 20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG end_index, 20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum IA2CoordinateType coordinate_type, 20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG x, LONG y) { 20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): adjust this for the start and end index, too. 20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return scrollToPoint(coordinate_type, x, y); 20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::addSelection(LONG start_offset, 20862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG end_offset) { 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& text_str = TextForIAccessibleText(); 20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleSpecialTextOffset(text_str, &start_offset); 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleSpecialTextOffset(text_str, &end_offset); 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->SetTextSelection(*this, start_offset, end_offset); 20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::removeSelection(LONG selection_index) { 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (selection_index != 0) 21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->SetTextSelection(*this, 0, 0); 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::setCaretOffset(LONG offset) { 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& text_str = TextForIAccessibleText(); 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleSpecialTextOffset(text_str, &offset); 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->SetTextSelection(*this, offset, offset); 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::setSelection(LONG selection_index, 21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG start_offset, 21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG end_offset) { 21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (selection_index != 0) 21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& text_str = TextForIAccessibleText(); 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleSpecialTextOffset(text_str, &start_offset); 21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleSpecialTextOffset(text_str, &end_offset); 21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->SetTextSelection(*this, start_offset, end_offset); 21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IAccessibleHypertext methods. 21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nHyperlinks(long* hyperlink_count) { 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!hyperlink_count) 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *hyperlink_count = hyperlink_offset_to_index_.size(); 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_hyperlink( 21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long index, 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IAccessibleHyperlink** hyperlink) { 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!hyperlink || 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index < 0 || 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index >= static_cast<long>(hyperlinks_.size())) { 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* child = 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) children_[hyperlinks_[index]]->ToBrowserAccessibilityWin(); 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *hyperlink = static_cast<IAccessibleHyperlink*>(child->NewReference()); 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_hyperlinkIndex( 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long char_index, 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* hyperlink_index) { 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!hyperlink_index) 21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *hyperlink_index = -1; 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (char_index < 0 || char_index >= static_cast<long>(hypertext_.size())) 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<int32, int32>::iterator it = 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hyperlink_offset_to_index_.find(char_index); 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it == hyperlink_offset_to_index_.end()) 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *hyperlink_index = it->second; 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IAccessibleValue methods. 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_currentValue(VARIANT* value) { 21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!value) 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float float_val; 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetFloatAttribute( 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_VALUE_FOR_RANGE, &float_val)) { 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->vt = VT_R8; 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->dblVal = float_val; 22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->vt = VT_EMPTY; 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_minimumValue(VARIANT* value) { 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!value) 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float float_val; 22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetFloatAttribute(AccessibilityNodeData::ATTR_MIN_VALUE_FOR_RANGE, 22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &float_val)) { 22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->vt = VT_R8; 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->dblVal = float_val; 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->vt = VT_EMPTY; 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_maximumValue(VARIANT* value) { 22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!value) 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float float_val; 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetFloatAttribute(AccessibilityNodeData::ATTR_MAX_VALUE_FOR_RANGE, 22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &float_val)) { 22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->vt = VT_R8; 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->dblVal = float_val; 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->vt = VT_EMPTY; 22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::setCurrentValue(VARIANT new_value) { 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ISimpleDOMDocument methods. 22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_URL(BSTR* url) { 22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!url) 22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetStringAttributeAsBstr(AccessibilityNodeData::ATTR_DOC_URL, url); 22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_title(BSTR* title) { 22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!title) 22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetStringAttributeAsBstr(AccessibilityNodeData::ATTR_DOC_TITLE, title); 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_mimeType(BSTR* mime_type) { 22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!mime_type) 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetStringAttributeAsBstr( 22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_DOC_MIMETYPE, mime_type); 22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_docType(BSTR* doc_type) { 22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!doc_type) 22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetStringAttributeAsBstr( 23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_DOC_DOCTYPE, doc_type); 23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ISimpleDOMNode methods. 23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nodeInfo( 23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* node_name, 23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) short* name_space_id, 23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* node_value, 23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int* num_children, 23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int* unique_id, 23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned short* node_type) { 23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!node_name || !name_space_id || !node_value || !num_children || 23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !unique_id || !node_type) { 23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 tag; 23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetStringAttribute(AccessibilityNodeData::ATTR_HTML_TAG, &tag)) 23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node_name = SysAllocString(tag.c_str()); 23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node_name = NULL; 23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *name_space_id = 0; 23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node_value = SysAllocString(value_.c_str()); 23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *num_children = children_.size(); 2332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *unique_id = unique_id_win_; 23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_role_ == ROLE_SYSTEM_DOCUMENT) { 23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node_type = NODETYPE_DOCUMENT; 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (ia_role_ == ROLE_SYSTEM_TEXT && 23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((ia2_state_ & IA2_STATE_EDITABLE) == 0)) { 23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node_type = NODETYPE_TEXT; 23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node_type = NODETYPE_ELEMENT; 23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_attributes( 23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned short max_attribs, 23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* attrib_names, 23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) short* name_space_id, 23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* attrib_values, 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned short* num_attribs) { 23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!attrib_names || !name_space_id || !attrib_values || !num_attribs) 23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *num_attribs = max_attribs; 23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*num_attribs > html_attributes_.size()) 23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *num_attribs = html_attributes_.size(); 23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned short i = 0; i < *num_attribs; ++i) { 23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attrib_names[i] = SysAllocString(html_attributes_[i].first.c_str()); 23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name_space_id[i] = 0; 23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attrib_values[i] = SysAllocString(html_attributes_[i].second.c_str()); 23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_attributesForNames( 23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned short num_attribs, 23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* attrib_names, 23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) short* name_space_id, 23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* attrib_values) { 23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!attrib_names || !name_space_id || !attrib_values) 23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned short i = 0; i < num_attribs; ++i) { 23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name_space_id[i] = 0; 23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool found = false; 23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 name = (LPCWSTR)attrib_names[i]; 23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned int j = 0; j < html_attributes_.size(); ++j) { 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (html_attributes_[j].first == name) { 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attrib_values[i] = SysAllocString(html_attributes_[j].second.c_str()); 23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) found = true; 23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!found) { 23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attrib_values[i] = NULL; 23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_computedStyle( 24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned short max_style_properties, 24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) boolean use_alternate_view, 24022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BSTR* style_properties, 24032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BSTR* style_values, 24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned short *num_style_properties) { 24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!style_properties || !style_values) 24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We only cache a single style property for now: DISPLAY 24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 display; 24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (max_style_properties == 0 || 24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !GetStringAttribute(AccessibilityNodeData::ATTR_DISPLAY, &display)) { 24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *num_style_properties = 0; 24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *num_style_properties = 1; 24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style_properties[0] = SysAllocString(L"display"); 24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style_values[0] = SysAllocString(display.c_str()); 24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_computedStyleForProperties( 24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned short num_style_properties, 24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) boolean use_alternate_view, 24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* style_properties, 24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* style_values) { 24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!style_properties || !style_values) 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We only cache a single style property for now: DISPLAY 24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned short i = 0; i < num_style_properties; ++i) { 24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 name = (LPCWSTR)style_properties[i]; 24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringToLowerASCII(&name); 24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (name == L"display") { 24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 display; 24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetStringAttribute(AccessibilityNodeData::ATTR_DISPLAY, &display); 24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style_values[i] = SysAllocString(display.c_str()); 24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style_values[i] = NULL; 24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::scrollTo(boolean placeTopLeft) { 24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return scrollTo(placeTopLeft ? 24572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IA2_SCROLL_TYPE_TOP_LEFT : IA2_SCROLL_TYPE_ANYWHERE); 24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_parentNode(ISimpleDOMNode** node) { 24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!node) 24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node = parent_->ToBrowserAccessibilityWin()->NewReference(); 24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_firstChild(ISimpleDOMNode** node) { 24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!node) 24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (children_.empty()) { 24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node = NULL; 24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *node = children_[0]->ToBrowserAccessibilityWin()->NewReference(); 24842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return S_OK; 24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_lastChild(ISimpleDOMNode** node) { 24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!node) 24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (children_.empty()) { 24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node = NULL; 24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *node = (*children_.rbegin())->ToBrowserAccessibilityWin()->NewReference(); 25002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return S_OK; 25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_previousSibling( 25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ISimpleDOMNode** node) { 25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!node) 25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!parent_ || index_in_parent_ <= 0) { 25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node = NULL; 25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *node = parent_->children()[index_in_parent_ - 1]-> 25172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ToBrowserAccessibilityWin()->NewReference(); 25182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return S_OK; 25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nextSibling(ISimpleDOMNode** node) { 25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!node) 25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!parent_ || 25292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) index_in_parent_ < 0 || 25302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) index_in_parent_ >= static_cast<int>(parent_->children().size()) - 1) { 25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node = NULL; 25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *node = parent_->children()[index_in_parent_ + 1]-> 25362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ToBrowserAccessibilityWin()->NewReference(); 25372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return S_OK; 25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_childAt( 25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int child_index, 25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ISimpleDOMNode** node) { 25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!node) 25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (child_index < children_.size()) { 25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node = NULL; 25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *node = children_[child_index]->ToBrowserAccessibilityWin()->NewReference(); 25552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return S_OK; 25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ISimpleDOMText methods. 25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_domText(BSTR* dom_text) { 25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dom_text) 25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (name_.empty()) 25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *dom_text = SysAllocString(name_.c_str()); 25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(*dom_text); 25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IServiceProvider methods. 25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::QueryService(REFGUID guidService, 25822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) REFIID riid, 25832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void** object) { 25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (guidService == GUID_IAccessibleContentDocument) { 25882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Special Mozilla extension: return the accessible for the root document. 25892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Screen readers use this to distinguish between a document loaded event 25902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // on the root document vs on an iframe. 25912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return manager_->GetRoot()->ToBrowserAccessibilityWin()->QueryInterface( 25922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IID_IAccessible2, object); 25932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 25942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (guidService == IID_IAccessible || 25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessible2 || 25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessibleAction || 2598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) guidService == IID_IAccessibleApplication || 25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessibleHyperlink || 26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessibleHypertext || 26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessibleImage || 26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessibleTable || 26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessibleTable2 || 26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessibleTableCell || 26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessibleText || 26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessibleValue || 26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_ISimpleDOMDocument || 26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_ISimpleDOMNode || 26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_ISimpleDOMText || 26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == GUID_ISimpleDOM) { 26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return QueryInterface(riid, object); 26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We only support the IAccessibleEx interface on Windows 8 and above. This 26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is needed for the on-screen Keyboard to show up in metro mode, when the 26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // user taps an editable portion on the page. 26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // All methods in the IAccessibleEx interface are unimplemented. 26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (riid == IID_IAccessibleEx && 26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::GetVersion() >= base::win::VERSION_WIN8) { 26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return QueryInterface(riid, object); 26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *object = NULL; 26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::GetPatternProvider(PATTERNID id, 26282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IUnknown** provider) { 26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "In Function: " 26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << __FUNCTION__ 26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " for pattern id: " 26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << id; 26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (id == UIA_ValuePatternId || id == UIA_TextPatternId) { 26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsEditableText()) { 26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The BrowserAccessibilityManager keeps track of instances when 26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we don't want to show the on-screen keyboard. 26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!manager_->IsOSKAllowed(GetGlobalBoundsRect())) 26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Returning UIA text provider"; 26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::UIATextProvider::CreateTextProvider(true, provider); 26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::GetPropertyValue(PROPERTYID id, 26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VARIANT* ret) { 26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "In Function: " 26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << __FUNCTION__ 26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " for property id: " 26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << id; 26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) V_VT(ret) = VT_EMPTY; 26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (id == UIA_ControlTypePropertyId) { 26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsEditableText()) { 26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) V_VT(ret) = VT_I4; 26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->lVal = UIA_EditControlTypeId; 26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Returning Edit control type"; 26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Returning empty control type"; 26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CComObjectRootEx methods. 26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT WINAPI BrowserAccessibilityWin::InternalQueryInterface( 26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* this_ptr, 26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const _ATL_INTMAP_ENTRY* entries, 26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) REFIID iid, 26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void** object) { 26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iid == IID_IAccessibleImage) { 26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_role_ != ROLE_SYSTEM_GRAPHIC) { 26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *object = NULL; 26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOINTERFACE; 26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (iid == IID_IAccessibleTable || iid == IID_IAccessibleTable2) { 26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_role_ != ROLE_SYSTEM_TABLE) { 26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *object = NULL; 26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOINTERFACE; 26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (iid == IID_IAccessibleTableCell) { 26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_role_ != ROLE_SYSTEM_CELL) { 26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *object = NULL; 26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOINTERFACE; 26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (iid == IID_IAccessibleValue) { 26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_role_ != ROLE_SYSTEM_PROGRESSBAR && 26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ != ROLE_SYSTEM_SCROLLBAR && 26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ != ROLE_SYSTEM_SLIDER) { 26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *object = NULL; 26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOINTERFACE; 26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (iid == IID_ISimpleDOMDocument) { 26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_role_ != ROLE_SYSTEM_DOCUMENT) { 27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *object = NULL; 27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOINTERFACE; 27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CComObjectRootBase::InternalQueryInterface( 27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this_ptr, entries, iid, object); 27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Private methods. 27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Initialize this object and mark it as active. 27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserAccessibilityWin::PreInitialize() { 27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibility::PreInitialize(); 27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitRoleAndState(); 27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expose the "display" and "tag" attributes. 27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringAttributeToIA2(AccessibilityNodeData::ATTR_DISPLAY, "display"); 27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringAttributeToIA2(AccessibilityNodeData::ATTR_HTML_TAG, "tag"); 27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringAttributeToIA2(AccessibilityNodeData::ATTR_ROLE, "xml-roles"); 27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Expose "level" attribute for headings, trees, etc. 27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IntAttributeToIA2(AccessibilityNodeData::ATTR_HIERARCHICAL_LEVEL, "level"); 27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expose the set size and position in set for listbox options. 27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (role_ == AccessibilityNodeData::ROLE_LISTBOX_OPTION && 27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent_ && 27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent_->role() == AccessibilityNodeData::ROLE_LISTBOX) { 27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_attributes_.push_back( 27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"setsize:" + base::IntToString16(parent_->child_count())); 27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_attributes_.push_back( 27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"setsize:" + base::IntToString16(index_in_parent_ + 1)); 27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ia_role_ == ROLE_SYSTEM_CHECKBUTTON || 27382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia_role_ == ROLE_SYSTEM_RADIOBUTTON || 27392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia2_role_ == IA2_ROLE_TOGGLE_BUTTON) { 27402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia2_attributes_.push_back(L"checkable:true"); 27412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 27422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expose live region attributes. 27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringAttributeToIA2(AccessibilityNodeData::ATTR_LIVE_STATUS, "live"); 27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringAttributeToIA2(AccessibilityNodeData::ATTR_LIVE_RELEVANT, "relevant"); 27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BoolAttributeToIA2(AccessibilityNodeData::ATTR_LIVE_ATOMIC, "atomic"); 27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BoolAttributeToIA2(AccessibilityNodeData::ATTR_LIVE_BUSY, "busy"); 27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expose container live region attributes. 27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringAttributeToIA2(AccessibilityNodeData::ATTR_CONTAINER_LIVE_STATUS, 27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "container-live"); 27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringAttributeToIA2(AccessibilityNodeData::ATTR_CONTAINER_LIVE_RELEVANT, 27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "container-relevant"); 27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BoolAttributeToIA2(AccessibilityNodeData::ATTR_CONTAINER_LIVE_ATOMIC, 27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "container-atomic"); 27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BoolAttributeToIA2(AccessibilityNodeData::ATTR_CONTAINER_LIVE_BUSY, 27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "container-busy"); 27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expose slider value. 27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_role_ == ROLE_SYSTEM_PROGRESSBAR || 27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ == ROLE_SYSTEM_SCROLLBAR || 27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ == ROLE_SYSTEM_SLIDER) { 27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float fval; 27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value_.empty() && 27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetFloatAttribute(AccessibilityNodeData::ATTR_VALUE_FOR_RANGE, &fval)) { 27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Use ICU to localize this? 27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value_ = UTF8ToUTF16(base::DoubleToString(fval)); 27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_attributes_.push_back(L"valuetext:" + value_); 27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Expose color well value. 27732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ia2_role_ == IA2_ROLE_COLOR_CHOOSER) { 27742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int r, g, b; 27752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetIntAttribute(AccessibilityNodeData::ATTR_COLOR_VALUE_RED, &r); 27762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetIntAttribute(AccessibilityNodeData::ATTR_COLOR_VALUE_GREEN, &g); 27772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetIntAttribute(AccessibilityNodeData::ATTR_COLOR_VALUE_BLUE, &b); 27782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value_ = base::IntToString16((r * 100) / 255) + L"% red " + 27792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::IntToString16((g * 100) / 255) + L"% green " + 27802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::IntToString16((b * 100) / 255) + L"% blue"; 27812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 27822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expose table cell index. 27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_role_ == ROLE_SYSTEM_CELL) { 27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibility* table = parent(); 27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (table && table->role() != AccessibilityNodeData::ROLE_TABLE) 27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) table = table->parent(); 27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (table) { 27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<int32>& unique_cell_ids = table->unique_cell_ids(); 27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < unique_cell_ids.size(); ++i) { 27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unique_cell_ids[i] == renderer_id_) { 27922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia2_attributes_.push_back( 27932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16(L"table-cell-index:") + base::IntToString16(i)); 27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The calculation of the accessible name of an element has been 28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // standardized in the HTML to Platform Accessibility APIs Implementation 28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Guide (http://www.w3.org/TR/html-aapi/). In order to return the 28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // appropriate accessible name on Windows, we need to apply some logic 28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to the fields we get from WebKit. 28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): move most of this logic into WebKit. 28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebKit gives us: 28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // name: the default name, e.g. inner text 28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // title ui element: a reference to a <label> element on the same 28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // page that labels this node. 28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // description: accessible labels that override the default name: 28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // aria-label or aria-labelledby or aria-describedby 28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // help: the value of the "title" attribute 28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On Windows, the logic we apply lets some fields take precedence and 28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // always returns the primary name in "name" and the secondary name, 28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if any, in "description". 28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 description, help, title_attr; 28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int title_elem_id = 0; 28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetIntAttribute(AccessibilityNodeData::ATTR_TITLE_UI_ELEMENT, &title_elem_id); 28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetStringAttribute(AccessibilityNodeData::ATTR_DESCRIPTION, &description); 28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetStringAttribute(AccessibilityNodeData::ATTR_HELP, &help); 28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebKit annoyingly puts the title in the description if there's no other 28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // description, which just confuses the rest of the logic. Put it back. 28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now "help" is always the value of the "title" attribute, if present. 28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetHtmlAttribute("title", &title_attr) && 28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) description == title_attr && 28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) help.empty()) { 28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) help = description; 28332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) description.clear(); 28342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string_attributes_[AccessibilityNodeData::ATTR_DESCRIPTION].clear(); 28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string_attributes_[AccessibilityNodeData::ATTR_HELP] = help; 28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now implement the main logic: the descripion should become the name if 28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it's nonempty, and the help should become the description if 28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // there's no description - or the name if there's no name or description. 28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!description.empty()) { 28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name_ = description; 28432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) description.clear(); 28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string_attributes_[AccessibilityNodeData::ATTR_DESCRIPTION] = description; 28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!help.empty() && description.empty()) { 28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) description = help; 28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string_attributes_[AccessibilityNodeData::ATTR_DESCRIPTION] = help; 28492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string_attributes_[AccessibilityNodeData::ATTR_HELP].clear(); 28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!description.empty() && name_.empty() && !title_elem_id) { 28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name_ = description; 28532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) description.clear(); 28542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string_attributes_[AccessibilityNodeData::ATTR_DESCRIPTION].clear(); 28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If it's a text field, also consider the placeholder. 28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 placeholder; 28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (role_ == AccessibilityNodeData::ROLE_TEXT_FIELD && 28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HasState(AccessibilityNodeData::STATE_FOCUSABLE) && 28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetHtmlAttribute("placeholder", &placeholder)) { 28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (name_.empty() && !title_elem_id) { 28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name_ = placeholder; 28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (description.empty()) { 28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) description = placeholder; 28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string_attributes_[AccessibilityNodeData::ATTR_DESCRIPTION] = description; 28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // On Windows, the value of a document should be its url. 28712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (role_ == AccessibilityNodeData::ROLE_ROOT_WEB_AREA || 28722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) role_ == AccessibilityNodeData::ROLE_WEB_AREA) { 28732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetStringAttribute(AccessibilityNodeData::ATTR_DOC_URL, &value_); 28742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 28752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For certain roles (listbox option, static text, and list marker) 28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebKit stores the main accessible text in the "value" - swap it so 28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that it's the "name". 28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (name_.empty() && 28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (role_ == AccessibilityNodeData::ROLE_LISTBOX_OPTION || 28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role_ == AccessibilityNodeData::ROLE_STATIC_TEXT || 28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role_ == AccessibilityNodeData::ROLE_LIST_MARKER)) { 28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name_.swap(value_); 28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this doesn't have a value and is linked then set its value to the url 28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // attribute. This allows screen readers to read an empty link's destination. 28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 url; 28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value_.empty() && (ia_state_ & STATE_SYSTEM_LINKED)) 28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetStringAttribute(AccessibilityNodeData::ATTR_URL, &value_); 28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear any old relationships between this node and other nodes. 28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < relations_.size(); ++i) 28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relations_[i]->Release(); 28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relations_.clear(); 28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handle title UI element. 28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (title_elem_id) { 28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add a labelled by relationship. 29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CComObject<BrowserAccessibilityRelation>* relation; 29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HRESULT hr = CComObject<BrowserAccessibilityRelation>::CreateInstance( 29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &relation); 29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(SUCCEEDED(hr)); 29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relation->AddRef(); 29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relation->Initialize(this, IA2_RELATION_LABELLED_BY); 29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relation->AddTarget(title_elem_id); 29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relations_.push_back(relation); 29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserAccessibilityWin::PostInitialize() { 29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibility::PostInitialize(); 29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Construct the hypertext for this node. 29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hyperlink_offset_to_index_.clear(); 29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hyperlinks_.clear(); 29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hypertext_.clear(); 29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned int i = 0; i < children().size(); ++i) { 29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibility* child = children()[i]; 29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (child->role() == AccessibilityNodeData::ROLE_STATIC_TEXT) { 29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hypertext_ += child->name(); 29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hyperlink_offset_to_index_[hypertext_.size()] = hyperlinks_.size(); 29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hypertext_ += kEmbeddedCharacter; 29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hyperlinks_.push_back(i); 29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(hyperlink_offset_to_index_.size(), hyperlinks_.size()); 29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fire an event when an alert first appears. 29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (role_ == AccessibilityNodeData::ROLE_ALERT && first_time_) 29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->NotifyAccessibilityEvent(AccessibilityNotificationAlert, this); 29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fire events if text has changed. 29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 text = TextForIAccessibleText(); 29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (previous_text_ != text) { 29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!previous_text_.empty() && !text.empty()) { 29385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->NotifyAccessibilityEvent( 29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNotificationObjectShow, this); 29405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Look into HIDE events, too. 29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_text_ = previous_text_; 29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) previous_text_ = text; 29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fire events if the state has changed. 29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!first_time_ && ia_state_ != old_ia_state_) { 295090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) BrowserAccessibilityManagerWin* manager = 295190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) manager_->ToBrowserAccessibilityManagerWin(); 295290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Normally focus events are handled elsewhere, however 29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // focus for managed descendants is platform-specific. 29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fire a focus event if the focused descendant in a multi-select 29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // list box changes. 29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (role_ == AccessibilityNodeData::ROLE_LISTBOX_OPTION && 29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ia_state_ & STATE_SYSTEM_FOCUSABLE) && 29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ia_state_ & STATE_SYSTEM_SELECTABLE) && 29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ia_state_ & STATE_SYSTEM_FOCUSED) && 29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !(old_ia_state_ & STATE_SYSTEM_FOCUSED)) { 296290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) manager->MaybeCallNotifyWinEvent(EVENT_OBJECT_FOCUS, unique_id_win()); 29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ia_state_ & STATE_SYSTEM_SELECTED) && 29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !(old_ia_state_ & STATE_SYSTEM_SELECTED)) { 296790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) manager->MaybeCallNotifyWinEvent(EVENT_OBJECT_SELECTIONADD, 296890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) unique_id_win()); 29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (!(ia_state_ & STATE_SYSTEM_SELECTED) && 29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (old_ia_state_ & STATE_SYSTEM_SELECTED)) { 297190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) manager->MaybeCallNotifyWinEvent(EVENT_OBJECT_SELECTIONREMOVE, 297290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) unique_id_win()); 29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_ia_state_ = ia_state_; 29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_time_ = false; 29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserAccessibilityWin::NativeAddReference() { 29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddRef(); 29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserAccessibilityWin::NativeReleaseReference() { 29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Release(); 29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserAccessibilityWin::IsNative() const { 29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2993c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void BrowserAccessibilityWin::SetLocation(const gfx::Rect& new_location) { 2994c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BrowserAccessibility::SetLocation(new_location); 299590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) manager_->ToBrowserAccessibilityManagerWin()->MaybeCallNotifyWinEvent( 299690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EVENT_OBJECT_LOCATIONCHANGE, unique_id_win()); 2997c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2998c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserAccessibilityWin* BrowserAccessibilityWin::NewReference() { 30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddRef(); 30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this; 30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserAccessibilityWin* BrowserAccessibilityWin::GetTargetFromChildID( 30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const VARIANT& var_id) { 30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (var_id.vt != VT_I4) 30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG child_id = var_id.lVal; 30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (child_id == CHILDID_SELF) 30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this; 30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (child_id >= 1 && child_id <= static_cast<LONG>(children_.size())) 30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return children_[child_id - 1]->ToBrowserAccessibilityWin(); 30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return manager_->ToBrowserAccessibilityManagerWin()-> 3017c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFromUniqueIdWin(child_id); 30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT BrowserAccessibilityWin::GetStringAttributeAsBstr( 30212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AccessibilityNodeData::StringAttribute attribute, 30222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BSTR* value_bstr) { 30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 str; 30245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetStringAttribute(attribute, &str)) 30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (str.empty()) 30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *value_bstr = SysAllocString(str.c_str()); 30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(*value_bstr); 30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserAccessibilityWin::StringAttributeToIA2( 30382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AccessibilityNodeData::StringAttribute attribute, 30392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* ia2_attr) { 30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 value; 30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetStringAttribute(attribute, &value)) 30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_attributes_.push_back(ASCIIToUTF16(ia2_attr) + L":" + value); 30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserAccessibilityWin::BoolAttributeToIA2( 30462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AccessibilityNodeData::BoolAttribute attribute, 30472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* ia2_attr) { 30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool value; 30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetBoolAttribute(attribute, &value)) { 30505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_attributes_.push_back((ASCIIToUTF16(ia2_attr) + L":") + 30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (value ? L"true" : L"false")); 30525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserAccessibilityWin::IntAttributeToIA2( 30562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AccessibilityNodeData::IntAttribute attribute, 30572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* ia2_attr) { 30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int value; 30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetIntAttribute(attribute, &value)) 30605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_attributes_.push_back(ASCIIToUTF16(ia2_attr) + L":" + 30615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::IntToString16(value)); 30625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const string16& BrowserAccessibilityWin::TextForIAccessibleText() { 30652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (IsEditableText()) 30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value_; 30672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (role_ == AccessibilityNodeData::ROLE_STATIC_TEXT) ? 30682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name_ : hypertext_; 30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserAccessibilityWin::HandleSpecialTextOffset(const string16& text, 30722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* offset) { 30732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (*offset == IA2_TEXT_OFFSET_LENGTH) 30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *offset = static_cast<LONG>(text.size()); 30752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (*offset == IA2_TEXT_OFFSET_CARET) 30765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get_caretOffset(offset); 30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::TextBoundaryType BrowserAccessibilityWin::IA2TextBoundaryToTextBoundary( 30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IA2TextBoundaryType ia2_boundary) { 30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch(ia2_boundary) { 30825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_TEXT_BOUNDARY_CHAR: return ui::CHAR_BOUNDARY; 30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_TEXT_BOUNDARY_WORD: return ui::WORD_BOUNDARY; 30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_TEXT_BOUNDARY_LINE: return ui::LINE_BOUNDARY; 30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_TEXT_BOUNDARY_SENTENCE: return ui::SENTENCE_BOUNDARY; 30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_TEXT_BOUNDARY_PARAGRAPH: return ui::PARAGRAPH_BOUNDARY; 30875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_TEXT_BOUNDARY_ALL: return ui::ALL_BOUNDARY; 30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::CHAR_BOUNDARY; 30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LONG BrowserAccessibilityWin::FindBoundary( 30955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& text, 30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IA2TextBoundaryType ia2_boundary, 30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG start_offset, 30985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TextBoundaryDirection direction) { 30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleSpecialTextOffset(text, &start_offset); 31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TextBoundaryType boundary = IA2TextBoundaryToTextBoundary(ia2_boundary); 31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::FindAccessibleTextBoundary( 31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text, line_breaks_, boundary, start_offset, direction); 31035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserAccessibilityWin* BrowserAccessibilityWin::GetFromRendererID( 31065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 renderer_id) { 31075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return manager_->GetFromRendererID(renderer_id)->ToBrowserAccessibilityWin(); 31085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserAccessibilityWin::InitRoleAndState() { 31115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ = 0; 31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ = IA2_STATE_OPAQUE; 31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_attributes_.clear(); 31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasState(AccessibilityNodeData::STATE_BUSY)) 31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_BUSY; 31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasState(AccessibilityNodeData::STATE_CHECKED)) 31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_CHECKED; 31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasState(AccessibilityNodeData::STATE_COLLAPSED)) 31205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_COLLAPSED; 31215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasState(AccessibilityNodeData::STATE_EXPANDED)) 31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_EXPANDED; 31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasState(AccessibilityNodeData::STATE_FOCUSABLE)) 31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_FOCUSABLE; 31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasState(AccessibilityNodeData::STATE_HASPOPUP)) 31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_HASPOPUP; 31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasState(AccessibilityNodeData::STATE_HOTTRACKED)) 31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_HOTTRACKED; 31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasState(AccessibilityNodeData::STATE_INDETERMINATE)) 31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_INDETERMINATE; 31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasState(AccessibilityNodeData::STATE_INVISIBLE)) 31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_INVISIBLE; 31335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasState(AccessibilityNodeData::STATE_LINKED)) 31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_LINKED; 31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasState(AccessibilityNodeData::STATE_MULTISELECTABLE)) { 31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_EXTSELECTABLE; 31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_MULTISELECTABLE; 31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(ctguil): Support STATE_SYSTEM_EXTSELECTABLE/accSelect. 31405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasState(AccessibilityNodeData::STATE_OFFSCREEN)) 31415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_OFFSCREEN; 31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasState(AccessibilityNodeData::STATE_PRESSED)) 31435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_PRESSED; 31445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasState(AccessibilityNodeData::STATE_PROTECTED)) 31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_PROTECTED; 31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasState(AccessibilityNodeData::STATE_REQUIRED)) 31475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_REQUIRED; 31485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasState(AccessibilityNodeData::STATE_SELECTABLE)) 31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_SELECTABLE; 31505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasState(AccessibilityNodeData::STATE_SELECTED)) 31515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_SELECTED; 31525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasState(AccessibilityNodeData::STATE_TRAVERSED)) 31535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_TRAVERSED; 31545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasState(AccessibilityNodeData::STATE_UNAVAILABLE)) 31555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_UNAVAILABLE; 31565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasState(AccessibilityNodeData::STATE_VERTICAL)) { 31575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_VERTICAL; 31585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 31595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_HORIZONTAL; 31605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasState(AccessibilityNodeData::STATE_VISITED)) 31625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_TRAVERSED; 31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebKit marks everything as readonly unless it's editable text, so if it's 31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // not readonly, mark it as editable now. The final computation of the 31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // READONLY state for MSAA is below, after the switch. 31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!HasState(AccessibilityNodeData::STATE_READONLY)) 31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_EDITABLE; 31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 invalid; 31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetHtmlAttribute("aria-invalid", &invalid)) 31725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_INVALID_ENTRY; 31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool mixed = false; 31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetBoolAttribute(AccessibilityNodeData::ATTR_BUTTON_MIXED, &mixed); 31765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mixed) 31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_MIXED; 31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool editable = false; 31805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetBoolAttribute(AccessibilityNodeData::ATTR_CAN_SET_VALUE, &editable); 31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (editable) 31825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_EDITABLE; 31835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 html_tag; 31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetStringAttribute(AccessibilityNodeData::ATTR_HTML_TAG, &html_tag); 31865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = 0; 31875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = 0; 31885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (role_) { 31895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_ALERT: 31905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_ALERT; 31915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 31925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_ALERT_DIALOG: 31935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_DIALOG; 31945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 31955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_APPLICATION: 31965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_APPLICATION; 31975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 31985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_ARTICLE: 31995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_GROUPING; 32005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_SECTION; 32015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 32025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 32035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_BUSY_INDICATOR: 32045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_ANIMATION; 32055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 32065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 32075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_BUTTON: 32085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_PUSHBUTTON; 32095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_aria_pressed_defined; 32105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_mixed; 32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetAriaTristate("aria-pressed", &is_aria_pressed_defined, &is_mixed)) 32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_PRESSED; 32135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_aria_pressed_defined) 32145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_TOGGLE_BUTTON; 32155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_mixed) 32165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_MIXED; 32175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 32185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_CANVAS: 32195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_GRAPHIC; 32205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 32215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_CANVAS_WITH_FALLBACK_CONTENT: 32225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role_name_ = L"canvas"; 32235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_CANVAS; 32245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 32255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_CELL: 32265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_CELL; 32275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 32285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_CHECKBOX: 32295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_CHECKBUTTON; 32305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 32315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_COLOR_WELL: 32325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_CLIENT; 32335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_COLOR_CHOOSER; 32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_COLUMN: 32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_COLUMN; 32375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_COLUMN_HEADER: 32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_COLUMNHEADER; 32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 32425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_COMBO_BOX: 32445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_COMBOBOX; 32455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 32465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_DIV: 32475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role_name_ = L"div"; 32485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_SECTION; 32495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 32502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case AccessibilityNodeData::ROLE_DEFINITION: 32515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role_name_ = html_tag; 32525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_PARAGRAPH; 32535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 32545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 32552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case AccessibilityNodeData::ROLE_DESCRIPTION_LIST_DETAIL: 32562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) role_name_ = html_tag; 32572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia2_role_ = IA2_ROLE_PARAGRAPH; 32582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 32592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 32602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case AccessibilityNodeData::ROLE_DESCRIPTION_LIST_TERM: 32615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_LISTITEM; 32625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 32635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 32645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_DIALOG: 32655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_DIALOG; 32665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 32675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 32685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_DISCLOSURE_TRIANGLE: 32695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_OUTLINEBUTTON; 32705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 32715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 32725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_DOCUMENT: 32735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_ROOT_WEB_AREA: 32745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_WEB_AREA: 32755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_DOCUMENT; 32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 32775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_FOCUSABLE; 32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_EDITABLE_TEXT: 32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_TEXT; 32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_SINGLE_LINE; 32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_EDITABLE; 32835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 32845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_FORM: 32855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role_name_ = L"form"; 32865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_FORM; 32875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 32885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_FOOTER: 32895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = IA2_ROLE_FOOTER; 32905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 32915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 32925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_GRID: 32935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_TABLE; 32945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 32955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 32965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_GROUP: { 32975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 aria_role; 32985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetStringAttribute(AccessibilityNodeData::ATTR_ROLE, &aria_role); 32995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (aria_role == L"group" || html_tag == L"fieldset") { 33005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_GROUPING; 33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (html_tag == L"li") { 33025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_LISTITEM; 33035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 33045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (html_tag.empty()) 33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role_name_ = L"div"; 33065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role_name_ = html_tag; 33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_SECTION; 33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_GROW_AREA: 33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_GRIP; 33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 33165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_HEADING: 33185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role_name_ = html_tag; 33195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_HEADING; 33205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 33215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_HORIZONTAL_RULE: 33235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_SEPARATOR; 33245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_IMAGE: 33265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_GRAPHIC; 33275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 33285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_IMAGE_MAP: 33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role_name_ = html_tag; 33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_IMAGE_MAP; 33325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 33335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_IMAGE_MAP_LINK: 33355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_LINK; 33365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_LINKED; 33375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 33385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_LABEL: 33405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_TEXT; 33415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_LABEL; 33425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_LANDMARK_APPLICATION: 33445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_LANDMARK_BANNER: 33455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_LANDMARK_COMPLEMENTARY: 33465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_LANDMARK_CONTENTINFO: 33475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_LANDMARK_MAIN: 33485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_LANDMARK_NAVIGATION: 33495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_LANDMARK_SEARCH: 33505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_GROUPING; 33515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_SECTION; 33525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 33535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_LINK: 33555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_WEBCORE_LINK: 33565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_LINK; 33575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_LINKED; 33585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_LIST: 33605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_LIST; 33615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 33625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_LISTBOX: 33645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_LIST; 33655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_LISTBOX_OPTION: 33675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_LISTITEM; 33685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_state_ & STATE_SYSTEM_SELECTABLE) { 33695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_FOCUSABLE; 33705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasState(AccessibilityNodeData::STATE_FOCUSED)) 33715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_FOCUSED; 33725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_LIST_ITEM: 33755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_LISTITEM; 33765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 33775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_LIST_MARKER: 33795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_TEXT; 33805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 33815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_MATH: 33835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_EQUATION; 33845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 33855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_MENU: 33875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_MENU_BUTTON: 33885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_MENUPOPUP; 33895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_MENU_BAR: 33915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_MENUBAR; 33925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_MENU_ITEM: 33945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_MENUITEM; 33955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_MENU_LIST_POPUP: 33975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_CLIENT; 33985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_MENU_LIST_OPTION: 34005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_LISTITEM; 34015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_state_ & STATE_SYSTEM_SELECTABLE) { 34025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_FOCUSABLE; 34035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasState(AccessibilityNodeData::STATE_FOCUSED)) 34045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_FOCUSED; 34055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_NOTE: 34085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_GROUPING; 34095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_NOTE; 34105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_OUTLINE: 34135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_OUTLINE; 34145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_PARAGRAPH: 34175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role_name_ = L"P"; 34185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_PARAGRAPH; 34195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_POPUP_BUTTON: 34215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (html_tag == L"select") { 34225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_COMBOBOX; 34235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 34245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_BUTTONMENU; 34255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_PROGRESS_INDICATOR: 34285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_PROGRESSBAR; 34295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_RADIO_BUTTON: 34325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_RADIOBUTTON; 34335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_RADIO_GROUP: 34355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_GROUPING; 34365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_SECTION; 34375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_REGION: 34395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_GROUPING; 34405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_SECTION; 34415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_ROW: 34445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_ROW; 34455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_ROW_HEADER: 34485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_ROWHEADER; 34495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_RULER: 34525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_CLIENT; 34535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_RULER; 34545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_SCROLLAREA: 34575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_CLIENT; 34585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_SCROLL_PANE; 34595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_SCROLLBAR: 34625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_SCROLLBAR; 34635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_SLIDER: 34655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_SLIDER; 34665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_SPIN_BUTTON: 34685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_SPINBUTTON; 34695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_SPIN_BUTTON_PART: 34715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_PUSHBUTTON; 34725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_SPLIT_GROUP: 34745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_CLIENT; 34755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_SPLIT_PANE; 34765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_ANNOTATION: 34795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_STATIC_TEXT: 34805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_TEXT; 34815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_STATUS: 34845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_STATUSBAR; 34855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_SPLITTER: 34885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_SEPARATOR; 34895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case AccessibilityNodeData::ROLE_SVG_ROOT: 34912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia_role_ = ROLE_SYSTEM_GRAPHIC; 34922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 34935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_TAB: 34945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_PAGETAB; 34955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case AccessibilityNodeData::ROLE_TABLE: { 34972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16 aria_role; 34982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetStringAttribute(AccessibilityNodeData::ATTR_ROLE, &aria_role); 34992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (aria_role == L"treegrid") { 35002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia_role_ = ROLE_SYSTEM_OUTLINE; 35012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 35022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia_role_ = ROLE_SYSTEM_TABLE; 35032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 35042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 35055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 35075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_TABLE_HEADER_CONTAINER: 35085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_GROUPING; 35095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_SECTION; 35105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 35115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_TAB_GROUP_UNUSED: 35135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 35145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_PAGETABLIST; 35155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_TAB_LIST: 35175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_PAGETABLIST; 35185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_TAB_PANEL: 35205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_PROPERTYPAGE; 35215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_TOGGLE_BUTTON: 35235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_PUSHBUTTON; 35245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_TOGGLE_BUTTON; 35255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_TEXTAREA: 35275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_TEXT; 35285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_MULTI_LINE; 35295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_EDITABLE; 35305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_SELECTABLE_TEXT; 35315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_TEXT_FIELD: 35335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_TEXT; 35345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_SINGLE_LINE; 35355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_EDITABLE; 35365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_SELECTABLE_TEXT; 35375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_TIMER: 35395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_CLOCK; 35405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 35415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_TOOLBAR: 35435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_TOOLBAR; 35445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 35455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_TOOLTIP: 35475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_TOOLTIP; 35485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 35495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_TREE: 35515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_OUTLINE; 35525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 35535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_TREE_GRID: 35555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_OUTLINE; 35565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 35575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_TREE_ITEM: 35595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_OUTLINEITEM; 35605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 35615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_WINDOW: 35635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_WINDOW; 35645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): figure out the proper MSAA role for all of these. 35675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_BROWSER: 35685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_DIRECTORY: 35695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_DRAWER: 35705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_HELP_TAG: 35715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_IGNORED: 35725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_INCREMENTOR: 35735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_LOG: 35745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_MARQUEE: 35755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_MATTE: 35765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_PRESENTATIONAL: 35775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_RULER_MARKER: 35785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_SHEET: 35795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_SLIDER_THUMB: 35805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_SYSTEM_WIDE: 35815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AccessibilityNodeData::ROLE_VALUE_INDICATOR: 35825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 35835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_CLIENT; 35845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Compute the final value of READONLY for MSAA. 35885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 35895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We always set the READONLY state for elements that have the 35905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // aria-readonly attribute and for a few roles (in the switch above). 35915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We clear the READONLY state on focusable controls and on a document. 35925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Everything else, the majority of objects, do not have this state set. 35935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasState(AccessibilityNodeData::STATE_FOCUSABLE) && 35945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ != ROLE_SYSTEM_DOCUMENT) { 35955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ &= ~(STATE_SYSTEM_READONLY); 35965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!HasState(AccessibilityNodeData::STATE_READONLY)) 35985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ &= ~(STATE_SYSTEM_READONLY); 35995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool aria_readonly = false; 36005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetBoolAttribute(AccessibilityNodeData::ATTR_ARIA_READONLY, &aria_readonly); 36015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (aria_readonly) 36025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 36035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The role should always be set. 36055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!role_name_.empty() || ia_role_); 36065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we didn't explicitly set the IAccessible2 role, make it the same 36085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as the MSAA role. 36095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ia2_role_) 36105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = ia_role_; 36115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 3614