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

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

Issue 1815933002: Fix WebView accessibility (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rename set_browser_plugin_embedder_ax_tree_id Created 4 years, 9 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.cc
diff --git a/content/browser/accessibility/browser_accessibility_manager.cc b/content/browser/accessibility/browser_accessibility_manager.cc
index f2d4da7d24d9600734b5d83f294b571ceab818e9..db169daf95bcf419160c1d3682024c7c3c7db71f 100644
--- a/content/browser/accessibility/browser_accessibility_manager.cc
+++ b/content/browser/accessibility/browser_accessibility_manager.cc
@@ -43,6 +43,10 @@ using AXTreeIDMap =
base::hash_map<AXTreeIDRegistry::AXTreeID, BrowserAccessibilityManager*>;
base::LazyInstance<AXTreeIDMap> g_ax_tree_id_map = LAZY_INSTANCE_INITIALIZER;
+// A function to call when focus changes, for testing only.
+base::LazyInstance<base::Closure> g_focus_change_callback_for_testing =
+ LAZY_INSTANCE_INITIALIZER;
+
ui::AXTreeUpdate MakeAXTreeUpdate(
const ui::AXNodeData& node1,
const ui::AXNodeData& node2 /* = ui::AXNodeData() */,
@@ -179,11 +183,17 @@ BrowserAccessibilityManager::GetEmptyDocument() {
void BrowserAccessibilityManager::FireFocusEventsIfNeeded() {
BrowserAccessibility* focus = GetFocus();
- if (delegate_ && !delegate_->AccessibilityViewHasFocus())
- focus = nullptr;
- if (!CanFireEvents())
- focus = nullptr;
+ // Don't fire focus events if the window itself doesn't have focus.
+ // Bypass this check if a global focus listener was set up for testing
+ // so that the test passes whether the window is active or not.
+ if (!g_focus_change_callback_for_testing.Pointer()) {
+ if (delegate_ && !delegate_->AccessibilityViewHasFocus())
+ focus = nullptr;
+
+ if (!CanFireEvents())
+ focus = nullptr;
+ }
// Don't allow the document to be focused if it has no children and
// hasn't finished loading yet. Wait for at least a tiny bit of content,
@@ -209,6 +219,9 @@ bool BrowserAccessibilityManager::CanFireEvents() {
void BrowserAccessibilityManager::FireFocusEvent(BrowserAccessibility* node) {
NotifyAccessibilityEvent(ui::AX_EVENT_FOCUS, node);
+
+ if (!g_focus_change_callback_for_testing.Get().is_null())
+ g_focus_change_callback_for_testing.Get().Run();
}
BrowserAccessibility* BrowserAccessibilityManager::GetRoot() {
@@ -456,17 +469,22 @@ BrowserAccessibility* BrowserAccessibilityManager::GetFocus() {
if (!focused_manager)
focused_manager = root_manager;
- int32_t focus_id = focused_manager->GetTreeData().focus_id;
- BrowserAccessibility* obj = focused_manager->GetFromID(focus_id);
+ return focused_manager->GetFocusFromThisOrDescendantFrame();
+}
+
+BrowserAccessibility*
+BrowserAccessibilityManager::GetFocusFromThisOrDescendantFrame() {
+ int32_t focus_id = GetTreeData().focus_id;
+ BrowserAccessibility* obj = GetFromID(focus_id);
if (!obj)
- return focused_manager->GetRoot();
+ return GetRoot();
if (obj->HasIntAttribute(ui::AX_ATTR_CHILD_TREE_ID)) {
BrowserAccessibilityManager* child_manager =
BrowserAccessibilityManager::FromID(
obj->GetIntAttribute(ui::AX_ATTR_CHILD_TREE_ID));
if (child_manager)
- return child_manager->GetFocus();
+ return child_manager->GetFocusFromThisOrDescendantFrame();
}
return obj;
@@ -484,6 +502,12 @@ void BrowserAccessibilityManager::SetFocusLocallyForTesting(
tree_->UpdateData(data);
}
+// static
+void BrowserAccessibilityManager::SetFocusChangeCallbackForTesting(
+ const base::Closure& callback) {
+ g_focus_change_callback_for_testing.Get() = callback;
+}
+
void BrowserAccessibilityManager::DoDefaultAction(
const BrowserAccessibility& node) {
if (delegate_)
« no previous file with comments | « content/browser/accessibility/browser_accessibility_manager.h ('k') | content/browser/frame_host/render_frame_host_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698