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 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
63 #if defined(OS_MACOSX) | 63 #if defined(OS_MACOSX) |
64 #include "content/browser/frame_host/popup_menu_helper_mac.h" | 64 #include "content/browser/frame_host/popup_menu_helper_mac.h" |
65 #endif | 65 #endif |
66 | 66 |
67 using base::TimeDelta; | 67 using base::TimeDelta; |
68 | 68 |
69 namespace content { | 69 namespace content { |
70 | 70 |
71 namespace { | 71 namespace { |
72 | 72 |
| 73 // The next value to use for the accessibility reset token. |
| 74 int g_next_accessibility_reset_token = 1; |
| 75 |
73 // The (process id, routing id) pair that identifies one RenderFrame. | 76 // The (process id, routing id) pair that identifies one RenderFrame. |
74 typedef std::pair<int32, int32> RenderFrameHostID; | 77 typedef std::pair<int32, int32> RenderFrameHostID; |
75 typedef base::hash_map<RenderFrameHostID, RenderFrameHostImpl*> | 78 typedef base::hash_map<RenderFrameHostID, RenderFrameHostImpl*> |
76 RoutingIDFrameMap; | 79 RoutingIDFrameMap; |
77 base::LazyInstance<RoutingIDFrameMap> g_routing_id_frame_map = | 80 base::LazyInstance<RoutingIDFrameMap> g_routing_id_frame_map = |
78 LAZY_INSTANCE_INITIALIZER; | 81 LAZY_INSTANCE_INITIALIZER; |
79 | 82 |
80 class DesktopNotificationDelegateImpl : public DesktopNotificationDelegate { | 83 class DesktopNotificationDelegateImpl : public DesktopNotificationDelegate { |
81 public: | 84 public: |
82 DesktopNotificationDelegateImpl(RenderFrameHost* render_frame_host, | 85 DesktopNotificationDelegateImpl(RenderFrameHost* render_frame_host, |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
182 delegate_(delegate), | 185 delegate_(delegate), |
183 cross_process_frame_connector_(NULL), | 186 cross_process_frame_connector_(NULL), |
184 render_frame_proxy_host_(NULL), | 187 render_frame_proxy_host_(NULL), |
185 frame_tree_(frame_tree), | 188 frame_tree_(frame_tree), |
186 frame_tree_node_(frame_tree_node), | 189 frame_tree_node_(frame_tree_node), |
187 routing_id_(routing_id), | 190 routing_id_(routing_id), |
188 render_frame_created_(false), | 191 render_frame_created_(false), |
189 navigations_suspended_(false), | 192 navigations_suspended_(false), |
190 is_waiting_for_beforeunload_ack_(false), | 193 is_waiting_for_beforeunload_ack_(false), |
191 unload_ack_is_for_cross_site_transition_(false), | 194 unload_ack_is_for_cross_site_transition_(false), |
| 195 accessibility_reset_token_(0), |
| 196 accessibility_reset_count_(0), |
| 197 no_create_browser_accessibility_manager_for_testing_(false), |
192 weak_ptr_factory_(this) { | 198 weak_ptr_factory_(this) { |
193 frame_tree_->RegisterRenderFrameHost(this); | 199 frame_tree_->RegisterRenderFrameHost(this); |
194 GetProcess()->AddRoute(routing_id_, this); | 200 GetProcess()->AddRoute(routing_id_, this); |
195 g_routing_id_frame_map.Get().insert(std::make_pair( | 201 g_routing_id_frame_map.Get().insert(std::make_pair( |
196 RenderFrameHostID(GetProcess()->GetID(), routing_id_), | 202 RenderFrameHostID(GetProcess()->GetID(), routing_id_), |
197 this)); | 203 this)); |
198 | 204 |
199 if (is_swapped_out) { | 205 if (is_swapped_out) { |
200 rfh_state_ = STATE_SWAPPED_OUT; | 206 rfh_state_ = STATE_SWAPPED_OUT; |
201 } else { | 207 } else { |
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
472 if (view) | 478 if (view) |
473 return view->AccessibilityOriginInScreen(bounds); | 479 return view->AccessibilityOriginInScreen(bounds); |
474 return gfx::Point(); | 480 return gfx::Point(); |
475 } | 481 } |
476 | 482 |
477 void RenderFrameHostImpl::AccessibilityHitTest(const gfx::Point& point) { | 483 void RenderFrameHostImpl::AccessibilityHitTest(const gfx::Point& point) { |
478 Send(new AccessibilityMsg_HitTest(routing_id_, point)); | 484 Send(new AccessibilityMsg_HitTest(routing_id_, point)); |
479 } | 485 } |
480 | 486 |
481 void RenderFrameHostImpl::AccessibilityFatalError() { | 487 void RenderFrameHostImpl::AccessibilityFatalError() { |
482 Send(new AccessibilityMsg_FatalError(routing_id_)); | |
483 browser_accessibility_manager_.reset(NULL); | 488 browser_accessibility_manager_.reset(NULL); |
| 489 if (accessibility_reset_token_) |
| 490 return; |
| 491 |
| 492 accessibility_reset_count_++; |
| 493 if (accessibility_reset_count_ >= kMaxAccessibilityResets) { |
| 494 Send(new AccessibilityMsg_FatalError(routing_id_)); |
| 495 } else { |
| 496 accessibility_reset_token_ = g_next_accessibility_reset_token++; |
| 497 UMA_HISTOGRAM_COUNTS("Accessibility.FrameResetCount", 1); |
| 498 Send(new AccessibilityMsg_Reset(routing_id_, accessibility_reset_token_)); |
| 499 } |
484 } | 500 } |
485 | 501 |
486 gfx::AcceleratedWidget | 502 gfx::AcceleratedWidget |
487 RenderFrameHostImpl::AccessibilityGetAcceleratedWidget() { | 503 RenderFrameHostImpl::AccessibilityGetAcceleratedWidget() { |
488 RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( | 504 RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( |
489 render_view_host_->GetView()); | 505 render_view_host_->GetView()); |
490 if (view) | 506 if (view) |
491 return view->AccessibilityGetAcceleratedWidget(); | 507 return view->AccessibilityGetAcceleratedWidget(); |
492 return gfx::kNullAcceleratedWidget; | 508 return gfx::kNullAcceleratedWidget; |
493 } | 509 } |
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
749 process->FilterURL(true, &validated_params.searchable_form_url); | 765 process->FilterURL(true, &validated_params.searchable_form_url); |
750 | 766 |
751 // Without this check, the renderer can trick the browser into using | 767 // Without this check, the renderer can trick the browser into using |
752 // filenames it can't access in a future session restore. | 768 // filenames it can't access in a future session restore. |
753 if (!render_view_host_->CanAccessFilesOfPageState( | 769 if (!render_view_host_->CanAccessFilesOfPageState( |
754 validated_params.page_state)) { | 770 validated_params.page_state)) { |
755 GetProcess()->ReceivedBadMessage(); | 771 GetProcess()->ReceivedBadMessage(); |
756 return; | 772 return; |
757 } | 773 } |
758 | 774 |
| 775 accessibility_reset_count_ = 0; |
759 frame_tree_node()->navigator()->DidNavigate(this, validated_params); | 776 frame_tree_node()->navigator()->DidNavigate(this, validated_params); |
760 } | 777 } |
761 | 778 |
762 RenderWidgetHostImpl* RenderFrameHostImpl::GetRenderWidgetHost() { | 779 RenderWidgetHostImpl* RenderFrameHostImpl::GetRenderWidgetHost() { |
763 return static_cast<RenderWidgetHostImpl*>(render_view_host_); | 780 return static_cast<RenderWidgetHostImpl*>(render_view_host_); |
764 } | 781 } |
765 | 782 |
766 int RenderFrameHostImpl::GetEnabledBindings() { | 783 int RenderFrameHostImpl::GetEnabledBindings() { |
767 return render_view_host_->GetEnabledBindings(); | 784 return render_view_host_->GetEnabledBindings(); |
768 } | 785 } |
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1074 void RenderFrameHostImpl::OnBeginNavigation( | 1091 void RenderFrameHostImpl::OnBeginNavigation( |
1075 const FrameHostMsg_BeginNavigation_Params& params, | 1092 const FrameHostMsg_BeginNavigation_Params& params, |
1076 const CommonNavigationParams& common_params) { | 1093 const CommonNavigationParams& common_params) { |
1077 CHECK(CommandLine::ForCurrentProcess()->HasSwitch( | 1094 CHECK(CommandLine::ForCurrentProcess()->HasSwitch( |
1078 switches::kEnableBrowserSideNavigation)); | 1095 switches::kEnableBrowserSideNavigation)); |
1079 frame_tree_node()->navigator()->OnBeginNavigation( | 1096 frame_tree_node()->navigator()->OnBeginNavigation( |
1080 frame_tree_node(), params, common_params); | 1097 frame_tree_node(), params, common_params); |
1081 } | 1098 } |
1082 | 1099 |
1083 void RenderFrameHostImpl::OnAccessibilityEvents( | 1100 void RenderFrameHostImpl::OnAccessibilityEvents( |
1084 const std::vector<AccessibilityHostMsg_EventParams>& params) { | 1101 const std::vector<AccessibilityHostMsg_EventParams>& params, |
| 1102 int reset_token) { |
| 1103 // Don't process this IPC if either we're waiting on a reset and this |
| 1104 // IPC doesn't have the matching token ID, or if we're not waiting on a |
| 1105 // reset but this message includes a reset token. |
| 1106 if (accessibility_reset_token_ != reset_token) { |
| 1107 Send(new AccessibilityMsg_Events_ACK(routing_id_)); |
| 1108 return; |
| 1109 } |
| 1110 accessibility_reset_token_ = 0; |
| 1111 |
1085 RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( | 1112 RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( |
1086 render_view_host_->GetView()); | 1113 render_view_host_->GetView()); |
1087 | 1114 |
1088 AccessibilityMode accessibility_mode = delegate_->GetAccessibilityMode(); | 1115 AccessibilityMode accessibility_mode = delegate_->GetAccessibilityMode(); |
1089 if ((accessibility_mode != AccessibilityModeOff) && view && | 1116 if ((accessibility_mode != AccessibilityModeOff) && view && |
1090 RenderFrameHostImpl::IsRFHStateActive(rfh_state())) { | 1117 RenderFrameHostImpl::IsRFHStateActive(rfh_state())) { |
1091 if (accessibility_mode & AccessibilityModeFlagPlatform) { | 1118 if (accessibility_mode & AccessibilityModeFlagPlatform) { |
1092 GetOrCreateBrowserAccessibilityManager(); | 1119 GetOrCreateBrowserAccessibilityManager(); |
1093 if (browser_accessibility_manager_) | 1120 if (browser_accessibility_manager_) |
1094 browser_accessibility_manager_->OnAccessibilityEvents(params); | 1121 browser_accessibility_manager_->OnAccessibilityEvents(params); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1149 } else { | 1176 } else { |
1150 CHECK(ax_tree_for_testing_->Unserialize(param.update)) | 1177 CHECK(ax_tree_for_testing_->Unserialize(param.update)) |
1151 << ax_tree_for_testing_->error(); | 1178 << ax_tree_for_testing_->error(); |
1152 } | 1179 } |
1153 accessibility_testing_callback_.Run(param.event_type, param.id); | 1180 accessibility_testing_callback_.Run(param.event_type, param.id); |
1154 } | 1181 } |
1155 } | 1182 } |
1156 | 1183 |
1157 void RenderFrameHostImpl::OnAccessibilityLocationChanges( | 1184 void RenderFrameHostImpl::OnAccessibilityLocationChanges( |
1158 const std::vector<AccessibilityHostMsg_LocationChangeParams>& params) { | 1185 const std::vector<AccessibilityHostMsg_LocationChangeParams>& params) { |
| 1186 if (accessibility_reset_token_) |
| 1187 return; |
| 1188 |
1159 RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( | 1189 RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( |
1160 render_view_host_->GetView()); | 1190 render_view_host_->GetView()); |
1161 if (view && RenderFrameHostImpl::IsRFHStateActive(rfh_state())) { | 1191 if (view && RenderFrameHostImpl::IsRFHStateActive(rfh_state())) { |
1162 AccessibilityMode accessibility_mode = delegate_->GetAccessibilityMode(); | 1192 AccessibilityMode accessibility_mode = delegate_->GetAccessibilityMode(); |
1163 if (accessibility_mode & AccessibilityModeFlagPlatform) { | 1193 if (accessibility_mode & AccessibilityModeFlagPlatform) { |
1164 if (!browser_accessibility_manager_) { | 1194 BrowserAccessibilityManager* manager = |
1165 browser_accessibility_manager_.reset( | 1195 GetOrCreateBrowserAccessibilityManager(); |
1166 view->CreateBrowserAccessibilityManager(this)); | 1196 if (manager) |
1167 } | 1197 manager->OnLocationChanges(params); |
1168 if (browser_accessibility_manager_) | |
1169 browser_accessibility_manager_->OnLocationChanges(params); | |
1170 } | 1198 } |
1171 // TODO(aboxhall): send location change events to web contents observers too | 1199 // TODO(aboxhall): send location change events to web contents observers too |
1172 } | 1200 } |
1173 } | 1201 } |
1174 | 1202 |
1175 #if defined(OS_MACOSX) || defined(OS_ANDROID) | 1203 #if defined(OS_MACOSX) || defined(OS_ANDROID) |
1176 void RenderFrameHostImpl::OnShowPopup( | 1204 void RenderFrameHostImpl::OnShowPopup( |
1177 const FrameHostMsg_ShowPopup_Params& params) { | 1205 const FrameHostMsg_ShowPopup_Params& params) { |
1178 RenderViewHostDelegateView* view = | 1206 RenderViewHostDelegateView* view = |
1179 render_view_host_->delegate_->GetDelegateView(); | 1207 render_view_host_->delegate_->GetDelegateView(); |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1467 | 1495 |
1468 const ui::AXTree* RenderFrameHostImpl::GetAXTreeForTesting() { | 1496 const ui::AXTree* RenderFrameHostImpl::GetAXTreeForTesting() { |
1469 return ax_tree_for_testing_.get(); | 1497 return ax_tree_for_testing_.get(); |
1470 } | 1498 } |
1471 | 1499 |
1472 BrowserAccessibilityManager* | 1500 BrowserAccessibilityManager* |
1473 RenderFrameHostImpl::GetOrCreateBrowserAccessibilityManager() { | 1501 RenderFrameHostImpl::GetOrCreateBrowserAccessibilityManager() { |
1474 RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( | 1502 RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( |
1475 render_view_host_->GetView()); | 1503 render_view_host_->GetView()); |
1476 if (view && | 1504 if (view && |
1477 !browser_accessibility_manager_) { | 1505 !browser_accessibility_manager_ && |
| 1506 !no_create_browser_accessibility_manager_for_testing_) { |
1478 browser_accessibility_manager_.reset( | 1507 browser_accessibility_manager_.reset( |
1479 view->CreateBrowserAccessibilityManager(this)); | 1508 view->CreateBrowserAccessibilityManager(this)); |
| 1509 if (browser_accessibility_manager_) |
| 1510 UMA_HISTOGRAM_COUNTS("Accessibility.FrameEnabledCount", 1); |
| 1511 else |
| 1512 UMA_HISTOGRAM_COUNTS("Accessibility.FrameDidNotEnableCount", 1); |
1480 } | 1513 } |
1481 return browser_accessibility_manager_.get(); | 1514 return browser_accessibility_manager_.get(); |
1482 } | 1515 } |
1483 | 1516 |
1484 #if defined(OS_WIN) | 1517 #if defined(OS_WIN) |
1485 | 1518 |
1486 void RenderFrameHostImpl::SetParentNativeViewAccessible( | 1519 void RenderFrameHostImpl::SetParentNativeViewAccessible( |
1487 gfx::NativeViewAccessible accessible_parent) { | 1520 gfx::NativeViewAccessible accessible_parent) { |
1488 RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( | 1521 RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( |
1489 render_view_host_->GetView()); | 1522 render_view_host_->GetView()); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1564 // Clear any state if a pending navigation is canceled or preempted. | 1597 // Clear any state if a pending navigation is canceled or preempted. |
1565 if (suspended_nav_params_) | 1598 if (suspended_nav_params_) |
1566 suspended_nav_params_.reset(); | 1599 suspended_nav_params_.reset(); |
1567 | 1600 |
1568 TRACE_EVENT_ASYNC_END0("navigation", | 1601 TRACE_EVENT_ASYNC_END0("navigation", |
1569 "RenderFrameHostImpl navigation suspended", this); | 1602 "RenderFrameHostImpl navigation suspended", this); |
1570 navigations_suspended_ = false; | 1603 navigations_suspended_ = false; |
1571 } | 1604 } |
1572 | 1605 |
1573 } // namespace content | 1606 } // namespace content |
OLD | NEW |