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