Chromium Code Reviews| 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 |