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

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: Removed flakiness 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 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « content/browser/frame_host/render_frame_host_impl.h ('k') | content/common/accessibility_messages.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698