| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 131 } | 131 } |
| 132 | 132 |
| 133 void BrowserAccessibilityManagerWin::UserIsReloading() { | 133 void BrowserAccessibilityManagerWin::UserIsReloading() { |
| 134 if (GetRoot()) | 134 if (GetRoot()) |
| 135 MaybeCallNotifyWinEvent(IA2_EVENT_DOCUMENT_RELOAD, GetRoot()); | 135 MaybeCallNotifyWinEvent(IA2_EVENT_DOCUMENT_RELOAD, GetRoot()); |
| 136 } | 136 } |
| 137 | 137 |
| 138 void BrowserAccessibilityManagerWin::NotifyAccessibilityEvent( | 138 void BrowserAccessibilityManagerWin::NotifyAccessibilityEvent( |
| 139 ui::AXEvent event_type, | 139 ui::AXEvent event_type, |
| 140 BrowserAccessibility* node) { | 140 BrowserAccessibility* node) { |
| 141 if (!node) |
| 142 return; |
| 143 |
| 141 BrowserAccessibilityDelegate* root_delegate = GetDelegateFromRootManager(); | 144 BrowserAccessibilityDelegate* root_delegate = GetDelegateFromRootManager(); |
| 142 if (!root_delegate || !root_delegate->AccessibilityGetAcceleratedWidget()) { | 145 if (!root_delegate || !root_delegate->AccessibilityGetAcceleratedWidget()) { |
| 143 DLOG(WARNING) << "Not firing AX event because of no root_delegate or hwnd"; | 146 DLOG(WARNING) << "Not firing AX event because of no root_delegate or hwnd"; |
| 144 return; | 147 return; |
| 145 } | 148 } |
| 146 | 149 |
| 147 // Don't fire events when this document might be stale as the user has | 150 // Don't fire events when this document might be stale as the user has |
| 148 // started navigating to a new document. | 151 // started navigating to a new document. |
| 149 if (user_is_navigating_away_) | 152 if (user_is_navigating_away_) |
| 150 return; | 153 return; |
| 151 | 154 |
| 152 // Inline text boxes are an internal implementation detail, we don't | 155 // Inline text boxes are an internal implementation detail, we don't |
| 153 // expose them to Windows. | 156 // expose them to Windows. |
| 154 if (node->GetRole() == ui::AX_ROLE_INLINE_TEXT_BOX) | 157 if (node->GetRole() == ui::AX_ROLE_INLINE_TEXT_BOX) |
| 155 return; | 158 return; |
| 156 | 159 |
| 157 // Don't fire focus, blur, or load complete notifications if the | 160 // Don't fire focus, blur, or load complete notifications if the |
| 158 // window isn't focused, because that can confuse screen readers into | 161 // window isn't focused, because that can confuse screen readers into |
| 159 // entering their "browse" mode. | 162 // entering their "browse" mode. |
| 160 if ((event_type == ui::AX_EVENT_FOCUS || | 163 if ((event_type == ui::AX_EVENT_FOCUS || |
| 161 event_type == ui::AX_EVENT_BLUR || | 164 event_type == ui::AX_EVENT_BLUR || |
| 162 event_type == ui::AX_EVENT_LOAD_COMPLETE) && | 165 event_type == ui::AX_EVENT_LOAD_COMPLETE) && |
| 163 !NativeViewHasFocus()) { | 166 !NativeViewHasFocus()) { |
| 164 return; | 167 return; |
| 165 } | 168 } |
| 166 | 169 |
| 167 LONG event_id = EVENT_MIN; | 170 LONG event_id = EVENT_MIN; |
| 168 switch (event_type) { | 171 switch (event_type) { |
| 169 case ui::AX_EVENT_ACTIVEDESCENDANTCHANGED: | 172 case ui::AX_EVENT_ACTIVEDESCENDANTCHANGED: { |
| 170 event_id = IA2_EVENT_ACTIVE_DESCENDANT_CHANGED; | 173 event_id = IA2_EVENT_ACTIVE_DESCENDANT_CHANGED; |
| 174 BrowserAccessibility* active_descendant = GetActiveDescendantFocus(node); |
| 175 if (active_descendant) |
| 176 FireFocusEvent(active_descendant); |
| 171 break; | 177 break; |
| 178 } |
| 172 case ui::AX_EVENT_ALERT: | 179 case ui::AX_EVENT_ALERT: |
| 173 event_id = EVENT_SYSTEM_ALERT; | 180 event_id = EVENT_SYSTEM_ALERT; |
| 174 break; | 181 break; |
| 175 case ui::AX_EVENT_AUTOCORRECTION_OCCURED: | 182 case ui::AX_EVENT_AUTOCORRECTION_OCCURED: |
| 176 event_id = IA2_EVENT_OBJECT_ATTRIBUTE_CHANGED; | 183 event_id = IA2_EVENT_OBJECT_ATTRIBUTE_CHANGED; |
| 177 break; | 184 break; |
| 178 case ui::AX_EVENT_BLUR: | 185 case ui::AX_EVENT_BLUR: |
| 179 // Equivalent to focus on the root. | 186 // Equivalent to focus on the root. |
| 180 event_id = EVENT_OBJECT_FOCUS; | 187 event_id = EVENT_OBJECT_FOCUS; |
| 181 node = GetRoot(); | 188 node = GetRoot(); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 211 node = focus_object; | 218 node = focus_object; |
| 212 event_id = IA2_EVENT_TEXT_CARET_MOVED; | 219 event_id = IA2_EVENT_TEXT_CARET_MOVED; |
| 213 break; | 220 break; |
| 214 } | 221 } |
| 215 default: | 222 default: |
| 216 // Not all WebKit accessibility events result in a Windows | 223 // Not all WebKit accessibility events result in a Windows |
| 217 // accessibility notification. | 224 // accessibility notification. |
| 218 break; | 225 break; |
| 219 } | 226 } |
| 220 | 227 |
| 221 if (!node) | |
| 222 return; | |
| 223 | |
| 224 if (event_id != EVENT_MIN) | 228 if (event_id != EVENT_MIN) |
| 225 MaybeCallNotifyWinEvent(event_id, node); | 229 MaybeCallNotifyWinEvent(event_id, node); |
| 226 | 230 |
| 227 // If this is a layout complete notification (sent when a container scrolls) | 231 // If this is a layout complete notification (sent when a container scrolls) |
| 228 // and there is a descendant tracked object, send a notification on it. | 232 // and there is a descendant tracked object, send a notification on it. |
| 229 // TODO(dmazzoni): remove once http://crbug.com/113483 is fixed. | 233 // TODO(dmazzoni): remove once http://crbug.com/113483 is fixed. |
| 230 if (event_type == ui::AX_EVENT_LAYOUT_COMPLETE && | 234 if (event_type == ui::AX_EVENT_LAYOUT_COMPLETE && |
| 231 tracked_scroll_object_ && | 235 tracked_scroll_object_ && |
| 232 tracked_scroll_object_->IsDescendantOf(node)) { | 236 tracked_scroll_object_->IsDescendantOf(node)) { |
| 233 MaybeCallNotifyWinEvent( | 237 MaybeCallNotifyWinEvent( |
| 234 IA2_EVENT_VISIBLE_DATA_CHANGED, tracked_scroll_object_); | 238 IA2_EVENT_VISIBLE_DATA_CHANGED, tracked_scroll_object_); |
| 235 tracked_scroll_object_->Release(); | 239 tracked_scroll_object_->Release(); |
| 236 tracked_scroll_object_ = NULL; | 240 tracked_scroll_object_ = NULL; |
| 237 } | 241 } |
| 238 } | 242 } |
| 239 | 243 |
| 240 bool BrowserAccessibilityManagerWin::CanFireEvents() { | 244 bool BrowserAccessibilityManagerWin::CanFireEvents() { |
| 241 BrowserAccessibilityDelegate* root_delegate = GetDelegateFromRootManager(); | 245 BrowserAccessibilityDelegate* root_delegate = GetDelegateFromRootManager(); |
| 242 if (!root_delegate) | 246 if (!root_delegate) |
| 243 return false; | 247 return false; |
| 244 HWND hwnd = root_delegate->AccessibilityGetAcceleratedWidget(); | 248 HWND hwnd = root_delegate->AccessibilityGetAcceleratedWidget(); |
| 245 return hwnd != nullptr; | 249 return hwnd != nullptr; |
| 246 } | 250 } |
| 247 | 251 |
| 248 void BrowserAccessibilityManagerWin::FireFocusEvent( | 252 void BrowserAccessibilityManagerWin::FireFocusEvent( |
| 249 BrowserAccessibility* node) { | 253 BrowserAccessibility* node) { |
| 254 DCHECK(node); |
| 250 // On Windows, we always fire a FOCUS event on the root of a frame before | 255 // On Windows, we always fire a FOCUS event on the root of a frame before |
| 251 // firing a focus event within that frame. | 256 // firing a focus event within that frame. |
| 252 if (node->manager() != last_focused_manager_ && | 257 if (node->manager() != last_focused_manager_ && |
| 253 node != node->manager()->GetRoot()) { | 258 node != node->manager()->GetRoot()) { |
| 254 NotifyAccessibilityEvent(ui::AX_EVENT_FOCUS, node->manager()->GetRoot()); | 259 NotifyAccessibilityEvent(ui::AX_EVENT_FOCUS, node->manager()->GetRoot()); |
| 255 } | 260 } |
| 256 | 261 |
| 257 BrowserAccessibilityManager::FireFocusEvent(node); | 262 BrowserAccessibilityManager::FireFocusEvent(node); |
| 258 } | 263 } |
| 259 | 264 |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 335 | 340 |
| 336 void BrowserAccessibilityManagerWin::TrackScrollingObject( | 341 void BrowserAccessibilityManagerWin::TrackScrollingObject( |
| 337 BrowserAccessibilityWin* node) { | 342 BrowserAccessibilityWin* node) { |
| 338 if (tracked_scroll_object_) | 343 if (tracked_scroll_object_) |
| 339 tracked_scroll_object_->Release(); | 344 tracked_scroll_object_->Release(); |
| 340 tracked_scroll_object_ = node; | 345 tracked_scroll_object_ = node; |
| 341 tracked_scroll_object_->AddRef(); | 346 tracked_scroll_object_->AddRef(); |
| 342 } | 347 } |
| 343 | 348 |
| 344 } // namespace content | 349 } // namespace content |
| OLD | NEW |