1// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/accessibility/browser_accessibility_manager_win.h"
6
7#include "chrome/browser/accessibility/browser_accessibility_win.h"
8#include "content/common/view_messages.h"
9
10using webkit_glue::WebAccessibility;
11
12// static
13BrowserAccessibilityManager* BrowserAccessibilityManager::Create(
14    gfx::NativeView parent_view,
15    const WebAccessibility& src,
16    BrowserAccessibilityDelegate* delegate,
17    BrowserAccessibilityFactory* factory) {
18  return new BrowserAccessibilityManagerWin(
19      parent_view,
20      src,
21      delegate,
22      factory);
23}
24
25BrowserAccessibilityManagerWin*
26BrowserAccessibilityManager::toBrowserAccessibilityManagerWin() {
27  return static_cast<BrowserAccessibilityManagerWin*>(this);
28}
29
30BrowserAccessibilityManagerWin::BrowserAccessibilityManagerWin(
31    HWND parent_view,
32    const WebAccessibility& src,
33    BrowserAccessibilityDelegate* delegate,
34    BrowserAccessibilityFactory* factory)
35    : BrowserAccessibilityManager(parent_view, src, delegate, factory) {
36  // Allow NULL parent_view for unit testing.
37  if (parent_view == NULL) {
38    window_iaccessible_ = NULL;
39    return;
40  }
41
42  HRESULT hr = ::CreateStdAccessibleObject(
43      parent_view, OBJID_WINDOW, IID_IAccessible,
44      reinterpret_cast<void **>(&window_iaccessible_));
45  DCHECK(SUCCEEDED(hr));
46}
47
48BrowserAccessibilityManagerWin::~BrowserAccessibilityManagerWin() {
49}
50
51IAccessible* BrowserAccessibilityManagerWin::GetParentWindowIAccessible() {
52  return window_iaccessible_;
53}
54
55void BrowserAccessibilityManagerWin::NotifyAccessibilityEvent(
56    int type,
57    BrowserAccessibility* node) {
58  LONG event_id = EVENT_MIN;
59  switch (type) {
60    case ViewHostMsg_AccessibilityNotification_Type::
61          NOTIFICATION_TYPE_CHECK_STATE_CHANGED:
62      event_id = EVENT_OBJECT_STATECHANGE;
63      break;
64    case ViewHostMsg_AccessibilityNotification_Type::
65          NOTIFICATION_TYPE_CHILDREN_CHANGED:
66      event_id = EVENT_OBJECT_REORDER;
67      break;
68    case ViewHostMsg_AccessibilityNotification_Type::
69          NOTIFICATION_TYPE_FOCUS_CHANGED:
70      event_id = EVENT_OBJECT_FOCUS;
71      break;
72    case ViewHostMsg_AccessibilityNotification_Type::
73          NOTIFICATION_TYPE_LOAD_COMPLETE:
74      event_id = IA2_EVENT_DOCUMENT_LOAD_COMPLETE;
75      break;
76    case ViewHostMsg_AccessibilityNotification_Type::
77          NOTIFICATION_TYPE_VALUE_CHANGED:
78      event_id = EVENT_OBJECT_VALUECHANGE;
79      break;
80    case ViewHostMsg_AccessibilityNotification_Type::
81          NOTIFICATION_TYPE_SELECTED_TEXT_CHANGED:
82      event_id = IA2_EVENT_TEXT_CARET_MOVED;
83      break;
84    default:
85      NOTREACHED();
86      break;
87  }
88
89  NotifyWinEvent(event_id, GetParentView(), OBJID_CLIENT, node->child_id());
90}
91