OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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_++; | |
469 if (accessibility_reset_count_ >= kMaxAccessibilityResets) { | |
470 Send(new AccessibilityMsg_FatalError(routing_id_)); | |
471 } else { | |
472 Send(new AccessibilityMsg_Reset(routing_id_)); | |
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 Loading... | |
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 LOG(ERROR) << " *** Browser skipping *** "; | |
Mike West
2014/10/02 06:27:48
Perhaps you could consider crashing the renderer i
dmazzoni
2014/10/02 06:40:17
Well, part of the point of this change is to avoid
| |
1054 Send(new AccessibilityMsg_Events_ACK(routing_id_)); | |
1055 return; | |
1056 } | |
1057 waiting_on_accessibility_reset_ = false; | |
1058 | |
1032 RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( | 1059 RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( |
1033 render_view_host_->GetView()); | 1060 render_view_host_->GetView()); |
1034 | 1061 |
1035 AccessibilityMode accessibility_mode = delegate_->GetAccessibilityMode(); | 1062 AccessibilityMode accessibility_mode = delegate_->GetAccessibilityMode(); |
1036 if ((accessibility_mode != AccessibilityModeOff) && view && | 1063 if ((accessibility_mode != AccessibilityModeOff) && view && |
1037 RenderViewHostImpl::IsRVHStateActive(render_view_host_->rvh_state())) { | 1064 RenderViewHostImpl::IsRVHStateActive(render_view_host_->rvh_state())) { |
1038 if (accessibility_mode & AccessibilityModeFlagPlatform) { | 1065 if (accessibility_mode & AccessibilityModeFlagPlatform) { |
1039 GetOrCreateBrowserAccessibilityManager(); | 1066 GetOrCreateBrowserAccessibilityManager(); |
1040 if (browser_accessibility_manager_) | 1067 if (browser_accessibility_manager_) |
1041 browser_accessibility_manager_->OnAccessibilityEvents(params); | 1068 browser_accessibility_manager_->OnAccessibilityEvents(params); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1096 } else { | 1123 } else { |
1097 CHECK(ax_tree_for_testing_->Unserialize(param.update)) | 1124 CHECK(ax_tree_for_testing_->Unserialize(param.update)) |
1098 << ax_tree_for_testing_->error(); | 1125 << ax_tree_for_testing_->error(); |
1099 } | 1126 } |
1100 accessibility_testing_callback_.Run(param.event_type, param.id); | 1127 accessibility_testing_callback_.Run(param.event_type, param.id); |
1101 } | 1128 } |
1102 } | 1129 } |
1103 | 1130 |
1104 void RenderFrameHostImpl::OnAccessibilityLocationChanges( | 1131 void RenderFrameHostImpl::OnAccessibilityLocationChanges( |
1105 const std::vector<AccessibilityHostMsg_LocationChangeParams>& params) { | 1132 const std::vector<AccessibilityHostMsg_LocationChangeParams>& params) { |
1133 if (waiting_on_accessibility_reset_) | |
1134 return; | |
1135 | |
1106 RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( | 1136 RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( |
1107 render_view_host_->GetView()); | 1137 render_view_host_->GetView()); |
1108 if (view && | 1138 if (view && |
1109 RenderViewHostImpl::IsRVHStateActive(render_view_host_->rvh_state())) { | 1139 RenderViewHostImpl::IsRVHStateActive(render_view_host_->rvh_state())) { |
1110 AccessibilityMode accessibility_mode = delegate_->GetAccessibilityMode(); | 1140 AccessibilityMode accessibility_mode = delegate_->GetAccessibilityMode(); |
1111 if (accessibility_mode & AccessibilityModeFlagPlatform) { | 1141 if (accessibility_mode & AccessibilityModeFlagPlatform) { |
1112 if (!browser_accessibility_manager_) { | 1142 if (!browser_accessibility_manager_) { |
1113 browser_accessibility_manager_.reset( | 1143 browser_accessibility_manager_.reset( |
1114 view->CreateBrowserAccessibilityManager(this)); | 1144 view->CreateBrowserAccessibilityManager(this)); |
1115 } | 1145 } |
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1365 const base::Callback<void(ui::AXEvent, int)>& callback) { | 1395 const base::Callback<void(ui::AXEvent, int)>& callback) { |
1366 accessibility_testing_callback_ = callback; | 1396 accessibility_testing_callback_ = callback; |
1367 } | 1397 } |
1368 | 1398 |
1369 const ui::AXTree* RenderFrameHostImpl::GetAXTreeForTesting() { | 1399 const ui::AXTree* RenderFrameHostImpl::GetAXTreeForTesting() { |
1370 return ax_tree_for_testing_.get(); | 1400 return ax_tree_for_testing_.get(); |
1371 } | 1401 } |
1372 | 1402 |
1373 BrowserAccessibilityManager* | 1403 BrowserAccessibilityManager* |
1374 RenderFrameHostImpl::GetOrCreateBrowserAccessibilityManager() { | 1404 RenderFrameHostImpl::GetOrCreateBrowserAccessibilityManager() { |
1405 if (disallow_browser_accessibility_manager_for_testing_) | |
1406 return NULL; | |
Mike West
2014/10/02 06:27:48
Nit: nullptr?
| |
1407 | |
1375 RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( | 1408 RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( |
1376 render_view_host_->GetView()); | 1409 render_view_host_->GetView()); |
1377 if (view && | 1410 if (view && |
1378 !browser_accessibility_manager_) { | 1411 !browser_accessibility_manager_) { |
1379 browser_accessibility_manager_.reset( | 1412 browser_accessibility_manager_.reset( |
1380 view->CreateBrowserAccessibilityManager(this)); | 1413 view->CreateBrowserAccessibilityManager(this)); |
1381 } | 1414 } |
1382 return browser_accessibility_manager_.get(); | 1415 return browser_accessibility_manager_.get(); |
1383 } | 1416 } |
1384 | 1417 |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1464 // Clear any state if a pending navigation is canceled or preempted. | 1497 // Clear any state if a pending navigation is canceled or preempted. |
1465 if (suspended_nav_params_) | 1498 if (suspended_nav_params_) |
1466 suspended_nav_params_.reset(); | 1499 suspended_nav_params_.reset(); |
1467 | 1500 |
1468 TRACE_EVENT_ASYNC_END0("navigation", | 1501 TRACE_EVENT_ASYNC_END0("navigation", |
1469 "RenderFrameHostImpl navigation suspended", this); | 1502 "RenderFrameHostImpl navigation suspended", this); |
1470 navigations_suspended_ = false; | 1503 navigations_suspended_ = false; |
1471 } | 1504 } |
1472 | 1505 |
1473 } // namespace content | 1506 } // namespace content |
OLD | NEW |