browser_accessibility_win.cc revision 0f1bc08d4cfcc34181b0b5cbf065c40f687bf740
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/accessibility/browser_accessibility_win.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <UIAutomationClient.h> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <UIAutomationCoreApi.h> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/strings/string_split.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/enum_variant.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/scoped_comptr.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/windows_version.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/accessibility/browser_accessibility_manager_win.h" 18d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "content/browser/accessibility/browser_accessibility_state_impl.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/accessibility_messages.h" 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/common/content_client.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/accessibility/accessible_text_utils.h" 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/base/win/accessibility_ids_win.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/win/accessibility_misc_utils.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// These nonstandard GUIDs are taken directly from the Mozilla sources 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// (accessible/src/msaa/nsAccessNodeWrap.cpp); some documentation is here: 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://developer.mozilla.org/en/Accessibility/AT-APIs/ImplementationFeatures/MSAA 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GUID GUID_ISimpleDOM = { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x0c539790, 0x12e4, 0x11cf, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0xb6, 0x61, 0x00, 0xaa, 0x00, 0x4c, 0xd6, 0xd8}; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const GUID GUID_IAccessibleContentDocument = { 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0xa5d8e1f3, 0x3571, 0x4d8f, 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0x95, 0x21, 0x07, 0xed, 0x28, 0xfb, 0x07, 0x2e}; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char16 BrowserAccessibilityWin::kEmbeddedCharacter[] = L"\xfffc"; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)LONG BrowserAccessibilityWin::next_unique_id_win_ = 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::win::kFirstBrowserAccessibilityManagerAccessibilityId; 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BrowserAccessibilityRelation 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A simple implementation of IAccessibleRelation, used to represent 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a relationship between two accessible nodes in the tree. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserAccessibilityRelation 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public CComObjectRootEx<CComMultiThreadModel>, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public IAccessibleRelation { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BEGIN_COM_MAP(BrowserAccessibilityRelation) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COM_INTERFACE_ENTRY(IAccessibleRelation) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) END_COM_MAP() 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_EXPORT BrowserAccessibilityRelation() {} 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_EXPORT virtual ~BrowserAccessibilityRelation() {} 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_EXPORT void Initialize(BrowserAccessibilityWin* owner, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& type); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_EXPORT void AddTarget(int target_id); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IAccessibleRelation methods. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_EXPORT STDMETHODIMP get_relationType(BSTR* relation_type); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_EXPORT STDMETHODIMP get_nTargets(long* n_targets); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_EXPORT STDMETHODIMP get_target(long target_index, IUnknown** target); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_EXPORT STDMETHODIMP get_targets(long max_targets, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IUnknown** targets, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* n_targets); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IAccessibleRelation methods not implemented. 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_EXPORT STDMETHODIMP get_localizedRelationType(BSTR* relation_type) { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 type_; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::ScopedComPtr<BrowserAccessibilityWin> owner_; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<int> target_ids_; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserAccessibilityRelation::Initialize(BrowserAccessibilityWin* owner, 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& type) { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) owner_ = owner; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type_ = type; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserAccessibilityRelation::AddTarget(int target_id) { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_ids_.push_back(target_id); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityRelation::get_relationType( 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* relation_type) { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!relation_type) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!owner_->instance_active()) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *relation_type = SysAllocString(type_.c_str()); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(*relation_type); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityRelation::get_nTargets(long* n_targets) { 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!n_targets) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!owner_->instance_active()) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_targets = static_cast<long>(target_ids_.size()); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityManager* manager = owner_->manager(); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (long i = *n_targets - 1; i >= 0; --i) { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibility* result = manager->GetFromRendererID(target_ids_[i]); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result || !result->instance_active()) { 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_targets = 0; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityRelation::get_target(long target_index, 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IUnknown** target) { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!owner_->instance_active()) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (target_index < 0 || 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_index >= static_cast<long>(target_ids_.size())) { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityManager* manager = owner_->manager(); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibility* result = 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager->GetFromRendererID(target_ids_[target_index]); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result || !result->instance_active()) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *target = static_cast<IAccessible*>( 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result->ToBrowserAccessibilityWin()->NewReference()); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityRelation::get_targets(long max_targets, 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IUnknown** targets, 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* n_targets) { 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!targets || !n_targets) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!owner_->instance_active()) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long count = static_cast<long>(target_ids_.size()); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (count > max_targets) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) count = max_targets; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_targets = count; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (count == 0) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (long i = 0; i < count; ++i) { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HRESULT result = get_target(i, &targets[i]); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result != S_OK) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BrowserAccessibilityWin 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserAccessibility* BrowserAccessibility::Create() { 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CComObject<BrowserAccessibilityWin>* instance; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HRESULT hr = CComObject<BrowserAccessibilityWin>::CreateInstance(&instance); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(SUCCEEDED(hr)); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return instance->NewReference(); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserAccessibilityWin* BrowserAccessibility::ToBrowserAccessibilityWin() { 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<BrowserAccessibilityWin*>(this); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserAccessibilityWin::BrowserAccessibilityWin() 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : ia_role_(0), 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_(0), 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_(0), 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_(0), 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_time_(true), 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_ia_state_(0) { 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Start unique IDs at -1 and decrement each time, because get_accChild 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // uses positive IDs to enumerate children, so we use negative IDs to 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // clearly distinguish between indices and unique IDs. 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) unique_id_win_ = next_unique_id_win_; 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (next_unique_id_win_ == 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::win::kLastBrowserAccessibilityManagerAccessibilityId) { 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) next_unique_id_win_ = 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::win::kFirstBrowserAccessibilityManagerAccessibilityId; 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) next_unique_id_win_--; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserAccessibilityWin::~BrowserAccessibilityWin() { 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < relations_.size(); ++i) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relations_[i]->Release(); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IAccessible methods. 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Conventions: 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Always test for instance_active_ first and return E_FAIL if it's false. 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Always check for invalid arguments first, even if they're unused. 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Return S_FALSE if the only output is a string argument and it's empty. 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT BrowserAccessibilityWin::accDoDefaultAction(VARIANT var_id) { 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->DoDefaultAction(*target); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::accHitTest(LONG x_left, 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG y_top, 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VARIANT* child) { 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!child) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point point(x_left, y_top); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetGlobalBoundsRect().Contains(point)) { 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return S_FALSE and VT_EMPTY when the outside the object's boundaries. 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->vt = VT_EMPTY; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibility* result = BrowserAccessibilityForPoint(point); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result == this) { 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Point is within this object. 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->vt = VT_I4; 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->lVal = CHILDID_SELF; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->vt = VT_DISPATCH; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->pdispVal = result->ToBrowserAccessibilityWin()->NewReference(); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::accLocation(LONG* x_left, 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* y_top, 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* width, 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* height, 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VARIANT var_id) { 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!x_left || !y_top || !width || !height) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bounds = target->GetGlobalBoundsRect(); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *x_left = bounds.x(); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *y_top = bounds.y(); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *width = bounds.width(); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *height = bounds.height(); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::accNavigate(LONG nav_dir, 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VARIANT start, 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VARIANT* end) { 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(start); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((nav_dir == NAVDIR_LASTCHILD || nav_dir == NAVDIR_FIRSTCHILD) && 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start.lVal != CHILDID_SELF) { 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MSAA states that navigating to first/last child can only be from self. 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibility* result = NULL; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (nav_dir) { 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NAVDIR_DOWN: 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NAVDIR_UP: 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NAVDIR_LEFT: 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NAVDIR_RIGHT: 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These directions are not implemented, matching Mozilla and IE. 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NAVDIR_FIRSTCHILD: 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target->children_.empty()) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = target->children_.front(); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NAVDIR_LASTCHILD: 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target->children_.empty()) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = target->children_.back(); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NAVDIR_NEXT: 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = target->GetNextSibling(); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NAVDIR_PREVIOUS: 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = target->GetPreviousSibling(); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result) { 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end->vt = VT_EMPTY; 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end->vt = VT_DISPATCH; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end->pdispVal = result->ToBrowserAccessibilityWin()->NewReference(); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accChild(VARIANT var_child, 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDispatch** disp_child) { 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!disp_child) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *disp_child = NULL; 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_child); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*disp_child) = target->NewReference(); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accChildCount(LONG* child_count) { 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!child_count) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) *child_count = PlatformChildCount(); 3620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accDefaultAction(VARIANT var_id, 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* def_action) { 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!def_action) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return target->GetStringAttributeAsBstr( 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_SHORTCUT, def_action); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accDescription(VARIANT var_id, 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* desc) { 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!desc) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return target->GetStringAttributeAsBstr( 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_DESCRIPTION, desc); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accFocus(VARIANT* focus_child) { 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!focus_child) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* focus = static_cast<BrowserAccessibilityWin*>( 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->GetFocus(this)); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (focus == this) { 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_child->vt = VT_I4; 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_child->lVal = CHILDID_SELF; 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (focus == NULL) { 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_child->vt = VT_EMPTY; 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_child->vt = VT_DISPATCH; 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_child->pdispVal = focus->NewReference(); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accHelp(VARIANT var_id, BSTR* help) { 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!help) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return target->GetStringAttributeAsBstr( 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_HELP, help); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accKeyboardShortcut(VARIANT var_id, 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* acc_key) { 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!acc_key) 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return target->GetStringAttributeAsBstr( 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_SHORTCUT, acc_key); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accName(VARIANT var_id, BSTR* name) { 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!name) 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string name_str = target->name(); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the name is empty, see if it's labeled by another element. 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (name_str.empty()) { 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int title_elem_id; 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (target->GetIntAttribute(AccessibilityNodeData::ATTR_TITLE_UI_ELEMENT, 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &title_elem_id)) { 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibility* title_elem = 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->GetFromRendererID(title_elem_id); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (title_elem) 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name_str = title_elem->GetTextRecursive(); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (name_str.empty()) 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) *name = SysAllocString(UTF8ToUTF16(name_str).c_str()); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(*name); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accParent(IDispatch** disp_parent) { 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!disp_parent) 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IAccessible* parent = parent_->ToBrowserAccessibilityWin(); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (parent == NULL) { 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This happens if we're the root of the tree; 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // return the IAccessible for the window. 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent = manager_->ToBrowserAccessibilityManagerWin()->parent_iaccessible(); 49790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // |parent| can only be NULL if the manager was created before the parent 49890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // IAccessible was known and it wasn't subsequently set before a client 49990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // requested it. Crash hard if this happens so that we get crash reports. 50090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) CHECK(parent); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent->AddRef(); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *disp_parent = parent; 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accRole(VARIANT var_id, 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VARIANT* role) { 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!role) 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target->role_name_.empty()) { 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role->vt = VT_BSTR; 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role->bstrVal = SysAllocString(target->role_name_.c_str()); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role->vt = VT_I4; 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role->lVal = target->ia_role_; 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accState(VARIANT var_id, 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VARIANT* state) { 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!state) 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state->vt = VT_I4; 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state->lVal = target->ia_state_; 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (manager_->GetFocus(NULL) == this) 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state->lVal |= STATE_SYSTEM_FOCUSED; 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accValue(VARIANT var_id, 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BSTR* value) { 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!value) 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (target->ia_role() == ROLE_SYSTEM_PROGRESSBAR || 5633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) target->ia_role() == ROLE_SYSTEM_SCROLLBAR || 5643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) target->ia_role() == ROLE_SYSTEM_SLIDER) { 5653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) string16 value_text = target->GetValueText(); 5663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) *value = SysAllocString(value_text.c_str()); 5673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK(*value); 5683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return S_OK; 5693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 5703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 5713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Expose color well value. 5723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (target->ia2_role() == IA2_ROLE_COLOR_CHOOSER) { 5733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int r = target->GetIntAttribute( 5743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AccessibilityNodeData::ATTR_COLOR_VALUE_RED); 5753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int g = target->GetIntAttribute( 5763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AccessibilityNodeData::ATTR_COLOR_VALUE_GREEN); 5773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int b = target->GetIntAttribute( 5783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AccessibilityNodeData::ATTR_COLOR_VALUE_BLUE); 5793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) string16 value_text; 5803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) value_text = base::IntToString16((r * 100) / 255) + L"% red " + 5813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::IntToString16((g * 100) / 255) + L"% green " + 5823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::IntToString16((b * 100) / 255) + L"% blue"; 5833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) *value = SysAllocString(value_text.c_str()); 5843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK(*value); 5853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return S_OK; 5863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) *value = SysAllocString(UTF8ToUTF16(target->value()).c_str()); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(*value); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accHelpTopic(BSTR* help_file, 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VARIANT var_id, 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* topic_id) { 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accSelection(VARIANT* selected) { 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (role_ != WebKit::WebAXRoleListBox) 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long selected_count = 0; 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < children_.size(); ++i) { 60858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (children_[i]->HasState(WebKit::WebAXStateSelected)) 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++selected_count; 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (selected_count == 0) { 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected->vt = VT_EMPTY; 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (selected_count == 1) { 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < children_.size(); ++i) { 61958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (children_[i]->HasState(WebKit::WebAXStateSelected)) { 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected->vt = VT_DISPATCH; 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected->pdispVal = 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) children_[i]->ToBrowserAccessibilityWin()->NewReference(); 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Multiple items are selected. 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::EnumVariant* enum_variant = 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new base::win::EnumVariant(selected_count); 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum_variant->AddRef(); 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long index = 0; 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < children_.size(); ++i) { 63458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (children_[i]->HasState(WebKit::WebAXStateSelected)) { 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum_variant->ItemAt(index)->vt = VT_DISPATCH; 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum_variant->ItemAt(index)->pdispVal = 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) children_[i]->ToBrowserAccessibilityWin()->NewReference(); 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++index; 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected->vt = VT_UNKNOWN; 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected->punkVal = static_cast<IUnknown*>( 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<base::win::IUnknownImpl*>(enum_variant)); 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::accSelect( 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG flags_sel, VARIANT var_id) { 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags_sel & SELFLAG_TAKEFOCUS) { 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->SetFocus(this, true); 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IAccessible2 methods. 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::role(LONG* role) { 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!role) 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *role = ia2_role_; 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_attributes(BSTR* attributes) { 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!attributes) 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The iaccessible2 attributes are a set of key-value pairs 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // separated by semicolons, with a colon between the key and the value. 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 str; 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned int i = 0; i < ia2_attributes_.size(); ++i) { 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i != 0) 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) str += L';'; 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) str += ia2_attributes_[i]; 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (str.empty()) 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *attributes = SysAllocString(str.c_str()); 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(*attributes); 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_states(AccessibleStates* states) { 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!states) 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *states = ia2_state_; 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_uniqueID(LONG* unique_id) { 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!unique_id) 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 719c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *unique_id = unique_id_win_; 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_windowHandle(HWND* window_handle) { 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!window_handle) 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *window_handle = manager_->ToBrowserAccessibilityManagerWin()->parent_hwnd(); 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_indexInParent(LONG* index_in_parent) { 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!index_in_parent) 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *index_in_parent = index_in_parent_; 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nRelations(LONG* n_relations) { 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!n_relations) 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_relations = relations_.size(); 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_relation( 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG relation_index, 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IAccessibleRelation** relation) { 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (relation_index < 0 || 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relation_index >= static_cast<long>(relations_.size())) { 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!relation) 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relations_[relation_index]->AddRef(); 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *relation = relations_[relation_index]; 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_relations( 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG max_relations, 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IAccessibleRelation** relations, 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG* n_relations) { 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!relations || !n_relations) 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long count = static_cast<long>(relations_.size()); 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_relations = count; 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (count == 0) 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (long i = 0; i < count; ++i) { 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relations_[i]->AddRef(); 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relations[i] = relations_[i]; 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::scrollTo(enum IA2ScrollType scroll_type) { 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect r = location_; 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch(scroll_type) { 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_SCROLL_TYPE_TOP_LEFT: 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->ScrollToMakeVisible(*this, gfx::Rect(r.x(), r.y(), 0, 0)); 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_SCROLL_TYPE_BOTTOM_RIGHT: 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->ScrollToMakeVisible( 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *this, gfx::Rect(r.right(), r.bottom(), 0, 0)); 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_SCROLL_TYPE_TOP_EDGE: 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->ScrollToMakeVisible( 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *this, gfx::Rect(r.x(), r.y(), r.width(), 0)); 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_SCROLL_TYPE_BOTTOM_EDGE: 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->ScrollToMakeVisible( 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *this, gfx::Rect(r.x(), r.bottom(), r.width(), 0)); 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_SCROLL_TYPE_LEFT_EDGE: 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->ScrollToMakeVisible( 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *this, gfx::Rect(r.x(), r.y(), 0, r.height())); 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_SCROLL_TYPE_RIGHT_EDGE: 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->ScrollToMakeVisible( 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *this, gfx::Rect(r.right(), r.y(), 0, r.height())); 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_SCROLL_TYPE_ANYWHERE: 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->ScrollToMakeVisible(*this, r); 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<BrowserAccessibilityManagerWin*>(manager_) 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ->TrackScrollingObject(this); 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::scrollToPoint( 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum IA2CoordinateType coordinate_type, 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG x, 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG y) { 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point scroll_to(x, y); 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (coordinate_type == IA2_COORDTYPE_SCREEN_RELATIVE) { 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scroll_to -= manager_->GetViewBounds().OffsetFromOrigin(); 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (coordinate_type == IA2_COORDTYPE_PARENT_RELATIVE) { 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (parent_) 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scroll_to += parent_->location().OffsetFromOrigin(); 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->ScrollToPoint(*this, scroll_to); 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<BrowserAccessibilityManagerWin*>(manager_) 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ->TrackScrollingObject(this); 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_groupPosition( 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG* group_level, 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG* similar_items_in_group, 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG* position_in_group) { 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!group_level || !similar_items_in_group || !position_in_group) 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 87558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (role_ == WebKit::WebAXRoleListBoxOption && 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent_ && 87758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) parent_->role() == WebKit::WebAXRoleListBox) { 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *group_level = 0; 8790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) *similar_items_in_group = parent_->PlatformChildCount(); 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *position_in_group = index_in_parent_ + 1; 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 888c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// IAccessibleApplication methods. 889c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 890c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 891c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_appName(BSTR* app_name) { 892c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // No need to check |instance_active_| because this interface is 893c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // global, and doesn't depend on any local state. 894c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 895c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!app_name) 896c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return E_INVALIDARG; 897c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 898eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // GetProduct() returns a string like "Chrome/aa.bb.cc.dd", split out 899eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // the part before the "/". 900eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::vector<std::string> product_components; 901eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::SplitString(GetContentClient()->GetProduct(), '/', &product_components); 902eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK_EQ(2U, product_components.size()); 903eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (product_components.size() != 2) 904eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return E_FAIL; 905eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch *app_name = SysAllocString(UTF8ToUTF16(product_components[0]).c_str()); 906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(*app_name); 907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return *app_name ? S_OK : E_FAIL; 908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 909c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 910c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_appVersion(BSTR* app_version) { 911c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // No need to check |instance_active_| because this interface is 912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // global, and doesn't depend on any local state. 913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!app_version) 915c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return E_INVALIDARG; 916c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 917eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // GetProduct() returns a string like "Chrome/aa.bb.cc.dd", split out 918eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // the part after the "/". 919eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::vector<std::string> product_components; 920eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::SplitString(GetContentClient()->GetProduct(), '/', &product_components); 921eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK_EQ(2U, product_components.size()); 922eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (product_components.size() != 2) 923eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return E_FAIL; 924eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch *app_version = SysAllocString(UTF8ToUTF16(product_components[1]).c_str()); 925c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(*app_version); 926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return *app_version ? S_OK : E_FAIL; 927c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 928c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_toolkitName(BSTR* toolkit_name) { 930c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // No need to check |instance_active_| because this interface is 931c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // global, and doesn't depend on any local state. 932c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 933c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!toolkit_name) 934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return E_INVALIDARG; 935c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 936c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This is hard-coded; all products based on the Chromium engine 937c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // will have the same toolkit name, so that assistive technology can 938c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // detect any Chrome-based product. 939c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *toolkit_name = SysAllocString(L"Chrome"); 940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(*toolkit_name); 941c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return *toolkit_name ? S_OK : E_FAIL; 942c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 943c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 944c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_toolkitVersion( 945c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BSTR* toolkit_version) { 946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // No need to check |instance_active_| because this interface is 947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // global, and doesn't depend on any local state. 948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!toolkit_version) 950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return E_INVALIDARG; 951c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string user_agent = GetContentClient()->GetUserAgent(); 953c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *toolkit_version = SysAllocString(UTF8ToUTF16(user_agent).c_str()); 954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(*toolkit_version); 955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return *toolkit_version ? S_OK : E_FAIL; 956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IAccessibleImage methods. 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_description(BSTR* desc) { 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!desc) 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetStringAttributeAsBstr( 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_DESCRIPTION, desc); 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_imagePosition( 9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum IA2CoordinateType coordinate_type, 9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* x, 9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* y) { 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!x || !y) 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (coordinate_type == IA2_COORDTYPE_SCREEN_RELATIVE) { 9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HWND parent_hwnd = 9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) manager_->ToBrowserAccessibilityManagerWin()->parent_hwnd(); 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) POINT top_left = {0, 0}; 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::ClientToScreen(parent_hwnd, &top_left); 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *x = location_.x() + top_left.x; 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *y = location_.y() + top_left.y; 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (coordinate_type == IA2_COORDTYPE_PARENT_RELATIVE) { 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *x = location_.x(); 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *y = location_.y(); 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (parent_) { 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *x -= parent_->location().x(); 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *y -= parent_->location().y(); 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_imageSize(LONG* height, LONG* width) { 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!height || !width) 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *height = location_.height(); 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *width = location_.width(); 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IAccessibleTable methods. 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accessibleAt( 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long row, 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long column, 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IUnknown** accessible) { 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!accessible) 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int columns; 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rows; 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetIntAttribute( 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_COLUMN_COUNT, &columns) || 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !GetIntAttribute( 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_ROW_COUNT, &rows) || 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) columns <= 0 || 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rows <= 0) { 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (row < 0 || row >= rows || column < 0 || column >= columns) 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& cell_ids = GetIntListAttribute( 10453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AccessibilityNodeData::ATTR_CELL_IDS); 10463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK_EQ(columns * rows, static_cast<int>(cell_ids.size())); 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id = cell_ids[row * columns + column]; 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = GetFromRendererID(cell_id); 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell) { 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *accessible = static_cast<IAccessible*>(cell->NewReference()); 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *accessible = NULL; 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_caption(IUnknown** accessible) { 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!accessible) 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): implement 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_childIndex(long row, 10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long column, 10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* cell_index) { 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!cell_index) 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int columns; 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rows; 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetIntAttribute( 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_COLUMN_COUNT, &columns) || 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !GetIntAttribute( 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_ROW_COUNT, &rows) || 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) columns <= 0 || 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rows <= 0) { 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (row < 0 || row >= rows || column < 0 || column >= columns) 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& cell_ids = GetIntListAttribute( 10943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AccessibilityNodeData::ATTR_CELL_IDS); 10953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& unique_cell_ids = GetIntListAttribute( 10963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AccessibilityNodeData::ATTR_UNIQUE_CELL_IDS); 10973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK_EQ(columns * rows, static_cast<int>(cell_ids.size())); 10983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id = cell_ids[row * columns + column]; 10993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) for (size_t i = 0; i < unique_cell_ids.size(); ++i) { 11003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (unique_cell_ids[i] == cell_id) { 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *cell_index = (long)i; 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_columnDescription(long column, 11102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BSTR* description) { 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!description) 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int columns; 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rows; 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetIntAttribute( 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_COLUMN_COUNT, &columns) || 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !GetIntAttribute(AccessibilityNodeData::ATTR_TABLE_ROW_COUNT, &rows) || 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) columns <= 0 || 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rows <= 0) { 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (column < 0 || column >= columns) 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& cell_ids = GetIntListAttribute( 11313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AccessibilityNodeData::ATTR_CELL_IDS); 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < rows; ++i) { 11333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id = cell_ids[i * columns + column]; 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = static_cast<BrowserAccessibilityWin*>( 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->GetFromRendererID(cell_id)); 113658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (cell && cell->role_ == WebKit::WebAXRoleColumnHeader) { 11373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) string16 cell_name = cell->GetString16Attribute( 11383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AccessibilityNodeData::ATTR_NAME); 11393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (cell_name.size() > 0) { 11403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) *description = SysAllocString(cell_name.c_str()); 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cell->GetStringAttributeAsBstr( 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_DESCRIPTION, description); 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_columnExtentAt( 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long row, 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long column, 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* n_columns_spanned) { 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!n_columns_spanned) 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int columns; 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rows; 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetIntAttribute( 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_COLUMN_COUNT, &columns) || 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !GetIntAttribute(AccessibilityNodeData::ATTR_TABLE_ROW_COUNT, &rows) || 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) columns <= 0 || 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rows <= 0) { 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (row < 0 || row >= rows || column < 0 || column >= columns) 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& cell_ids = GetIntListAttribute( 11763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AccessibilityNodeData::ATTR_CELL_IDS); 11773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id = cell_ids[row * columns + column]; 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = static_cast<BrowserAccessibilityWin*>( 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->GetFromRendererID(cell_id)); 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int colspan; 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell && 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cell->GetIntAttribute( 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_CELL_COLUMN_SPAN, &colspan) && 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) colspan >= 1) { 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_columns_spanned = colspan; 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_columnHeader( 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IAccessibleTable** accessible_table, 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* starting_row_index) { 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): implement 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_columnIndex(long cell_index, 12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* column_index) { 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!column_index) 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& unique_cell_ids = GetIntListAttribute( 12083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AccessibilityNodeData::ATTR_UNIQUE_CELL_IDS); 12093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id_count = static_cast<int>(unique_cell_ids.size()); 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell_index < 0) 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell_index >= cell_id_count) 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id = unique_cell_ids[cell_index]; 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin(); 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int col_index; 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell && 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cell->GetIntAttribute( 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_CELL_COLUMN_INDEX, &col_index)) { 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *column_index = col_index; 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nColumns(long* column_count) { 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!column_count) 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int columns; 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetIntAttribute( 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_COLUMN_COUNT, &columns)) { 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *column_count = columns; 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nRows(long* row_count) { 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!row_count) 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rows; 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetIntAttribute(AccessibilityNodeData::ATTR_TABLE_ROW_COUNT, &rows)) { 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *row_count = rows; 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nSelectedChildren(long* cell_count) { 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!cell_count) 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): add support for selected cells/rows/columns in tables. 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *cell_count = 0; 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nSelectedColumns(long* column_count) { 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!column_count) 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *column_count = 0; 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nSelectedRows(long* row_count) { 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!row_count) 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *row_count = 0; 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_rowDescription(long row, 12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BSTR* description) { 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!description) 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int columns; 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rows; 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetIntAttribute( 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_COLUMN_COUNT, &columns) || 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !GetIntAttribute(AccessibilityNodeData::ATTR_TABLE_ROW_COUNT, &rows) || 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) columns <= 0 || 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rows <= 0) { 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (row < 0 || row >= rows) 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& cell_ids = GetIntListAttribute( 13183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AccessibilityNodeData::ATTR_CELL_IDS); 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < columns; ++i) { 13203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id = cell_ids[row * columns + i]; 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin(); 132358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (cell && cell->role_ == WebKit::WebAXRoleRowHeader) { 13243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) string16 cell_name = cell->GetString16Attribute( 13253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AccessibilityNodeData::ATTR_NAME); 13263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (cell_name.size() > 0) { 13273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) *description = SysAllocString(cell_name.c_str()); 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cell->GetStringAttributeAsBstr( 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_DESCRIPTION, description); 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_rowExtentAt(long row, 13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long column, 13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* n_rows_spanned) { 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!n_rows_spanned) 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int columns; 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rows; 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetIntAttribute( 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_COLUMN_COUNT, &columns) || 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !GetIntAttribute(AccessibilityNodeData::ATTR_TABLE_ROW_COUNT, &rows) || 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) columns <= 0 || 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rows <= 0) { 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (row < 0 || row >= rows || column < 0 || column >= columns) 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& cell_ids = GetIntListAttribute( 13623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AccessibilityNodeData::ATTR_CELL_IDS); 13633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id = cell_ids[row * columns + column]; 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin(); 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rowspan; 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell && 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cell->GetIntAttribute( 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_CELL_ROW_SPAN, &rowspan) && 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rowspan >= 1) { 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_rows_spanned = rowspan; 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_rowHeader( 13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IAccessibleTable** accessible_table, 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* starting_column_index) { 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): implement 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_rowIndex(long cell_index, 13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* row_index) { 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!row_index) 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& unique_cell_ids = GetIntListAttribute( 13943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AccessibilityNodeData::ATTR_UNIQUE_CELL_IDS); 13953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id_count = static_cast<int>(unique_cell_ids.size()); 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell_index < 0) 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell_index >= cell_id_count) 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id = unique_cell_ids[cell_index]; 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin(); 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cell_row_index; 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell && 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cell->GetIntAttribute( 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_CELL_ROW_INDEX, &cell_row_index)) { 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *row_index = cell_row_index; 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_selectedChildren(long max_children, 14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long** children, 14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* n_children) { 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!children || !n_children) 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_children = 0; 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_selectedColumns(long max_columns, 14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long** columns, 14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* n_columns) { 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!columns || !n_columns) 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_columns = 0; 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_selectedRows(long max_rows, 14442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long** rows, 14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* n_rows) { 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!rows || !n_rows) 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_rows = 0; 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_summary(IUnknown** accessible) { 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!accessible) 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): implement 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_isColumnSelected( 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long column, 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) boolean* is_selected) { 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_selected) 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *is_selected = false; 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_isRowSelected(long row, 14832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) boolean* is_selected) { 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_selected) 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *is_selected = false; 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_isSelected(long row, 14962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long column, 14972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) boolean* is_selected) { 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_selected) 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *is_selected = false; 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_rowColumnExtentsAtIndex( 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long index, 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* row, 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* column, 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* row_extents, 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* column_extents, 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) boolean* is_selected) { 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!row || !column || !row_extents || !column_extents || !is_selected) 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& unique_cell_ids = GetIntListAttribute( 15233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AccessibilityNodeData::ATTR_UNIQUE_CELL_IDS); 15243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id_count = static_cast<int>(unique_cell_ids.size()); 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index < 0) 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index >= cell_id_count) 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id = unique_cell_ids[index]; 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin(); 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rowspan; 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int colspan; 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell && 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cell->GetIntAttribute( 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_CELL_ROW_SPAN, &rowspan) && 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cell->GetIntAttribute( 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_CELL_COLUMN_SPAN, &colspan) && 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rowspan >= 1 && 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) colspan >= 1) { 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *row_extents = rowspan; 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *column_extents = colspan; 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IAccessibleTable2 methods. 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_cellAt(long row, 15552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long column, 15562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IUnknown** cell) { 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return get_accessibleAt(row, column, cell); 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nSelectedCells(long* cell_count) { 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return get_nSelectedChildren(cell_count); 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_selectedCells( 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IUnknown*** cells, 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* n_selected_cells) { 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!cells || !n_selected_cells) 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_selected_cells = 0; 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_selectedColumns(long** columns, 15792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* n_columns) { 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!columns || !n_columns) 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_columns = 0; 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_selectedRows(long** rows, 15922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* n_rows) { 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!rows || !n_rows) 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_rows = 0; 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IAccessibleTableCell methods. 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_columnExtent( 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* n_columns_spanned) { 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!n_columns_spanned) 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int colspan; 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetIntAttribute( 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_CELL_COLUMN_SPAN, &colspan) && 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) colspan >= 1) { 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_columns_spanned = colspan; 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_columnHeaderCells( 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IUnknown*** cell_accessibles, 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* n_column_header_cells) { 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!cell_accessibles || !n_column_header_cells) 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_column_header_cells = 0; 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int column; 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetIntAttribute( 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_CELL_COLUMN_INDEX, &column)) { 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibility* table = parent(); 164658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) while (table && table->role() != WebKit::WebAXRoleTable) 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) table = table->parent(); 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!table) { 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int columns; 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rows; 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!table->GetIntAttribute( 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_COLUMN_COUNT, &columns) || 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !table->GetIntAttribute( 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_ROW_COUNT, &rows)) { 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (columns <= 0 || rows <= 0 || column < 0 || column >= columns) 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& cell_ids = table->GetIntListAttribute( 16653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AccessibilityNodeData::ATTR_CELL_IDS); 16663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < rows; ++i) { 16683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id = cell_ids[i * columns + column]; 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin(); 167158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (cell && cell->role_ == WebKit::WebAXRoleColumnHeader) 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*n_column_header_cells)++; 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *cell_accessibles = static_cast<IUnknown**>(CoTaskMemAlloc( 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*n_column_header_cells) * sizeof(cell_accessibles[0]))); 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index = 0; 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < rows; ++i) { 16793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id = cell_ids[i * columns + column]; 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin(); 168258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (cell && cell->role_ == WebKit::WebAXRoleColumnHeader) { 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*cell_accessibles)[index] = 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<IAccessible*>(cell->NewReference()); 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++index; 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_columnIndex(long* column_index) { 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!column_index) 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int column; 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetIntAttribute( 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_CELL_COLUMN_INDEX, &column)) { 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *column_index = column; 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_rowExtent(long* n_rows_spanned) { 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!n_rows_spanned) 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rowspan; 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetIntAttribute( 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_CELL_ROW_SPAN, &rowspan) && 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rowspan >= 1) { 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_rows_spanned = rowspan; 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_rowHeaderCells( 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IUnknown*** cell_accessibles, 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* n_row_header_cells) { 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!cell_accessibles || !n_row_header_cells) 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_row_header_cells = 0; 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int row; 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetIntAttribute( 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_CELL_ROW_INDEX, &row)) { 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibility* table = parent(); 174558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) while (table && table->role() != WebKit::WebAXRoleTable) 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) table = table->parent(); 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!table) { 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int columns; 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rows; 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!table->GetIntAttribute( 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_COLUMN_COUNT, &columns) || 17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !table->GetIntAttribute( 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_ROW_COUNT, &rows)) { 17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (columns <= 0 || rows <= 0 || row < 0 || row >= rows) 17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& cell_ids = table->GetIntListAttribute( 17643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AccessibilityNodeData::ATTR_CELL_IDS); 17653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < columns; ++i) { 17673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id = cell_ids[row * columns + i]; 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin(); 177058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (cell && cell->role_ == WebKit::WebAXRoleRowHeader) 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*n_row_header_cells)++; 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *cell_accessibles = static_cast<IUnknown**>(CoTaskMemAlloc( 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*n_row_header_cells) * sizeof(cell_accessibles[0]))); 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index = 0; 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < columns; ++i) { 17783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id = cell_ids[row * columns + i]; 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin(); 178158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (cell && cell->role_ == WebKit::WebAXRoleRowHeader) { 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*cell_accessibles)[index] = 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<IAccessible*>(cell->NewReference()); 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++index; 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_rowIndex(long* row_index) { 17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!row_index) 17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int row; 17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetIntAttribute(AccessibilityNodeData::ATTR_TABLE_CELL_ROW_INDEX, &row)) { 18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *row_index = row; 18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_isSelected(boolean* is_selected) { 18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_selected) 18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *is_selected = false; 18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_rowColumnExtents( 18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* row_index, 18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* column_index, 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* row_extents, 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* column_extents, 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) boolean* is_selected) { 18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!row_index || 18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !column_index || 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !row_extents || 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !column_extents || 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !is_selected) { 18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int row; 18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int column; 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rowspan; 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int colspan; 18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetIntAttribute(AccessibilityNodeData::ATTR_TABLE_CELL_ROW_INDEX, &row) && 18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetIntAttribute( 18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_CELL_COLUMN_INDEX, &column) && 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetIntAttribute( 18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_CELL_ROW_SPAN, &rowspan) && 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetIntAttribute( 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TABLE_CELL_COLUMN_SPAN, &colspan)) { 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *row_index = row; 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *column_index = column; 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *row_extents = rowspan; 18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *column_extents = colspan; 18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *is_selected = false; 18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_table(IUnknown** table) { 18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!table) 18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int row; 18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int column; 18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetIntAttribute(AccessibilityNodeData::ATTR_TABLE_CELL_ROW_INDEX, &row); 18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetIntAttribute(AccessibilityNodeData::ATTR_TABLE_CELL_COLUMN_INDEX, &column); 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibility* find_table = parent(); 187058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) while (find_table && find_table->role() != WebKit::WebAXRoleTable) 18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) find_table = find_table->parent(); 18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!find_table) { 18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *table = static_cast<IAccessibleTable*>( 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) find_table->ToBrowserAccessibilityWin()->NewReference()); 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IAccessibleText methods. 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nCharacters(LONG* n_characters) { 18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!n_characters) 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_characters = TextForIAccessibleText().length(); 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_caretOffset(LONG* offset) { 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!offset) 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *offset = 0; 190658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (role_ == WebKit::WebAXRoleTextField || 190758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) role_ == WebKit::WebAXRoleTextArea) { 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int sel_start = 0; 19092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (GetIntAttribute(AccessibilityNodeData::ATTR_TEXT_SEL_START, 19102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &sel_start)) 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *offset = sel_start; 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nSelections(LONG* n_selections) { 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!n_selections) 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *n_selections = 0; 192558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (role_ == WebKit::WebAXRoleTextField || 192658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) role_ == WebKit::WebAXRoleTextArea) { 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int sel_start = 0; 19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int sel_end = 0; 19292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (GetIntAttribute(AccessibilityNodeData::ATTR_TEXT_SEL_START, 19302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &sel_start) && 19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetIntAttribute(AccessibilityNodeData::ATTR_TEXT_SEL_END, &sel_end) && 19322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sel_start != sel_end) 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_selections = 1; 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_selection(LONG selection_index, 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG* start_offset, 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG* end_offset) { 19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!start_offset || !end_offset || selection_index != 0) 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *start_offset = 0; 19492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *end_offset = 0; 195058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (role_ == WebKit::WebAXRoleTextField || 195158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) role_ == WebKit::WebAXRoleTextArea) { 19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int sel_start = 0; 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int sel_end = 0; 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetIntAttribute( 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_TEXT_SEL_START, &sel_start) && 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetIntAttribute(AccessibilityNodeData::ATTR_TEXT_SEL_END, &sel_end)) { 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *start_offset = sel_start; 19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *end_offset = sel_end; 19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_text(LONG start_offset, 19662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG end_offset, 19672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BSTR* text) { 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!text) 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& text_str = TextForIAccessibleText(); 19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handle special text offsets. 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleSpecialTextOffset(text_str, &start_offset); 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleSpecialTextOffset(text_str, &end_offset); 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The spec allows the arguments to be reversed. 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (start_offset > end_offset) { 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG tmp = start_offset; 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start_offset = end_offset; 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end_offset = tmp; 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The spec does not allow the start or end offsets to be out or range; 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we must return an error if so. 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG len = text_str.length(); 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (start_offset < 0) 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (end_offset > len) 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 substr = text_str.substr(start_offset, end_offset - start_offset); 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (substr.empty()) 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *text = SysAllocString(substr.c_str()); 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(*text); 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_textAtOffset( 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG offset, 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum IA2TextBoundaryType boundary_type, 20072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* start_offset, 20082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* end_offset, 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* text) { 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!start_offset || !end_offset || !text) 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The IAccessible2 spec says we don't have to implement the "sentence" 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // boundary type, we can just let the screenreader handle it. 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (boundary_type == IA2_TEXT_BOUNDARY_SENTENCE) { 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *start_offset = 0; 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *end_offset = 0; 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *text = NULL; 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& text_str = TextForIAccessibleText(); 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *start_offset = FindBoundary( 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_str, boundary_type, offset, ui::BACKWARDS_DIRECTION); 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *end_offset = FindBoundary( 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_str, boundary_type, offset, ui::FORWARDS_DIRECTION); 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return get_text(*start_offset, *end_offset, text); 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_textBeforeOffset( 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG offset, 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum IA2TextBoundaryType boundary_type, 20372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* start_offset, 20382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* end_offset, 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* text) { 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!start_offset || !end_offset || !text) 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The IAccessible2 spec says we don't have to implement the "sentence" 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // boundary type, we can just let the screenreader handle it. 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (boundary_type == IA2_TEXT_BOUNDARY_SENTENCE) { 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *start_offset = 0; 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *end_offset = 0; 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *text = NULL; 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& text_str = TextForIAccessibleText(); 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *start_offset = FindBoundary( 20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_str, boundary_type, offset, ui::BACKWARDS_DIRECTION); 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *end_offset = offset; 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return get_text(*start_offset, *end_offset, text); 20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_textAfterOffset( 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG offset, 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum IA2TextBoundaryType boundary_type, 20662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* start_offset, 20672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* end_offset, 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* text) { 20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!start_offset || !end_offset || !text) 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The IAccessible2 spec says we don't have to implement the "sentence" 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // boundary type, we can just let the screenreader handle it. 20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (boundary_type == IA2_TEXT_BOUNDARY_SENTENCE) { 20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *start_offset = 0; 20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *end_offset = 0; 20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *text = NULL; 20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& text_str = TextForIAccessibleText(); 20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *start_offset = offset; 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *end_offset = FindBoundary( 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_str, boundary_type, offset, ui::FORWARDS_DIRECTION); 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return get_text(*start_offset, *end_offset, text); 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_newText(IA2TextSegment* new_text) { 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!new_text) 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 text = TextForIAccessibleText(); 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_text->text = SysAllocString(text.c_str()); 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_text->start = 0; 21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_text->end = static_cast<long>(text.size()); 21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_oldText(IA2TextSegment* old_text) { 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!old_text) 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_text->text = SysAllocString(old_text_.c_str()); 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_text->start = 0; 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_text->end = static_cast<long>(old_text_.size()); 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_offsetAtPoint( 21212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG x, 21222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG y, 21232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum IA2CoordinateType coord_type, 21242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* offset) { 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!offset) 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): implement this. We're returning S_OK for now so that 21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // screen readers still return partially accurate results rather than 21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // completely failing. 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *offset = 0; 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::scrollSubstringTo( 21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG start_index, 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG end_index, 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum IA2ScrollType scroll_type) { 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): adjust this for the start and end index, too. 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return scrollTo(scroll_type); 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::scrollSubstringToPoint( 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG start_index, 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG end_index, 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum IA2CoordinateType coordinate_type, 21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG x, LONG y) { 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): adjust this for the start and end index, too. 21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return scrollToPoint(coordinate_type, x, y); 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::addSelection(LONG start_offset, 21562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG end_offset) { 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& text_str = TextForIAccessibleText(); 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleSpecialTextOffset(text_str, &start_offset); 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleSpecialTextOffset(text_str, &end_offset); 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->SetTextSelection(*this, start_offset, end_offset); 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::removeSelection(LONG selection_index) { 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (selection_index != 0) 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->SetTextSelection(*this, 0, 0); 21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::setCaretOffset(LONG offset) { 21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& text_str = TextForIAccessibleText(); 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleSpecialTextOffset(text_str, &offset); 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->SetTextSelection(*this, offset, offset); 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::setSelection(LONG selection_index, 21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG start_offset, 21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG end_offset) { 21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (selection_index != 0) 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& text_str = TextForIAccessibleText(); 21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleSpecialTextOffset(text_str, &start_offset); 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleSpecialTextOffset(text_str, &end_offset); 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->SetTextSelection(*this, start_offset, end_offset); 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IAccessibleHypertext methods. 22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nHyperlinks(long* hyperlink_count) { 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!hyperlink_count) 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *hyperlink_count = hyperlink_offset_to_index_.size(); 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_hyperlink( 22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long index, 22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IAccessibleHyperlink** hyperlink) { 22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!hyperlink || 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index < 0 || 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index >= static_cast<long>(hyperlinks_.size())) { 22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* child = 22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) children_[hyperlinks_[index]]->ToBrowserAccessibilityWin(); 22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *hyperlink = static_cast<IAccessibleHyperlink*>(child->NewReference()); 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_hyperlinkIndex( 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long char_index, 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* hyperlink_index) { 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!hyperlink_index) 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *hyperlink_index = -1; 22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (char_index < 0 || char_index >= static_cast<long>(hypertext_.size())) 22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<int32, int32>::iterator it = 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hyperlink_offset_to_index_.find(char_index); 22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it == hyperlink_offset_to_index_.end()) 22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *hyperlink_index = it->second; 22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IAccessibleValue methods. 22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_currentValue(VARIANT* value) { 22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!value) 22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float float_val; 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetFloatAttribute( 22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_VALUE_FOR_RANGE, &float_val)) { 22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->vt = VT_R8; 22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->dblVal = float_val; 22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->vt = VT_EMPTY; 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_minimumValue(VARIANT* value) { 22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!value) 22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float float_val; 22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetFloatAttribute(AccessibilityNodeData::ATTR_MIN_VALUE_FOR_RANGE, 22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &float_val)) { 22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->vt = VT_R8; 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->dblVal = float_val; 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->vt = VT_EMPTY; 23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_maximumValue(VARIANT* value) { 23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!value) 23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float float_val; 23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetFloatAttribute(AccessibilityNodeData::ATTR_MAX_VALUE_FOR_RANGE, 23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &float_val)) { 23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->vt = VT_R8; 23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->dblVal = float_val; 23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->vt = VT_EMPTY; 23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::setCurrentValue(VARIANT new_value) { 23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ISimpleDOMDocument methods. 23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_URL(BSTR* url) { 23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!url) 23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetStringAttributeAsBstr(AccessibilityNodeData::ATTR_DOC_URL, url); 23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_title(BSTR* title) { 23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!title) 23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetStringAttributeAsBstr(AccessibilityNodeData::ATTR_DOC_TITLE, title); 23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_mimeType(BSTR* mime_type) { 23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!mime_type) 23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetStringAttributeAsBstr( 23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_DOC_MIMETYPE, mime_type); 23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_docType(BSTR* doc_type) { 23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!doc_type) 23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetStringAttributeAsBstr( 23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccessibilityNodeData::ATTR_DOC_DOCTYPE, doc_type); 23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ISimpleDOMNode methods. 23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nodeInfo( 23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* node_name, 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) short* name_space_id, 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* node_value, 23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int* num_children, 23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int* unique_id, 23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned short* node_type) { 23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!node_name || !name_space_id || !node_value || !num_children || 23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !unique_id || !node_type) { 23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 tag; 23943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (GetString16Attribute(AccessibilityNodeData::ATTR_HTML_TAG, &tag)) 23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node_name = SysAllocString(tag.c_str()); 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node_name = NULL; 23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *name_space_id = 0; 24003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) *node_value = SysAllocString(UTF8ToUTF16(value_).c_str()); 24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *num_children = children_.size(); 2402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *unique_id = unique_id_win_; 24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_role_ == ROLE_SYSTEM_DOCUMENT) { 24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node_type = NODETYPE_DOCUMENT; 24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (ia_role_ == ROLE_SYSTEM_TEXT && 24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((ia2_state_ & IA2_STATE_EDITABLE) == 0)) { 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node_type = NODETYPE_TEXT; 24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node_type = NODETYPE_ELEMENT; 24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_attributes( 24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned short max_attribs, 24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* attrib_names, 24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) short* name_space_id, 24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* attrib_values, 24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned short* num_attribs) { 24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!attrib_names || !name_space_id || !attrib_values || !num_attribs) 24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *num_attribs = max_attribs; 24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*num_attribs > html_attributes_.size()) 24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *num_attribs = html_attributes_.size(); 24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned short i = 0; i < *num_attribs; ++i) { 24333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) attrib_names[i] = SysAllocString( 24343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) UTF8ToUTF16(html_attributes_[i].first).c_str()); 24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name_space_id[i] = 0; 24363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) attrib_values[i] = SysAllocString( 24373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) UTF8ToUTF16(html_attributes_[i].second).c_str()); 24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_attributesForNames( 24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned short num_attribs, 24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* attrib_names, 24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) short* name_space_id, 24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* attrib_values) { 24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!attrib_names || !name_space_id || !attrib_values) 24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned short i = 0; i < num_attribs; ++i) { 24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name_space_id[i] = 0; 24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool found = false; 24563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string name = UTF16ToUTF8((LPCWSTR)attrib_names[i]); 24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned int j = 0; j < html_attributes_.size(); ++j) { 24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (html_attributes_[j].first == name) { 24593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) attrib_values[i] = SysAllocString( 24603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) UTF8ToUTF16(html_attributes_[j].second).c_str()); 24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) found = true; 24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!found) { 24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attrib_values[i] = NULL; 24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_computedStyle( 24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned short max_style_properties, 24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) boolean use_alternate_view, 24752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BSTR* style_properties, 24762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BSTR* style_values, 24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned short *num_style_properties) { 24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!style_properties || !style_values) 24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We only cache a single style property for now: DISPLAY 24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 display; 24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (max_style_properties == 0 || 24883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) !GetString16Attribute(AccessibilityNodeData::ATTR_DISPLAY, &display)) { 24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *num_style_properties = 0; 24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *num_style_properties = 1; 24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style_properties[0] = SysAllocString(L"display"); 24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style_values[0] = SysAllocString(display.c_str()); 24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_computedStyleForProperties( 25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned short num_style_properties, 25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) boolean use_alternate_view, 25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* style_properties, 25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* style_values) { 25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!style_properties || !style_values) 25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We only cache a single style property for now: DISPLAY 25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned short i = 0; i < num_style_properties; ++i) { 25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 name = (LPCWSTR)style_properties[i]; 25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringToLowerASCII(&name); 25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (name == L"display") { 25173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) string16 display = GetString16Attribute( 25183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AccessibilityNodeData::ATTR_DISPLAY); 25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style_values[i] = SysAllocString(display.c_str()); 25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style_values[i] = NULL; 25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::scrollTo(boolean placeTopLeft) { 25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return scrollTo(placeTopLeft ? 25302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IA2_SCROLL_TYPE_TOP_LEFT : IA2_SCROLL_TYPE_ANYWHERE); 25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_parentNode(ISimpleDOMNode** node) { 25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!node) 25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node = parent_->ToBrowserAccessibilityWin()->NewReference(); 25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_firstChild(ISimpleDOMNode** node) { 25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!node) 25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (children_.empty()) { 25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node = NULL; 25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *node = children_[0]->ToBrowserAccessibilityWin()->NewReference(); 25572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return S_OK; 25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_lastChild(ISimpleDOMNode** node) { 25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!node) 25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (children_.empty()) { 25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node = NULL; 25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *node = (*children_.rbegin())->ToBrowserAccessibilityWin()->NewReference(); 25732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return S_OK; 25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_previousSibling( 25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ISimpleDOMNode** node) { 25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!node) 25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!parent_ || index_in_parent_ <= 0) { 25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node = NULL; 25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *node = parent_->children()[index_in_parent_ - 1]-> 25902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ToBrowserAccessibilityWin()->NewReference(); 25912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return S_OK; 25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nextSibling(ISimpleDOMNode** node) { 25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!node) 25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!parent_ || 26022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) index_in_parent_ < 0 || 26032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) index_in_parent_ >= static_cast<int>(parent_->children().size()) - 1) { 26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node = NULL; 26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *node = parent_->children()[index_in_parent_ + 1]-> 26092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ToBrowserAccessibilityWin()->NewReference(); 26102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return S_OK; 26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_childAt( 26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int child_index, 26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ISimpleDOMNode** node) { 26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!node) 26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) BrowserAccessibility* child = PlatformGetChild(child_index); 26230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (!child) { 26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node = NULL; 26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) *node = child->ToBrowserAccessibilityWin()->NewReference(); 26292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return S_OK; 26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ISimpleDOMText methods. 26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_domText(BSTR* dom_text) { 26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dom_text) 26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return GetStringAttributeAsBstr( 26443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AccessibilityNodeData::ATTR_NAME, dom_text); 26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IServiceProvider methods. 26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::QueryService(REFGUID guidService, 26522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) REFIID riid, 26532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void** object) { 26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_active_) 26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2657d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // The system uses IAccessible APIs for many purposes, but only 2658d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // assistive technology like screen readers uses IAccessible2. 2659d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Enable full accessibility support when IAccessible2 APIs are queried. 2660d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (riid == IID_IAccessible2) 2661d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) BrowserAccessibilityStateImpl::GetInstance()->EnableAccessibility(); 2662d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 26632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (guidService == GUID_IAccessibleContentDocument) { 26642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Special Mozilla extension: return the accessible for the root document. 26652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Screen readers use this to distinguish between a document loaded event 26662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // on the root document vs on an iframe. 26672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return manager_->GetRoot()->ToBrowserAccessibilityWin()->QueryInterface( 26682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IID_IAccessible2, object); 26692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 26702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (guidService == IID_IAccessible || 26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessible2 || 26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessibleAction || 2674c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) guidService == IID_IAccessibleApplication || 26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessibleHyperlink || 26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessibleHypertext || 26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessibleImage || 26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessibleTable || 26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessibleTable2 || 26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessibleTableCell || 26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessibleText || 26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessibleValue || 26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_ISimpleDOMDocument || 26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_ISimpleDOMNode || 26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_ISimpleDOMText || 26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == GUID_ISimpleDOM) { 26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return QueryInterface(riid, object); 26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We only support the IAccessibleEx interface on Windows 8 and above. This 26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is needed for the on-screen Keyboard to show up in metro mode, when the 26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // user taps an editable portion on the page. 26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // All methods in the IAccessibleEx interface are unimplemented. 26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (riid == IID_IAccessibleEx && 26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::GetVersion() >= base::win::VERSION_WIN8) { 26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return QueryInterface(riid, object); 26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *object = NULL; 27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::GetPatternProvider(PATTERNID id, 27042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IUnknown** provider) { 27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "In Function: " 27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << __FUNCTION__ 27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " for pattern id: " 27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << id; 27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (id == UIA_ValuePatternId || id == UIA_TextPatternId) { 27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsEditableText()) { 27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The BrowserAccessibilityManager keeps track of instances when 27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we don't want to show the on-screen keyboard. 27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!manager_->IsOSKAllowed(GetGlobalBoundsRect())) 27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Returning UIA text provider"; 27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::UIATextProvider::CreateTextProvider(true, provider); 27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::GetPropertyValue(PROPERTYID id, 27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VARIANT* ret) { 27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "In Function: " 27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << __FUNCTION__ 27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " for property id: " 27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << id; 27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) V_VT(ret) = VT_EMPTY; 27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (id == UIA_ControlTypePropertyId) { 27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsEditableText()) { 27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) V_VT(ret) = VT_I4; 27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->lVal = UIA_EditControlTypeId; 27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Returning Edit control type"; 27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Returning empty control type"; 27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CComObjectRootEx methods. 27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT WINAPI BrowserAccessibilityWin::InternalQueryInterface( 27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* this_ptr, 27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const _ATL_INTMAP_ENTRY* entries, 27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) REFIID iid, 27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void** object) { 27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iid == IID_IAccessibleImage) { 27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_role_ != ROLE_SYSTEM_GRAPHIC) { 27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *object = NULL; 27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOINTERFACE; 27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (iid == IID_IAccessibleTable || iid == IID_IAccessibleTable2) { 27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_role_ != ROLE_SYSTEM_TABLE) { 27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *object = NULL; 27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOINTERFACE; 27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (iid == IID_IAccessibleTableCell) { 27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_role_ != ROLE_SYSTEM_CELL) { 27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *object = NULL; 27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOINTERFACE; 27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (iid == IID_IAccessibleValue) { 27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_role_ != ROLE_SYSTEM_PROGRESSBAR && 27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ != ROLE_SYSTEM_SCROLLBAR && 27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ != ROLE_SYSTEM_SLIDER) { 27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *object = NULL; 27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOINTERFACE; 27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (iid == IID_ISimpleDOMDocument) { 27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_role_ != ROLE_SYSTEM_DOCUMENT) { 27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *object = NULL; 27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOINTERFACE; 27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CComObjectRootBase::InternalQueryInterface( 27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this_ptr, entries, iid, object); 27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Private methods. 27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Initialize this object and mark it as active. 27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserAccessibilityWin::PreInitialize() { 27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibility::PreInitialize(); 27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitRoleAndState(); 27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expose the "display" and "tag" attributes. 27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringAttributeToIA2(AccessibilityNodeData::ATTR_DISPLAY, "display"); 27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringAttributeToIA2(AccessibilityNodeData::ATTR_HTML_TAG, "tag"); 27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringAttributeToIA2(AccessibilityNodeData::ATTR_ROLE, "xml-roles"); 27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Expose "level" attribute for headings, trees, etc. 28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IntAttributeToIA2(AccessibilityNodeData::ATTR_HIERARCHICAL_LEVEL, "level"); 28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expose the set size and position in set for listbox options. 280458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (role_ == WebKit::WebAXRoleListBoxOption && 28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent_ && 280658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) parent_->role() == WebKit::WebAXRoleListBox) { 28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_attributes_.push_back( 28080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) L"setsize:" + base::IntToString16(parent_->PlatformChildCount())); 28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_attributes_.push_back( 28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"setsize:" + base::IntToString16(index_in_parent_ + 1)); 28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ia_role_ == ROLE_SYSTEM_CHECKBUTTON || 28142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia_role_ == ROLE_SYSTEM_RADIOBUTTON || 28152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia2_role_ == IA2_ROLE_TOGGLE_BUTTON) { 28162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia2_attributes_.push_back(L"checkable:true"); 28172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 28182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expose live region attributes. 28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringAttributeToIA2(AccessibilityNodeData::ATTR_LIVE_STATUS, "live"); 28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringAttributeToIA2(AccessibilityNodeData::ATTR_LIVE_RELEVANT, "relevant"); 28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BoolAttributeToIA2(AccessibilityNodeData::ATTR_LIVE_ATOMIC, "atomic"); 28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BoolAttributeToIA2(AccessibilityNodeData::ATTR_LIVE_BUSY, "busy"); 28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expose container live region attributes. 28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringAttributeToIA2(AccessibilityNodeData::ATTR_CONTAINER_LIVE_STATUS, 28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "container-live"); 28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringAttributeToIA2(AccessibilityNodeData::ATTR_CONTAINER_LIVE_RELEVANT, 28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "container-relevant"); 28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BoolAttributeToIA2(AccessibilityNodeData::ATTR_CONTAINER_LIVE_ATOMIC, 28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "container-atomic"); 28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BoolAttributeToIA2(AccessibilityNodeData::ATTR_CONTAINER_LIVE_BUSY, 28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "container-busy"); 28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expose slider value. 28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_role_ == ROLE_SYSTEM_PROGRESSBAR || 28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ == ROLE_SYSTEM_SCROLLBAR || 28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ == ROLE_SYSTEM_SLIDER) { 28393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ia2_attributes_.push_back(L"valuetext:" + GetValueText()); 28402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 28412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expose table cell index. 28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_role_ == ROLE_SYSTEM_CELL) { 28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibility* table = parent(); 284558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) while (table && table->role() != WebKit::WebAXRoleTable) 28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) table = table->parent(); 28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (table) { 28483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& unique_cell_ids = table->GetIntListAttribute( 28493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AccessibilityNodeData::ATTR_UNIQUE_CELL_IDS); 28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < unique_cell_ids.size(); ++i) { 28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unique_cell_ids[i] == renderer_id_) { 28522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia2_attributes_.push_back( 28532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16(L"table-cell-index:") + base::IntToString16(i)); 28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The calculation of the accessible name of an element has been 28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // standardized in the HTML to Platform Accessibility APIs Implementation 28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Guide (http://www.w3.org/TR/html-aapi/). In order to return the 28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // appropriate accessible name on Windows, we need to apply some logic 28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to the fields we get from WebKit. 28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): move most of this logic into WebKit. 28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebKit gives us: 28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // name: the default name, e.g. inner text 28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // title ui element: a reference to a <label> element on the same 28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // page that labels this node. 28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // description: accessible labels that override the default name: 28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // aria-label or aria-labelledby or aria-describedby 28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // help: the value of the "title" attribute 28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On Windows, the logic we apply lets some fields take precedence and 28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // always returns the primary name in "name" and the secondary name, 28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if any, in "description". 28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int title_elem_id = GetIntAttribute( 28813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AccessibilityNodeData::ATTR_TITLE_UI_ELEMENT); 28823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string help = GetStringAttribute(AccessibilityNodeData::ATTR_HELP); 28833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string description = GetStringAttribute( 28843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AccessibilityNodeData::ATTR_DESCRIPTION); 28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebKit annoyingly puts the title in the description if there's no other 28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // description, which just confuses the rest of the logic. Put it back. 28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now "help" is always the value of the "title" attribute, if present. 28893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string title_attr; 28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetHtmlAttribute("title", &title_attr) && 28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) description == title_attr && 28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) help.empty()) { 28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) help = description; 28942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) description.clear(); 28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now implement the main logic: the descripion should become the name if 28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it's nonempty, and the help should become the description if 28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // there's no description - or the name if there's no name or description. 29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!description.empty()) { 29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name_ = description; 29022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) description.clear(); 29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!help.empty() && description.empty()) { 29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) description = help; 29063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) help.clear(); 29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!description.empty() && name_.empty() && !title_elem_id) { 29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name_ = description; 29102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) description.clear(); 29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If it's a text field, also consider the placeholder. 29143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string placeholder; 291558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (role_ == WebKit::WebAXRoleTextField && 291658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) HasState(WebKit::WebAXStateFocusable) && 29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetHtmlAttribute("placeholder", &placeholder)) { 29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (name_.empty() && !title_elem_id) { 29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name_ = placeholder; 29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (description.empty()) { 29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) description = placeholder; 29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SetStringAttribute(AccessibilityNodeData::ATTR_DESCRIPTION, description); 29263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SetStringAttribute(AccessibilityNodeData::ATTR_HELP, help); 29273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 29282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // On Windows, the value of a document should be its url. 292958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (role_ == WebKit::WebAXRoleRootWebArea || 293058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) role_ == WebKit::WebAXRoleWebArea) { 29312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetStringAttribute(AccessibilityNodeData::ATTR_DOC_URL, &value_); 29322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 29332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For certain roles (listbox option, static text, and list marker) 29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebKit stores the main accessible text in the "value" - swap it so 29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that it's the "name". 29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (name_.empty() && 293858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) (role_ == WebKit::WebAXRoleListBoxOption || 293958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) role_ == WebKit::WebAXRoleStaticText || 294058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) role_ == WebKit::WebAXRoleListMarker)) { 29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name_.swap(value_); 29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this doesn't have a value and is linked then set its value to the url 29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // attribute. This allows screen readers to read an empty link's destination. 29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value_.empty() && (ia_state_ & STATE_SYSTEM_LINKED)) 29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetStringAttribute(AccessibilityNodeData::ATTR_URL, &value_); 29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear any old relationships between this node and other nodes. 29505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < relations_.size(); ++i) 29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relations_[i]->Release(); 29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relations_.clear(); 29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handle title UI element. 29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (title_elem_id) { 29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add a labelled by relationship. 29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CComObject<BrowserAccessibilityRelation>* relation; 29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HRESULT hr = CComObject<BrowserAccessibilityRelation>::CreateInstance( 29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &relation); 29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(SUCCEEDED(hr)); 29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relation->AddRef(); 29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relation->Initialize(this, IA2_RELATION_LABELLED_BY); 29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relation->AddTarget(title_elem_id); 29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relations_.push_back(relation); 29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserAccessibilityWin::PostInitialize() { 29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibility::PostInitialize(); 29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Construct the hypertext for this node. 29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hyperlink_offset_to_index_.clear(); 29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hyperlinks_.clear(); 29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hypertext_.clear(); 29750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) for (unsigned int i = 0; i < PlatformChildCount(); ++i) { 29760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) BrowserAccessibility* child = PlatformGetChild(i); 297758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (child->role() == WebKit::WebAXRoleStaticText) { 29783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) hypertext_ += UTF8ToUTF16(child->name()); 29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hyperlink_offset_to_index_[hypertext_.size()] = hyperlinks_.size(); 29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hypertext_ += kEmbeddedCharacter; 29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hyperlinks_.push_back(i); 29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(hyperlink_offset_to_index_.size(), hyperlinks_.size()); 29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fire an event when an alert first appears. 298858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (role_ == WebKit::WebAXRoleAlert && first_time_) 298958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) manager_->NotifyAccessibilityEvent(WebKit::WebAXEventAlert, this); 29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fire events if text has changed. 29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 text = TextForIAccessibleText(); 29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (previous_text_ != text) { 29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!previous_text_.empty() && !text.empty()) { 29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->NotifyAccessibilityEvent( 299658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) WebKit::WebAXEventShow, this); 29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Look into HIDE events, too. 30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_text_ = previous_text_; 30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) previous_text_ = text; 30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fire events if the state has changed. 30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!first_time_ && ia_state_ != old_ia_state_) { 300790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) BrowserAccessibilityManagerWin* manager = 300890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) manager_->ToBrowserAccessibilityManagerWin(); 300990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Normally focus events are handled elsewhere, however 30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // focus for managed descendants is platform-specific. 30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fire a focus event if the focused descendant in a multi-select 30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // list box changes. 301458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (role_ == WebKit::WebAXRoleListBoxOption && 30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ia_state_ & STATE_SYSTEM_FOCUSABLE) && 30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ia_state_ & STATE_SYSTEM_SELECTABLE) && 30175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ia_state_ & STATE_SYSTEM_FOCUSED) && 30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !(old_ia_state_ & STATE_SYSTEM_FOCUSED)) { 301990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) manager->MaybeCallNotifyWinEvent(EVENT_OBJECT_FOCUS, unique_id_win()); 30205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ia_state_ & STATE_SYSTEM_SELECTED) && 30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !(old_ia_state_ & STATE_SYSTEM_SELECTED)) { 302490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) manager->MaybeCallNotifyWinEvent(EVENT_OBJECT_SELECTIONADD, 302590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) unique_id_win()); 30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (!(ia_state_ & STATE_SYSTEM_SELECTED) && 30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (old_ia_state_ & STATE_SYSTEM_SELECTED)) { 302890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) manager->MaybeCallNotifyWinEvent(EVENT_OBJECT_SELECTIONREMOVE, 302990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) unique_id_win()); 30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_ia_state_ = ia_state_; 30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_time_ = false; 30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserAccessibilityWin::NativeAddReference() { 30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddRef(); 30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserAccessibilityWin::NativeReleaseReference() { 30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Release(); 30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserAccessibilityWin::IsNative() const { 30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3050c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void BrowserAccessibilityWin::SetLocation(const gfx::Rect& new_location) { 3051c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BrowserAccessibility::SetLocation(new_location); 305290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) manager_->ToBrowserAccessibilityManagerWin()->MaybeCallNotifyWinEvent( 305390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EVENT_OBJECT_LOCATIONCHANGE, unique_id_win()); 3054c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3055c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 30565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserAccessibilityWin* BrowserAccessibilityWin::NewReference() { 30575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddRef(); 30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this; 30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserAccessibilityWin* BrowserAccessibilityWin::GetTargetFromChildID( 30625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const VARIANT& var_id) { 30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (var_id.vt != VT_I4) 30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG child_id = var_id.lVal; 30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (child_id == CHILDID_SELF) 30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this; 30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (child_id >= 1 && child_id <= static_cast<LONG>(PlatformChildCount())) 30710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return PlatformGetChild(child_id - 1)->ToBrowserAccessibilityWin(); 30725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3073c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return manager_->ToBrowserAccessibilityManagerWin()-> 3074c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFromUniqueIdWin(child_id); 30755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT BrowserAccessibilityWin::GetStringAttributeAsBstr( 30782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AccessibilityNodeData::StringAttribute attribute, 30792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BSTR* value_bstr) { 30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 str; 30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!GetString16Attribute(attribute, &str)) 30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (str.empty()) 30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 30875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *value_bstr = SysAllocString(str.c_str()); 30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(*value_bstr); 30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserAccessibilityWin::StringAttributeToIA2( 30952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AccessibilityNodeData::StringAttribute attribute, 30962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* ia2_attr) { 30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 value; 30983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (GetString16Attribute(attribute, &value)) 30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_attributes_.push_back(ASCIIToUTF16(ia2_attr) + L":" + value); 31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserAccessibilityWin::BoolAttributeToIA2( 31032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AccessibilityNodeData::BoolAttribute attribute, 31042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* ia2_attr) { 31055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool value; 31065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetBoolAttribute(attribute, &value)) { 31075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_attributes_.push_back((ASCIIToUTF16(ia2_attr) + L":") + 31085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (value ? L"true" : L"false")); 31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserAccessibilityWin::IntAttributeToIA2( 31132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AccessibilityNodeData::IntAttribute attribute, 31142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* ia2_attr) { 31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int value; 31163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (GetIntAttribute(attribute, &value)) { 31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_attributes_.push_back(ASCIIToUTF16(ia2_attr) + L":" + 31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::IntToString16(value)); 31193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 31203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 31213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 31223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)string16 BrowserAccessibilityWin::GetValueText() { 31233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) float fval; 31243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) string16 value = UTF8ToUTF16(value_); 31253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (value.empty() && 31263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) GetFloatAttribute(AccessibilityNodeData::ATTR_VALUE_FOR_RANGE, &fval)) { 31273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) value = UTF8ToUTF16(base::DoubleToString(fval)); 31283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 31293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return value; 31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)string16 BrowserAccessibilityWin::TextForIAccessibleText() { 31332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (IsEditableText()) 31343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return UTF8ToUTF16(value_); 313558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return (role_ == WebKit::WebAXRoleStaticText) ? 31363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) UTF8ToUTF16(name_) : hypertext_; 31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserAccessibilityWin::HandleSpecialTextOffset(const string16& text, 31402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* offset) { 31412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (*offset == IA2_TEXT_OFFSET_LENGTH) 31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *offset = static_cast<LONG>(text.size()); 31432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (*offset == IA2_TEXT_OFFSET_CARET) 31445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get_caretOffset(offset); 31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::TextBoundaryType BrowserAccessibilityWin::IA2TextBoundaryToTextBoundary( 31485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IA2TextBoundaryType ia2_boundary) { 31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch(ia2_boundary) { 31505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_TEXT_BOUNDARY_CHAR: return ui::CHAR_BOUNDARY; 31515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_TEXT_BOUNDARY_WORD: return ui::WORD_BOUNDARY; 31525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_TEXT_BOUNDARY_LINE: return ui::LINE_BOUNDARY; 31535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_TEXT_BOUNDARY_SENTENCE: return ui::SENTENCE_BOUNDARY; 31545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_TEXT_BOUNDARY_PARAGRAPH: return ui::PARAGRAPH_BOUNDARY; 31555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_TEXT_BOUNDARY_ALL: return ui::ALL_BOUNDARY; 31565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 31575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 31585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::CHAR_BOUNDARY; 31595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LONG BrowserAccessibilityWin::FindBoundary( 31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& text, 31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IA2TextBoundaryType ia2_boundary, 31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG start_offset, 31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TextBoundaryDirection direction) { 31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleSpecialTextOffset(text, &start_offset); 31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TextBoundaryType boundary = IA2TextBoundaryToTextBoundary(ia2_boundary); 31693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& line_breaks = GetIntListAttribute( 31703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AccessibilityNodeData::ATTR_LINE_BREAKS); 31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::FindAccessibleTextBoundary( 31723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) text, line_breaks, boundary, start_offset, direction); 31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserAccessibilityWin* BrowserAccessibilityWin::GetFromRendererID( 31765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 renderer_id) { 31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return manager_->GetFromRendererID(renderer_id)->ToBrowserAccessibilityWin(); 31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserAccessibilityWin::InitRoleAndState() { 31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ = 0; 31825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ = IA2_STATE_OPAQUE; 31835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_attributes_.clear(); 31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 318558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (HasState(WebKit::WebAXStateBusy)) 31865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_BUSY; 318758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (HasState(WebKit::WebAXStateChecked)) 31885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_CHECKED; 318958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (HasState(WebKit::WebAXStateCollapsed)) 31905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_COLLAPSED; 319158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (HasState(WebKit::WebAXStateExpanded)) 31925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_EXPANDED; 319358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (HasState(WebKit::WebAXStateFocusable)) 31945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_FOCUSABLE; 319558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (HasState(WebKit::WebAXStateHaspopup)) 31965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_HASPOPUP; 319758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (HasState(WebKit::WebAXStateHovered)) 31985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_HOTTRACKED; 319958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (HasState(WebKit::WebAXStateIndeterminate)) 32005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_INDETERMINATE; 320158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (HasState(WebKit::WebAXStateInvisible)) 32025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_INVISIBLE; 320358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (HasState(WebKit::WebAXStateLinked)) 32045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_LINKED; 320558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (HasState(WebKit::WebAXStateMultiselectable)) { 32065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_EXTSELECTABLE; 32075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_MULTISELECTABLE; 32085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(ctguil): Support STATE_SYSTEM_EXTSELECTABLE/accSelect. 321058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (HasState(WebKit::WebAXStateOffscreen)) 32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_OFFSCREEN; 321258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (HasState(WebKit::WebAXStatePressed)) 32135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_PRESSED; 321458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (HasState(WebKit::WebAXStateProtected)) 32155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_PROTECTED; 321658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (HasState(WebKit::WebAXStateRequired)) 32175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_REQUIRED; 321858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (HasState(WebKit::WebAXStateSelectable)) 32195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_SELECTABLE; 322058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (HasState(WebKit::WebAXStateSelected)) 32215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_SELECTED; 322258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (HasState(WebKit::WebAXStateVisited)) 32235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_TRAVERSED; 322458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!HasState(WebKit::WebAXStateEnabled)) 32255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_UNAVAILABLE; 322658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (HasState(WebKit::WebAXStateVertical)) { 32275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_VERTICAL; 32285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 32295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_HORIZONTAL; 32305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 323158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (HasState(WebKit::WebAXStateVisited)) 32325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_TRAVERSED; 32335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebKit marks everything as readonly unless it's editable text, so if it's 32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // not readonly, mark it as editable now. The final computation of the 32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // READONLY state for MSAA is below, after the switch. 323758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!HasState(WebKit::WebAXStateReadonly)) 32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_EDITABLE; 32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 invalid; 32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetHtmlAttribute("aria-invalid", &invalid)) 32425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_INVALID_ENTRY; 32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (GetBoolAttribute(AccessibilityNodeData::ATTR_BUTTON_MIXED)) 32455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_MIXED; 32465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (GetBoolAttribute(AccessibilityNodeData::ATTR_CAN_SET_VALUE)) 32485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_EDITABLE; 32495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) string16 html_tag = GetString16Attribute( 32513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AccessibilityNodeData::ATTR_HTML_TAG); 32525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = 0; 32535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = 0; 32545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (role_) { 325558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleAlert: 32565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_ALERT; 32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 325858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleAlertDialog: 32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_DIALOG; 32605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 326158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleApplication: 32625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_APPLICATION; 32635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 326458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleArticle: 32655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_GROUPING; 32665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_SECTION; 32675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 32685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 326958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleBusyIndicator: 32705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_ANIMATION; 32715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 32725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 327358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleButton: 32745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_PUSHBUTTON; 32755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_aria_pressed_defined; 32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_mixed; 32775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetAriaTristate("aria-pressed", &is_aria_pressed_defined, &is_mixed)) 32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_PRESSED; 32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_aria_pressed_defined) 32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_TOGGLE_BUTTON; 32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_mixed) 32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_MIXED; 32835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 328458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleCanvas: 328558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (GetBoolAttribute(AccessibilityNodeData::ATTR_CANVAS_HAS_FALLBACK)) { 328658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) role_name_ = L"canvas"; 328758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ia2_role_ = IA2_ROLE_CANVAS; 328858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } else { 328958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ia_role_ = ROLE_SYSTEM_GRAPHIC; 329058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 32915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 329258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleCell: 32935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_CELL; 32945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 329558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleCheckBox: 32965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_CHECKBUTTON; 32975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 329858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleColorWell: 32995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_CLIENT; 33005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_COLOR_CHOOSER; 33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 330258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleColumn: 33035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_COLUMN; 33045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 330658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleColumnHeader: 33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_COLUMNHEADER; 33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 331058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleComboBox: 33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_COMBOBOX; 33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 331358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleDiv: 33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role_name_ = L"div"; 33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_SECTION; 33165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 331758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleDefinition: 33185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role_name_ = html_tag; 33195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_PARAGRAPH; 33205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 33215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 332258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleDescriptionListDetail: 33232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) role_name_ = html_tag; 33242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia2_role_ = IA2_ROLE_PARAGRAPH; 33252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 33262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 332758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleDescriptionListTerm: 33285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_LISTITEM; 33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 333158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleDialog: 33325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_DIALOG; 33335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 33345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 333558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleDisclosureTriangle: 33365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_OUTLINEBUTTON; 33375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 33385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 333958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleDocument: 334058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleRootWebArea: 334158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleWebArea: 33425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_DOCUMENT; 33435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 33445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_FOCUSABLE; 33455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 334658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleEditableText: 33475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_TEXT; 33485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_SINGLE_LINE; 33495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_EDITABLE; 33505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 335158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleForm: 33525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role_name_ = L"form"; 33535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_FORM; 33545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 335558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleFooter: 33565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = IA2_ROLE_FOOTER; 33575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 33585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 335958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleGrid: 33605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_TABLE; 33615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 33625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 336358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleGroup: { 33643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) string16 aria_role = GetString16Attribute( 33653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AccessibilityNodeData::ATTR_ROLE); 33665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (aria_role == L"group" || html_tag == L"fieldset") { 33675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_GROUPING; 33685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (html_tag == L"li") { 33695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_LISTITEM; 33705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 33715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (html_tag.empty()) 33725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role_name_ = L"div"; 33735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 33745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role_name_ = html_tag; 33755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_SECTION; 33765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 33785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 338058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleGrowArea: 33815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_GRIP; 33825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 33835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 338458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleHeading: 33855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role_name_ = html_tag; 33865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_HEADING; 33875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 33885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 338958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleHorizontalRule: 33905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_SEPARATOR; 33915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 339258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleImage: 33935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_GRAPHIC; 33945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 33955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 339658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleImageMap: 33975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role_name_ = html_tag; 33985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_IMAGE_MAP; 33995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 340158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleImageMapLink: 34025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_LINK; 34035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_LINKED; 34045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 340658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleLabel: 34075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_TEXT; 34085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_LABEL; 34095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 341058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleBanner: 341158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleComplementary: 341258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleContentInfo: 341358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleMain: 341458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleNavigation: 341558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleSearch: 34165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_GROUPING; 34175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_SECTION; 34185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 342058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleLink: 34215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_LINK; 34225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_LINKED; 34235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 342458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleList: 34255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_LIST; 34265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 342858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleListBox: 34295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_LIST; 34305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 343158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleListBoxOption: 34325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_LISTITEM; 34335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_state_ & STATE_SYSTEM_SELECTABLE) { 34345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_FOCUSABLE; 343558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (HasState(WebKit::WebAXStateFocused)) 34365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_FOCUSED; 34375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 343958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleListItem: 34405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_LISTITEM; 34415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 344358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleListMarker: 34445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_TEXT; 34455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 344758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleMath: 34485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_EQUATION; 34495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 345158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleMenu: 345258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleMenuButton: 34535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_MENUPOPUP; 34545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 345558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleMenuBar: 34565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_MENUBAR; 34575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 345858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleMenuItem: 34595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_MENUITEM; 34605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 346158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleMenuListPopup: 34625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_CLIENT; 34635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 346458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleMenuListOption: 34655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_LISTITEM; 34665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_state_ & STATE_SYSTEM_SELECTABLE) { 34675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_FOCUSABLE; 346858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (HasState(WebKit::WebAXStateFocused)) 34695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_FOCUSED; 34705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 347258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleNote: 34735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_GROUPING; 34745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_NOTE; 34755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 347758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleOutline: 34785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_OUTLINE; 34795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 348158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleParagraph: 34825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role_name_ = L"P"; 34835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_PARAGRAPH; 34845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 348558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRolePopUpButton: 34865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (html_tag == L"select") { 34875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_COMBOBOX; 34885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 34895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_BUTTONMENU; 34905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 349258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleProgressIndicator: 34935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_PROGRESSBAR; 34945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 349658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleRadioButton: 34975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_RADIOBUTTON; 34985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 349958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleRadioGroup: 35005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_GROUPING; 35015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_SECTION; 35025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 350358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleRegion: 35045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_GROUPING; 35055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_SECTION; 35065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 35075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 350858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleRow: 35095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_ROW; 35105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 35115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 351258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleRowHeader: 35135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_ROWHEADER; 35145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 35155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 351658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleRuler: 35175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_CLIENT; 35185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_RULER; 35195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 35205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 352158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleScrollArea: 35225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_CLIENT; 35235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_SCROLL_PANE; 35245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 35255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 352658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleScrollBar: 35275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_SCROLLBAR; 35285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 352958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleSlider: 35305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_SLIDER; 35315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 353258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleSpinButton: 35335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_SPINBUTTON; 35345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 353558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleSpinButtonPart: 35365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_PUSHBUTTON; 35375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 353858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleSplitGroup: 35395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_CLIENT; 35405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_SPLIT_PANE; 35415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 35425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 354358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleAnnotation: 354458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleStaticText: 35455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_TEXT; 35465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 35475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 354858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleStatus: 35495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_STATUSBAR; 35505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 35515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 355258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleSplitter: 35535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_SEPARATOR; 35545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 355558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleSVGRoot: 35562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia_role_ = ROLE_SYSTEM_GRAPHIC; 35572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 355858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleTab: 35595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_PAGETAB; 35605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 356158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleTable: { 35623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) string16 aria_role = GetString16Attribute( 35633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AccessibilityNodeData::ATTR_ROLE); 35642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (aria_role == L"treegrid") { 35652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia_role_ = ROLE_SYSTEM_OUTLINE; 35662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 35672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia_role_ = ROLE_SYSTEM_TABLE; 35682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 35692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 35705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 357258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleTableHeaderContainer: 35735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_GROUPING; 35745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_SECTION; 35755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 35765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 357758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleTabList: 35785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_PAGETABLIST; 35795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 358058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleTabPanel: 35815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_PROPERTYPAGE; 35825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 358358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleToggleButton: 35845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_PUSHBUTTON; 35855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_TOGGLE_BUTTON; 35865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 358758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleTextArea: 35885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_TEXT; 35895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_MULTI_LINE; 35905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_EDITABLE; 35915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_SELECTABLE_TEXT; 35925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 359358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleTextField: 35945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_TEXT; 35955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_SINGLE_LINE; 35965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_EDITABLE; 35975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_SELECTABLE_TEXT; 35985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 359958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleTimer: 36005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_CLOCK; 36015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 36025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 360358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleToolbar: 36045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_TOOLBAR; 36055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 36065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 360758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleUserInterfaceTooltip: 36085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_TOOLTIP; 36095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 36105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 361158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleTree: 36125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_OUTLINE; 36135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 36145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 361558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleTreeGrid: 36165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_OUTLINE; 36175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 36185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 361958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleTreeItem: 36205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_OUTLINEITEM; 36215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 36225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 362358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleWindow: 36245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_WINDOW; 36255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): figure out the proper MSAA role for all of these. 362858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleBrowser: 362958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleDirectory: 363058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleDrawer: 363158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleHelpTag: 363258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleIgnored: 363358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleIncrementor: 363458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleLog: 363558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleMarquee: 363658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleMatte: 363758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRolePresentational: 363858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleRulerMarker: 363958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleSheet: 364058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleSliderThumb: 364158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleSystemWide: 364258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WebKit::WebAXRoleValueIndicator: 36435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 36445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_CLIENT; 36455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Compute the final value of READONLY for MSAA. 36495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 36505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We always set the READONLY state for elements that have the 36515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // aria-readonly attribute and for a few roles (in the switch above). 36525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We clear the READONLY state on focusable controls and on a document. 36535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Everything else, the majority of objects, do not have this state set. 365458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (HasState(WebKit::WebAXStateFocusable) && 36555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ != ROLE_SYSTEM_DOCUMENT) { 36565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ &= ~(STATE_SYSTEM_READONLY); 36575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 365858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!HasState(WebKit::WebAXStateReadonly)) 36595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ &= ~(STATE_SYSTEM_READONLY); 36603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (GetBoolAttribute(AccessibilityNodeData::ATTR_ARIA_READONLY)) 36615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 36625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The role should always be set. 36645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!role_name_.empty() || ia_role_); 36655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we didn't explicitly set the IAccessible2 role, make it the same 36675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as the MSAA role. 36685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ia2_role_) 36695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = ia_role_; 36705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 3673