Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(10)

Unified Diff: content/browser/accessibility/browser_accessibility_manager_win.cc

Issue 1899823002: Uses the activedescendant_changed event received from Blink to fire the right focus event (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed Mac compilation issue. Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/accessibility/browser_accessibility_manager_win.cc
diff --git a/content/browser/accessibility/browser_accessibility_manager_win.cc b/content/browser/accessibility/browser_accessibility_manager_win.cc
index b3e6613ed10a610f7380ed1c5ff237948b6c536c..f6e5f54b1be3202036260639c399f42153bfca23 100644
--- a/content/browser/accessibility/browser_accessibility_manager_win.cc
+++ b/content/browser/accessibility/browser_accessibility_manager_win.cc
@@ -136,9 +136,27 @@ void BrowserAccessibilityManagerWin::UserIsReloading() {
MaybeCallNotifyWinEvent(IA2_EVENT_DOCUMENT_RELOAD, GetRoot());
}
+BrowserAccessibility* BrowserAccessibilityManagerWin::GetFocus() {
+ BrowserAccessibility* node = BrowserAccessibilityManager::GetFocus();
+
+ // Combo boxes have an invisible list inside them which tracks the active list
dmazzoni 2016/04/29 20:55:54 Isn't the combo box itself supposed to have active
+ // item.
+ if (node && node->GetRole() == ui::AX_ROLE_COMBO_BOX) {
dmazzoni 2016/04/29 20:55:54 Same here, only if combo box is editable?
+ BrowserAccessibility* child = node->InternalGetChild(0);
+ if (child && child->GetRole() == ui::AX_ROLE_LIST) {
+ BrowserAccessibility* active_list_item = GetActiveDescendantFocus(child);
+ if (active_list_item != child)
+ return active_list_item;
+ }
+ }
+
+ return GetActiveDescendantFocus(node);
+}
+
void BrowserAccessibilityManagerWin::NotifyAccessibilityEvent(
ui::AXEvent event_type,
BrowserAccessibility* node) {
+ DCHECK(node);
BrowserAccessibilityDelegate* root_delegate = GetDelegateFromRootManager();
if (!root_delegate || !root_delegate->AccessibilityGetAcceleratedWidget()) {
DLOG(WARNING) << "Not firing AX event because of no root_delegate or hwnd";
@@ -157,9 +175,10 @@ void BrowserAccessibilityManagerWin::NotifyAccessibilityEvent(
LONG event_id = EVENT_MIN;
switch (event_type) {
- case ui::AX_EVENT_ACTIVEDESCENDANTCHANGED:
+ case ui::AX_EVENT_ACTIVEDESCENDANTCHANGED: {
event_id = IA2_EVENT_ACTIVE_DESCENDANT_CHANGED;
break;
+ }
case ui::AX_EVENT_ALERT:
event_id = EVENT_SYSTEM_ALERT;
break;
@@ -209,9 +228,6 @@ void BrowserAccessibilityManagerWin::NotifyAccessibilityEvent(
break;
}
- if (!node)
- return;
-
if (event_id != EVENT_MIN)
MaybeCallNotifyWinEvent(event_id, node);
@@ -238,6 +254,7 @@ bool BrowserAccessibilityManagerWin::CanFireEvents() {
void BrowserAccessibilityManagerWin::FireFocusEvent(
BrowserAccessibility* node) {
+ DCHECK(node);
// On Windows, we always fire a FOCUS event on the root of a frame before
// firing a focus event within that frame.
if (node->manager() != last_focused_manager_ &&

Powered by Google App Engine
This is Rietveld 408576698