1// Copyright (c) 2012 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#ifndef CONTENT_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_MANAGER_WIN_H_
6#define CONTENT_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_MANAGER_WIN_H_
7
8#include <oleacc.h>
9
10#include "base/memory/scoped_ptr.h"
11#include "base/win/scoped_comptr.h"
12#include "content/browser/accessibility/browser_accessibility_manager.h"
13
14namespace content {
15class BrowserAccessibilityWin;
16
17// Manages a tree of BrowserAccessibilityWin objects.
18class CONTENT_EXPORT BrowserAccessibilityManagerWin
19    : public BrowserAccessibilityManager {
20 public:
21  BrowserAccessibilityManagerWin(
22      const ui::AXTreeUpdate& initial_tree,
23      BrowserAccessibilityDelegate* delegate,
24      BrowserAccessibilityFactory* factory = new BrowserAccessibilityFactory());
25
26  virtual ~BrowserAccessibilityManagerWin();
27
28  static ui::AXTreeUpdate GetEmptyDocument();
29
30  // Get the closest containing HWND.
31  HWND GetParentHWND();
32
33  // The IAccessible for the parent window.
34  IAccessible* GetParentIAccessible();
35
36  // Calls NotifyWinEvent if the parent window's IAccessible pointer is known.
37  void MaybeCallNotifyWinEvent(DWORD event, LONG child_id);
38
39  // AXTree methods
40  virtual void OnNodeWillBeDeleted(ui::AXNode* node) OVERRIDE;
41  virtual void OnNodeCreated(ui::AXNode* node) OVERRIDE;
42
43  // BrowserAccessibilityManager methods
44  virtual void OnWindowFocused() OVERRIDE;
45  virtual void NotifyAccessibilityEvent(
46      ui::AXEvent event_type, BrowserAccessibility* node) OVERRIDE;
47
48  // Track this object and post a VISIBLE_DATA_CHANGED notification when
49  // its container scrolls.
50  // TODO(dmazzoni): remove once http://crbug.com/113483 is fixed.
51  void TrackScrollingObject(BrowserAccessibilityWin* node);
52
53  // Return a pointer to the object corresponding to the given windows-specific
54  // unique id, does not make a new reference.
55  BrowserAccessibilityWin* GetFromUniqueIdWin(LONG unique_id_win);
56
57  // Called when |accessible_hwnd_| is deleted by its parent.
58  void OnAccessibleHwndDeleted();
59
60 protected:
61  // BrowserAccessibilityManager methods
62  virtual void OnRootChanged(ui::AXNode* new_root) OVERRIDE;
63
64 private:
65  // Give BrowserAccessibilityManager::Create access to our constructor.
66  friend class BrowserAccessibilityManager;
67
68  // Track the most recent object that has been asked to scroll and
69  // post a notification directly on it when it reaches its destination.
70  // TODO(dmazzoni): remove once http://crbug.com/113483 is fixed.
71  BrowserAccessibilityWin* tracked_scroll_object_;
72
73  // A mapping from the Windows-specific unique IDs (unique within the
74  // browser process) to accessibility ids within this page.
75  base::hash_map<long, int32> unique_id_to_ax_id_map_;
76
77  // Set to true if we need to fire a focus event on the root as soon as
78  // possible.
79  bool focus_event_on_root_needed_;
80
81  DISALLOW_COPY_AND_ASSIGN(BrowserAccessibilityManagerWin);
82};
83
84}  // namespace content
85
86#endif  // CONTENT_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_MANAGER_WIN_H_
87