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