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

Side by Side Diff: content/browser/frame_host/render_frame_host_impl.cc

Issue 625443002: Reset accessibility if it gets out of sync. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove log Created 6 years, 2 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 unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/frame_host/render_frame_host_impl.h" 5 #include "content/browser/frame_host/render_frame_host_impl.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/containers/hash_tables.h" 9 #include "base/containers/hash_tables.h"
10 #include "base/lazy_instance.h" 10 #include "base/lazy_instance.h"
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 #if defined(OS_MACOSX) 61 #if defined(OS_MACOSX)
62 #include "content/browser/frame_host/popup_menu_helper_mac.h" 62 #include "content/browser/frame_host/popup_menu_helper_mac.h"
63 #endif 63 #endif
64 64
65 using base::TimeDelta; 65 using base::TimeDelta;
66 66
67 namespace content { 67 namespace content {
68 68
69 namespace { 69 namespace {
70 70
71 // An accessibility reset is only allowed to prevent very rare corner cases
72 // or race conditions where the browser and renderer get out of sync. If
73 // this happens more than this many times, kill the renderer.
74 const int kMaxAccessibilityResets = 5;
75
71 // The (process id, routing id) pair that identifies one RenderFrame. 76 // The (process id, routing id) pair that identifies one RenderFrame.
72 typedef std::pair<int32, int32> RenderFrameHostID; 77 typedef std::pair<int32, int32> RenderFrameHostID;
73 typedef base::hash_map<RenderFrameHostID, RenderFrameHostImpl*> 78 typedef base::hash_map<RenderFrameHostID, RenderFrameHostImpl*>
74 RoutingIDFrameMap; 79 RoutingIDFrameMap;
75 base::LazyInstance<RoutingIDFrameMap> g_routing_id_frame_map = 80 base::LazyInstance<RoutingIDFrameMap> g_routing_id_frame_map =
76 LAZY_INSTANCE_INITIALIZER; 81 LAZY_INSTANCE_INITIALIZER;
77 82
78 class DesktopNotificationDelegateImpl : public DesktopNotificationDelegate { 83 class DesktopNotificationDelegateImpl : public DesktopNotificationDelegate {
79 public: 84 public:
80 DesktopNotificationDelegateImpl(RenderFrameHost* render_frame_host, 85 DesktopNotificationDelegateImpl(RenderFrameHost* render_frame_host,
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
173 : render_view_host_(render_view_host), 178 : render_view_host_(render_view_host),
174 delegate_(delegate), 179 delegate_(delegate),
175 cross_process_frame_connector_(NULL), 180 cross_process_frame_connector_(NULL),
176 render_frame_proxy_host_(NULL), 181 render_frame_proxy_host_(NULL),
177 frame_tree_(frame_tree), 182 frame_tree_(frame_tree),
178 frame_tree_node_(frame_tree_node), 183 frame_tree_node_(frame_tree_node),
179 routing_id_(routing_id), 184 routing_id_(routing_id),
180 is_swapped_out_(is_swapped_out), 185 is_swapped_out_(is_swapped_out),
181 render_frame_created_(false), 186 render_frame_created_(false),
182 navigations_suspended_(false), 187 navigations_suspended_(false),
188 waiting_on_accessibility_reset_(false),
189 accessibility_reset_count_(0),
190 disallow_browser_accessibility_manager_for_testing_(false),
183 weak_ptr_factory_(this) { 191 weak_ptr_factory_(this) {
184 frame_tree_->RegisterRenderFrameHost(this); 192 frame_tree_->RegisterRenderFrameHost(this);
185 GetProcess()->AddRoute(routing_id_, this); 193 GetProcess()->AddRoute(routing_id_, this);
186 g_routing_id_frame_map.Get().insert(std::make_pair( 194 g_routing_id_frame_map.Get().insert(std::make_pair(
187 RenderFrameHostID(GetProcess()->GetID(), routing_id_), 195 RenderFrameHostID(GetProcess()->GetID(), routing_id_),
188 this)); 196 this));
189 197
190 if (GetProcess()->GetServiceRegistry()) { 198 if (GetProcess()->GetServiceRegistry()) {
191 RenderFrameSetupPtr setup; 199 RenderFrameSetupPtr setup;
192 GetProcess()->GetServiceRegistry()->ConnectToRemoteService(&setup); 200 GetProcess()->GetServiceRegistry()->ConnectToRemoteService(&setup);
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after
446 if (view) 454 if (view)
447 return view->AccessibilityOriginInScreen(bounds); 455 return view->AccessibilityOriginInScreen(bounds);
448 return gfx::Point(); 456 return gfx::Point();
449 } 457 }
450 458
451 void RenderFrameHostImpl::AccessibilityHitTest(const gfx::Point& point) { 459 void RenderFrameHostImpl::AccessibilityHitTest(const gfx::Point& point) {
452 Send(new AccessibilityMsg_HitTest(routing_id_, point)); 460 Send(new AccessibilityMsg_HitTest(routing_id_, point));
453 } 461 }
454 462
455 void RenderFrameHostImpl::AccessibilityFatalError() { 463 void RenderFrameHostImpl::AccessibilityFatalError() {
456 Send(new AccessibilityMsg_FatalError(routing_id_));
457 browser_accessibility_manager_.reset(NULL); 464 browser_accessibility_manager_.reset(NULL);
465 if (waiting_on_accessibility_reset_)
466 return;
467
468 accessibility_reset_count_++;
nasko 2014/10/02 16:38:48 This is never reset to 0, even when the renderer i
dmazzoni 2014/10/02 21:51:12 Good point. I reset it in OnDidStartProvisionalLoa
469 if (accessibility_reset_count_ >= kMaxAccessibilityResets) {
470 Send(new AccessibilityMsg_FatalError(routing_id_));
471 } else {
472 Send(new AccessibilityMsg_Reset(routing_id_));
nasko 2014/10/02 16:38:48 Do you want to UMA stat how often this happens? Ac
dmazzoni 2014/10/02 21:51:12 Great idea. I added three counts that should be en
473 waiting_on_accessibility_reset_ = true;
474 }
458 } 475 }
459 476
460 gfx::AcceleratedWidget 477 gfx::AcceleratedWidget
461 RenderFrameHostImpl::AccessibilityGetAcceleratedWidget() { 478 RenderFrameHostImpl::AccessibilityGetAcceleratedWidget() {
462 RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( 479 RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>(
463 render_view_host_->GetView()); 480 render_view_host_->GetView());
464 if (view) 481 if (view)
465 return view->AccessibilityGetAcceleratedWidget(); 482 return view->AccessibilityGetAcceleratedWidget();
466 return gfx::kNullAcceleratedWidget; 483 return gfx::kNullAcceleratedWidget;
467 } 484 }
(...skipping 553 matching lines...) Expand 10 before | Expand all | Expand 10 after
1021 } 1038 }
1022 1039
1023 void RenderFrameHostImpl::OnBeginNavigation( 1040 void RenderFrameHostImpl::OnBeginNavigation(
1024 const FrameHostMsg_BeginNavigation_Params& params) { 1041 const FrameHostMsg_BeginNavigation_Params& params) {
1025 CHECK(CommandLine::ForCurrentProcess()->HasSwitch( 1042 CHECK(CommandLine::ForCurrentProcess()->HasSwitch(
1026 switches::kEnableBrowserSideNavigation)); 1043 switches::kEnableBrowserSideNavigation));
1027 frame_tree_node()->render_manager()->OnBeginNavigation(params); 1044 frame_tree_node()->render_manager()->OnBeginNavigation(params);
1028 } 1045 }
1029 1046
1030 void RenderFrameHostImpl::OnAccessibilityEvents( 1047 void RenderFrameHostImpl::OnAccessibilityEvents(
1031 const std::vector<AccessibilityHostMsg_EventParams>& params) { 1048 const std::vector<AccessibilityHostMsg_EventParams>& params,
1049 bool is_reset) {
1050 // Don't process this IPC if either we're waiting on a reset and this
1051 // isn't a reset, or if we're not waiting on a reset but this is a reset.
1052 if (waiting_on_accessibility_reset_ != is_reset) {
1053 Send(new AccessibilityMsg_Events_ACK(routing_id_));
1054 return;
1055 }
1056 waiting_on_accessibility_reset_ = false;
1057
1032 RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( 1058 RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>(
1033 render_view_host_->GetView()); 1059 render_view_host_->GetView());
1034 1060
1035 AccessibilityMode accessibility_mode = delegate_->GetAccessibilityMode(); 1061 AccessibilityMode accessibility_mode = delegate_->GetAccessibilityMode();
1036 if ((accessibility_mode != AccessibilityModeOff) && view && 1062 if ((accessibility_mode != AccessibilityModeOff) && view &&
1037 RenderViewHostImpl::IsRVHStateActive(render_view_host_->rvh_state())) { 1063 RenderViewHostImpl::IsRVHStateActive(render_view_host_->rvh_state())) {
1038 if (accessibility_mode & AccessibilityModeFlagPlatform) { 1064 if (accessibility_mode & AccessibilityModeFlagPlatform) {
1039 GetOrCreateBrowserAccessibilityManager(); 1065 GetOrCreateBrowserAccessibilityManager();
1040 if (browser_accessibility_manager_) 1066 if (browser_accessibility_manager_)
1041 browser_accessibility_manager_->OnAccessibilityEvents(params); 1067 browser_accessibility_manager_->OnAccessibilityEvents(params);
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1096 } else { 1122 } else {
1097 CHECK(ax_tree_for_testing_->Unserialize(param.update)) 1123 CHECK(ax_tree_for_testing_->Unserialize(param.update))
1098 << ax_tree_for_testing_->error(); 1124 << ax_tree_for_testing_->error();
1099 } 1125 }
1100 accessibility_testing_callback_.Run(param.event_type, param.id); 1126 accessibility_testing_callback_.Run(param.event_type, param.id);
1101 } 1127 }
1102 } 1128 }
1103 1129
1104 void RenderFrameHostImpl::OnAccessibilityLocationChanges( 1130 void RenderFrameHostImpl::OnAccessibilityLocationChanges(
1105 const std::vector<AccessibilityHostMsg_LocationChangeParams>& params) { 1131 const std::vector<AccessibilityHostMsg_LocationChangeParams>& params) {
1132 if (waiting_on_accessibility_reset_)
1133 return;
1134
1106 RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( 1135 RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>(
1107 render_view_host_->GetView()); 1136 render_view_host_->GetView());
1108 if (view && 1137 if (view &&
1109 RenderViewHostImpl::IsRVHStateActive(render_view_host_->rvh_state())) { 1138 RenderViewHostImpl::IsRVHStateActive(render_view_host_->rvh_state())) {
1110 AccessibilityMode accessibility_mode = delegate_->GetAccessibilityMode(); 1139 AccessibilityMode accessibility_mode = delegate_->GetAccessibilityMode();
1111 if (accessibility_mode & AccessibilityModeFlagPlatform) { 1140 if (accessibility_mode & AccessibilityModeFlagPlatform) {
1112 if (!browser_accessibility_manager_) { 1141 if (!browser_accessibility_manager_) {
1113 browser_accessibility_manager_.reset( 1142 browser_accessibility_manager_.reset(
1114 view->CreateBrowserAccessibilityManager(this)); 1143 view->CreateBrowserAccessibilityManager(this));
1115 } 1144 }
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after
1365 const base::Callback<void(ui::AXEvent, int)>& callback) { 1394 const base::Callback<void(ui::AXEvent, int)>& callback) {
1366 accessibility_testing_callback_ = callback; 1395 accessibility_testing_callback_ = callback;
1367 } 1396 }
1368 1397
1369 const ui::AXTree* RenderFrameHostImpl::GetAXTreeForTesting() { 1398 const ui::AXTree* RenderFrameHostImpl::GetAXTreeForTesting() {
1370 return ax_tree_for_testing_.get(); 1399 return ax_tree_for_testing_.get();
1371 } 1400 }
1372 1401
1373 BrowserAccessibilityManager* 1402 BrowserAccessibilityManager*
1374 RenderFrameHostImpl::GetOrCreateBrowserAccessibilityManager() { 1403 RenderFrameHostImpl::GetOrCreateBrowserAccessibilityManager() {
1404 if (disallow_browser_accessibility_manager_for_testing_)
1405 return NULL;
1406
1375 RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( 1407 RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>(
1376 render_view_host_->GetView()); 1408 render_view_host_->GetView());
1377 if (view && 1409 if (view &&
1378 !browser_accessibility_manager_) { 1410 !browser_accessibility_manager_) {
1379 browser_accessibility_manager_.reset( 1411 browser_accessibility_manager_.reset(
1380 view->CreateBrowserAccessibilityManager(this)); 1412 view->CreateBrowserAccessibilityManager(this));
1381 } 1413 }
1382 return browser_accessibility_manager_.get(); 1414 return browser_accessibility_manager_.get();
1383 } 1415 }
1384 1416
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
1464 // Clear any state if a pending navigation is canceled or preempted. 1496 // Clear any state if a pending navigation is canceled or preempted.
1465 if (suspended_nav_params_) 1497 if (suspended_nav_params_)
1466 suspended_nav_params_.reset(); 1498 suspended_nav_params_.reset();
1467 1499
1468 TRACE_EVENT_ASYNC_END0("navigation", 1500 TRACE_EVENT_ASYNC_END0("navigation",
1469 "RenderFrameHostImpl navigation suspended", this); 1501 "RenderFrameHostImpl navigation suspended", this);
1470 navigations_suspended_ = false; 1502 navigations_suspended_ = false;
1471 } 1503 }
1472 1504
1473 } // namespace content 1505 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698