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