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

Unified Diff: content/browser/renderer_host/render_view_host_impl.cc

Issue 268543008: Cross-process iframe accessibility. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 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/renderer_host/render_view_host_impl.cc
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc
index 113661648f47c297310b2eaa34e026c11805e771..3c02297bf57a83edfe0184275808495b5f56ca4b 100644
--- a/content/browser/renderer_host/render_view_host_impl.cc
+++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -24,10 +24,13 @@
#include "base/values.h"
#include "cc/base/switches.h"
#include "content/browser/accessibility/browser_accessibility_manager.h"
+#include "content/browser/accessibility/frame_tree_accessibility.h"
#include "content/browser/child_process_security_policy_impl.h"
#include "content/browser/cross_site_request_manager.h"
#include "content/browser/dom_storage/session_storage_namespace_impl.h"
+#include "content/browser/frame_host/cross_process_frame_connector.h"
#include "content/browser/frame_host/frame_tree.h"
+#include "content/browser/frame_host/render_widget_host_view_child_frame.h"
#include "content/browser/gpu/compositor_util.h"
#include "content/browser/gpu/gpu_data_manager_impl.h"
#include "content/browser/gpu/gpu_process_host.h"
@@ -242,6 +245,8 @@ RenderViewHostImpl::RenderViewHostImpl(
unload_event_monitor_timeout_.reset(new TimeoutMonitor(base::Bind(
&RenderViewHostImpl::OnSwappedOut, weak_factory_.GetWeakPtr(), true)));
+
+ FrameTreeAccessibility::GetInstance()->OnFrameCreated(this);
}
RenderViewHostImpl::~RenderViewHostImpl() {
@@ -263,6 +268,8 @@ RenderViewHostImpl::~RenderViewHostImpl() {
// count of the SiteInstance it belongs to.
if (IsRVHStateActive(rvh_state_))
instance_->decrement_active_view_count();
+
+ FrameTreeAccessibility::GetInstance()->OnFrameDeleted(this);
}
RenderViewHostDelegate* RenderViewHostImpl::GetDelegate() const {
@@ -1601,18 +1608,61 @@ void RenderViewHostImpl::NotifyMoveOrResizeStarted() {
Send(new ViewMsg_MoveOrResizeStarted(GetRoutingID()));
}
+static int GetAccessibleFrameId(int process_id, int frame_routing_id) {
+ RenderFrameHostImpl* render_frame_host = RenderFrameHostImpl::FromID(
+ process_id, frame_routing_id);
+ if (render_frame_host) {
+ CrossProcessFrameConnector* connector =
+ render_frame_host->cross_process_frame_connector();
+ if (connector) {
+ RenderWidgetHostViewChildFrame* view = connector->view();
+ if (view) {
+ RenderWidgetHostImpl* rwhi =
+ RenderWidgetHostImpl::From(view->GetRenderWidgetHost());
+ return FrameTreeAccessibility::GetInstance()->GetFrameId(rwhi);
+ }
+ }
+ }
+
+ return 0;
+}
+
void RenderViewHostImpl::OnAccessibilityEvents(
const std::vector<AccessibilityHostMsg_EventParams>& params) {
+ BrowserAccessibilityManager* manager = NULL;
if ((accessibility_mode() != AccessibilityModeOff) && view_ &&
IsRVHStateActive(rvh_state_)) {
+ // Send the updates to the BrowserAccessibilityManager to support
+ // native accessibility APIs.
if (accessibility_mode() & AccessibilityModeFlagPlatform) {
view_->CreateBrowserAccessibilityManagerIfNeeded();
- BrowserAccessibilityManager* manager =
- view_->GetBrowserAccessibilityManager();
- if (manager)
+ manager = view_->GetBrowserAccessibilityManager();
+ if (manager) {
manager->OnAccessibilityEvents(params);
+ FrameTreeAccessibility::GetInstance()->SetFrameAccessibilityManager(
+ this, manager);
+ }
+ }
+
+ // Map from guest instance ids (for a <webview> plug-in) and
+ // frame routing ids (from out-of-process iframes) to accessibility
+ // frame ids.
+ std::map<int32, int>::const_iterator iter;
+ for (unsigned int i = 0; i < params.size(); ++i) {
+ const AccessibilityHostMsg_EventParams& param = params[i];
+ for (iter = param.frame_routing_ids.begin();
+ iter != param.frame_routing_ids.end();
ncarter (slow) 2014/05/02 19:10:02 Nothing happens with param.guest_instance_ids here
+ ++iter) {
+ int32 node_id = iter->first;
+ int frame_routing_id = iter->second;
+ int accessible_frame_id = GetAccessibleFrameId(
+ GetProcess()->GetID(), frame_routing_id);
+ if (manager && accessible_frame_id)
+ manager->SetChildFrameId(node_id, accessible_frame_id);
+ }
}
+ // Send the updates to the automation extension API.
std::vector<AXEventNotificationDetails> details;
for (unsigned int i = 0; i < params.size(); ++i) {
const AccessibilityHostMsg_EventParams& param = params[i];
@@ -1623,7 +1673,6 @@ void RenderViewHostImpl::OnAccessibilityEvents(
GetRoutingID());
details.push_back(detail);
}
-
delegate_->AccessibilityEventReceived(details);
}
@@ -1639,10 +1688,16 @@ void RenderViewHostImpl::OnAccessibilityEvents(
const AccessibilityHostMsg_EventParams& param = params[i];
if (static_cast<int>(param.event_type) < 0)
continue;
- if (!ax_tree_)
- ax_tree_.reset(new ui::AXTree(param.update));
- else
+ if (!ax_tree_) {
+ if (manager) {
+ ax_tree_.reset(new ui::AXTree(manager->SnapshotAXTreeForTesting()));
ncarter (slow) 2014/05/02 19:10:02 What prevents this ForTesting() path from becoming
+ } else {
+ ax_tree_.reset(new ui::AXTree());
+ CHECK(ax_tree_->Unserialize(param.update)) << ax_tree_->error();
+ }
+ } else {
CHECK(ax_tree_->Unserialize(param.update)) << ax_tree_->error();
+ }
accessibility_testing_callback_.Run(param.event_type);
}
}

Powered by Google App Engine
This is Rietveld 408576698