Index: content/browser/frame_host/render_frame_host_impl.cc |
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc |
index 3b619f154c6fca9d60b09d3a99f30145ba36c663..705ab3aaaaab637a91fe8a2a1efacb145135fcd6 100644 |
--- a/content/browser/frame_host/render_frame_host_impl.cc |
+++ b/content/browser/frame_host/render_frame_host_impl.cc |
@@ -1630,8 +1630,8 @@ void RenderFrameHostImpl::OnAccessibilityEvents( |
detail.ax_tree_id = GetAXTreeID(); |
if (param.update.has_tree_data) { |
detail.update.has_tree_data = true; |
- AXContentTreeDataToAXTreeData(param.update.tree_data, |
- &detail.update.tree_data); |
+ ax_content_tree_data_ = param.update.tree_data; |
+ AXContentTreeDataToAXTreeData(&detail.update.tree_data); |
} |
detail.update.node_id_to_clear = param.update.node_id_to_clear; |
detail.update.nodes.resize(param.update.nodes.size()); |
@@ -1724,8 +1724,8 @@ void RenderFrameHostImpl::OnAccessibilitySnapshotResponse( |
&dst_snapshot.nodes[i]); |
} |
if (snapshot.has_tree_data) { |
- AXContentTreeDataToAXTreeData(snapshot.tree_data, |
- &dst_snapshot.tree_data); |
+ ax_content_tree_data_ = snapshot.tree_data; |
+ AXContentTreeDataToAXTreeData(&dst_snapshot.tree_data); |
dst_snapshot.has_tree_data = true; |
} |
it->second.Run(dst_snapshot); |
@@ -2343,6 +2343,27 @@ void RenderFrameHostImpl::SetAccessibilityCallbackForTesting( |
accessibility_testing_callback_ = callback; |
} |
+void RenderFrameHostImpl::UpdateAXTreeData() { |
+ AccessibilityMode accessibility_mode = delegate_->GetAccessibilityMode(); |
+ if (accessibility_mode == AccessibilityModeOff || |
+ !RenderFrameHostImpl::IsRFHStateActive(rfh_state())) { |
+ return; |
+ } |
+ |
+ std::vector<AXEventNotificationDetails> details; |
+ details.reserve(1U); |
+ AXEventNotificationDetails detail; |
+ detail.ax_tree_id = GetAXTreeID(); |
+ detail.update.has_tree_data = true; |
+ AXContentTreeDataToAXTreeData(&detail.update.tree_data); |
+ details.push_back(detail); |
+ |
+ if (browser_accessibility_manager_) |
+ browser_accessibility_manager_->OnAccessibilityEvents(details); |
+ |
+ delegate_->AccessibilityEventReceived(details); |
+} |
+ |
void RenderFrameHostImpl::SetTextTrackSettings( |
const FrameMsg_TextTrackSettings_Params& params) { |
DCHECK(!GetParent()); |
@@ -2625,8 +2646,9 @@ void RenderFrameHostImpl::AXContentNodeDataToAXNodeData( |
} |
void RenderFrameHostImpl::AXContentTreeDataToAXTreeData( |
- const AXContentTreeData& src, |
ui::AXTreeData* dst) { |
+ const AXContentTreeData& src = ax_content_tree_data_; |
+ |
// Copy the common fields. |
*dst = src; |
@@ -2635,6 +2657,19 @@ void RenderFrameHostImpl::AXContentTreeDataToAXTreeData( |
if (src.parent_routing_id != -1) |
dst->parent_tree_id = RoutingIDToAXTreeID(src.parent_routing_id); |
+ |
+ // If this is not the root frame tree node, we're done. |
+ if (frame_tree_node()->parent()) |
+ return; |
+ |
+ // For the root frame tree node, also store the AXTreeID of the focused frame. |
+ FrameTreeNode* focused_frame_tree_node = frame_tree_->GetFocusedFrame(); |
+ if (!focused_frame_tree_node) |
+ return; |
+ RenderFrameHostImpl* focused_frame = |
+ focused_frame_tree_node->current_frame_host(); |
+ DCHECK(focused_frame); |
+ dst->focused_tree_id = focused_frame->GetAXTreeID(); |
} |
} // namespace content |