| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/accessibility/browser_accessibility_manager_win.h" | 5 #include "content/browser/accessibility/browser_accessibility_manager_win.h" |
| 6 | 6 |
| 7 #include "content/browser/accessibility/browser_accessibility_win.h" | 7 #include "content/browser/accessibility/browser_accessibility_win.h" |
| 8 #include "content/common/accessibility_messages.h" | 8 #include "content/common/accessibility_messages.h" |
| 9 | 9 |
| 10 namespace content { | 10 namespace content { |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 46 AccessibilityNodeData BrowserAccessibilityManagerWin::GetEmptyDocument() { | 46 AccessibilityNodeData BrowserAccessibilityManagerWin::GetEmptyDocument() { |
| 47 AccessibilityNodeData empty_document; | 47 AccessibilityNodeData empty_document; |
| 48 empty_document.id = 0; | 48 empty_document.id = 0; |
| 49 empty_document.role = AccessibilityNodeData::ROLE_ROOT_WEB_AREA; | 49 empty_document.role = AccessibilityNodeData::ROLE_ROOT_WEB_AREA; |
| 50 empty_document.state = | 50 empty_document.state = |
| 51 (1 << AccessibilityNodeData::STATE_READONLY) | | 51 (1 << AccessibilityNodeData::STATE_READONLY) | |
| 52 (1 << AccessibilityNodeData::STATE_BUSY); | 52 (1 << AccessibilityNodeData::STATE_BUSY); |
| 53 return empty_document; | 53 return empty_document; |
| 54 } | 54 } |
| 55 | 55 |
| 56 void BrowserAccessibilityManagerWin::AddNodeToMap(BrowserAccessibility* node) { |
| 57 BrowserAccessibilityManager::AddNodeToMap(node); |
| 58 LONG unique_id_win = node->ToBrowserAccessibilityWin()->unique_id_win(); |
| 59 unique_id_to_renderer_id_map_[unique_id_win] = node->renderer_id(); |
| 60 } |
| 61 |
| 62 void BrowserAccessibilityManagerWin::RemoveNode(BrowserAccessibility* node) { |
| 63 unique_id_to_renderer_id_map_.erase( |
| 64 node->ToBrowserAccessibilityWin()->unique_id_win()); |
| 65 BrowserAccessibilityManager::RemoveNode(node); |
| 66 } |
| 67 |
| 56 void BrowserAccessibilityManagerWin::NotifyAccessibilityEvent( | 68 void BrowserAccessibilityManagerWin::NotifyAccessibilityEvent( |
| 57 int type, | 69 int type, |
| 58 BrowserAccessibility* node) { | 70 BrowserAccessibility* node) { |
| 59 LONG event_id = EVENT_MIN; | 71 LONG event_id = EVENT_MIN; |
| 60 switch (type) { | 72 switch (type) { |
| 61 case AccessibilityNotificationActiveDescendantChanged: | 73 case AccessibilityNotificationActiveDescendantChanged: |
| 62 event_id = IA2_EVENT_ACTIVE_DESCENDANT_CHANGED; | 74 event_id = IA2_EVENT_ACTIVE_DESCENDANT_CHANGED; |
| 63 break; | 75 break; |
| 64 case AccessibilityNotificationAlert: | 76 case AccessibilityNotificationAlert: |
| 65 event_id = EVENT_SYSTEM_ALERT; | 77 event_id = EVENT_SYSTEM_ALERT; |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 128 break; | 140 break; |
| 129 case AccessibilityNotificationValueChanged: | 141 case AccessibilityNotificationValueChanged: |
| 130 event_id = EVENT_OBJECT_VALUECHANGE; | 142 event_id = EVENT_OBJECT_VALUECHANGE; |
| 131 break; | 143 break; |
| 132 default: | 144 default: |
| 133 // Not all WebKit accessibility events result in a Windows | 145 // Not all WebKit accessibility events result in a Windows |
| 134 // accessibility notification. | 146 // accessibility notification. |
| 135 break; | 147 break; |
| 136 } | 148 } |
| 137 | 149 |
| 150 // Pass the node's unique id in the |child_id| argument to NotifyWinEvent; |
| 151 // the AT client will then call get_accChild on the HWND's accessibility |
| 152 // object and pass it that same id, which we can use to retrieve the |
| 153 // IAccessible for this node. |
| 154 LONG child_id = node->ToBrowserAccessibilityWin()->unique_id_win(); |
| 155 |
| 138 if (event_id != EVENT_MIN) | 156 if (event_id != EVENT_MIN) |
| 139 NotifyWinEvent(event_id, parent_hwnd(), OBJID_CLIENT, node->child_id()); | 157 NotifyWinEvent(event_id, parent_hwnd(), OBJID_CLIENT, child_id); |
| 140 | 158 |
| 141 // If this is a layout complete notification (sent when a container scrolls) | 159 // If this is a layout complete notification (sent when a container scrolls) |
| 142 // and there is a descendant tracked object, send a notification on it. | 160 // and there is a descendant tracked object, send a notification on it. |
| 143 // TODO(dmazzoni): remove once http://crbug.com/113483 is fixed. | 161 // TODO(dmazzoni): remove once http://crbug.com/113483 is fixed. |
| 144 if (type == AccessibilityNotificationLayoutComplete && | 162 if (type == AccessibilityNotificationLayoutComplete && |
| 145 tracked_scroll_object_ && | 163 tracked_scroll_object_ && |
| 146 tracked_scroll_object_->IsDescendantOf(node)) { | 164 tracked_scroll_object_->IsDescendantOf(node)) { |
| 147 NotifyWinEvent(IA2_EVENT_VISIBLE_DATA_CHANGED, | 165 NotifyWinEvent( |
| 148 parent_hwnd(), | 166 IA2_EVENT_VISIBLE_DATA_CHANGED, |
| 149 OBJID_CLIENT, | 167 parent_hwnd(), |
| 150 tracked_scroll_object_->child_id()); | 168 OBJID_CLIENT, |
| 169 tracked_scroll_object_->ToBrowserAccessibilityWin()->unique_id_win()); |
| 151 tracked_scroll_object_->Release(); | 170 tracked_scroll_object_->Release(); |
| 152 tracked_scroll_object_ = NULL; | 171 tracked_scroll_object_ = NULL; |
| 153 } | 172 } |
| 154 } | 173 } |
| 155 | 174 |
| 156 void BrowserAccessibilityManagerWin::TrackScrollingObject( | 175 void BrowserAccessibilityManagerWin::TrackScrollingObject( |
| 157 BrowserAccessibilityWin* node) { | 176 BrowserAccessibilityWin* node) { |
| 158 if (tracked_scroll_object_) | 177 if (tracked_scroll_object_) |
| 159 tracked_scroll_object_->Release(); | 178 tracked_scroll_object_->Release(); |
| 160 tracked_scroll_object_ = node; | 179 tracked_scroll_object_ = node; |
| 161 tracked_scroll_object_->AddRef(); | 180 tracked_scroll_object_->AddRef(); |
| 162 } | 181 } |
| 163 | 182 |
| 183 BrowserAccessibilityWin* BrowserAccessibilityManagerWin::GetFromUniqueIdWin( |
| 184 LONG unique_id_win) { |
| 185 base::hash_map<LONG, int32>::iterator iter = |
| 186 unique_id_to_renderer_id_map_.find(unique_id_win); |
| 187 if (iter != unique_id_to_renderer_id_map_.end()) { |
| 188 BrowserAccessibility* result = GetFromRendererID(iter->second); |
| 189 if (result) |
| 190 return result->ToBrowserAccessibilityWin(); |
| 191 } |
| 192 return NULL; |
| 193 } |
| 194 |
| 164 } // namespace content | 195 } // namespace content |
| OLD | NEW |