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 14 namespace content { 15 class BrowserAccessibilityWin; 16 17 class AccessibleHWND; 18 19 // Manages a tree of BrowserAccessibilityWin objects. 20 class CONTENT_EXPORT BrowserAccessibilityManagerWin 21 : public BrowserAccessibilityManager { 22 public: 23 BrowserAccessibilityManagerWin( 24 HWND parent_hwnd, 25 IAccessible* parent_iaccessible, 26 const AccessibilityNodeData& src, 27 BrowserAccessibilityDelegate* delegate, 28 BrowserAccessibilityFactory* factory = new BrowserAccessibilityFactory()); 29 30 virtual ~BrowserAccessibilityManagerWin(); 31 32 static AccessibilityNodeData GetEmptyDocument(); 33 34 // Get the closest containing HWND. 35 HWND parent_hwnd() { return parent_hwnd_; } 36 37 // The IAccessible for the parent window. 38 IAccessible* parent_iaccessible() { return parent_iaccessible_; } 39 void set_parent_iaccessible(IAccessible* parent_iaccessible) { 40 parent_iaccessible_ = parent_iaccessible; 41 } 42 43 // Calls NotifyWinEvent if the parent window's IAccessible pointer is known. 44 void MaybeCallNotifyWinEvent(DWORD event, LONG child_id); 45 46 // BrowserAccessibilityManager methods 47 virtual void AddNodeToMap(BrowserAccessibility* node); 48 virtual void RemoveNode(BrowserAccessibility* node) OVERRIDE; 49 virtual void NotifyAccessibilityEvent( 50 blink::WebAXEvent event_type, BrowserAccessibility* node) OVERRIDE; 51 52 // Track this object and post a VISIBLE_DATA_CHANGED notification when 53 // its container scrolls. 54 // TODO(dmazzoni): remove once http://crbug.com/113483 is fixed. 55 void TrackScrollingObject(BrowserAccessibilityWin* node); 56 57 // Return a pointer to the object corresponding to the given windows-specific 58 // unique id, does not make a new reference. 59 BrowserAccessibilityWin* GetFromUniqueIdWin(LONG unique_id_win); 60 61 // Called when |accessible_hwnd_| is deleted by its parent. 62 void OnAccessibleHwndDeleted(); 63 64 private: 65 // The closest ancestor HWND. 66 HWND parent_hwnd_; 67 68 // The accessibility instance for the parent window. 69 IAccessible* parent_iaccessible_; 70 71 // Give BrowserAccessibilityManager::Create access to our constructor. 72 friend class BrowserAccessibilityManager; 73 74 // Track the most recent object that has been asked to scroll and 75 // post a notification directly on it when it reaches its destination. 76 // TODO(dmazzoni): remove once http://crbug.com/113483 is fixed. 77 BrowserAccessibilityWin* tracked_scroll_object_; 78 79 // A mapping from the Windows-specific unique IDs (unique within the 80 // browser process) to renderer ids within this page. 81 base::hash_map<long, int32> unique_id_to_renderer_id_map_; 82 83 bool is_chrome_frame_; 84 85 // Owned by its parent; OnAccessibleHwndDeleted gets called upon deletion. 86 AccessibleHWND* accessible_hwnd_; 87 88 DISALLOW_COPY_AND_ASSIGN(BrowserAccessibilityManagerWin); 89 }; 90 91 } // namespace content 92 93 #endif // CONTENT_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_MANAGER_WIN_H_ 94