Commit 1eaae7db authored by Nektarios Paisios's avatar Nektarios Paisios Committed by Commit Bot

All a11y methods in RenderFrameHost should check if the host is active before proceeding

When a RenderFrameHost is being swapped out, it will be in the process of being deleted.
Before any requests from accessibility should be serviced, we should
check if the RenderFrameHost is not being swapped out.
Otherwise, parts of the class instance, such as its RenderViewHost,
might have been destroyed, or the renderer associated with
the RenderFrameHost instance might not be able to
receive IPCs.

R=dmazzoni@chromium.org

Change-Id: I08a87cad7b789f0752adbcc1564b748456d5d338
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1881324Reviewed-by: default avatarDominic Mazzoni <dmazzoni@chromium.org>
Reviewed-by: default avatarAvi Drissman <avi@chromium.org>
Commit-Queue: Nektarios Paisios <nektar@chromium.org>
Cr-Commit-Position: refs/heads/master@{#709917}
parent 53fc0f34
...@@ -1694,10 +1694,15 @@ void RenderFrameHostImpl::OnAssociatedInterfaceRequest( ...@@ -1694,10 +1694,15 @@ void RenderFrameHostImpl::OnAssociatedInterfaceRequest(
void RenderFrameHostImpl::AccessibilityPerformAction( void RenderFrameHostImpl::AccessibilityPerformAction(
const ui::AXActionData& action_data) { const ui::AXActionData& action_data) {
if (!is_active())
return;
Send(new AccessibilityMsg_PerformAction(routing_id_, action_data)); Send(new AccessibilityMsg_PerformAction(routing_id_, action_data));
} }
bool RenderFrameHostImpl::AccessibilityViewHasFocus() const { bool RenderFrameHostImpl::AccessibilityViewHasFocus() const {
if (!is_active())
return false;
RenderWidgetHostView* view = render_view_host_->GetWidget()->GetView(); RenderWidgetHostView* view = render_view_host_->GetWidget()->GetView();
if (view) if (view)
return view->HasFocus(); return view->HasFocus();
...@@ -1705,12 +1710,18 @@ bool RenderFrameHostImpl::AccessibilityViewHasFocus() const { ...@@ -1705,12 +1710,18 @@ bool RenderFrameHostImpl::AccessibilityViewHasFocus() const {
} }
void RenderFrameHostImpl::AccessibilityViewSetFocus() { void RenderFrameHostImpl::AccessibilityViewSetFocus() {
if (!is_active())
return;
RenderWidgetHostView* view = render_view_host_->GetWidget()->GetView(); RenderWidgetHostView* view = render_view_host_->GetWidget()->GetView();
if (view) if (view)
view->Focus(); view->Focus();
} }
gfx::Rect RenderFrameHostImpl::AccessibilityGetViewBounds() const { gfx::Rect RenderFrameHostImpl::AccessibilityGetViewBounds() const {
if (!is_active())
return gfx::Rect();
RenderWidgetHostView* view = render_view_host_->GetWidget()->GetView(); RenderWidgetHostView* view = render_view_host_->GetWidget()->GetView();
if (view) if (view)
return view->GetViewBounds(); return view->GetViewBounds();
...@@ -1718,6 +1729,9 @@ gfx::Rect RenderFrameHostImpl::AccessibilityGetViewBounds() const { ...@@ -1718,6 +1729,9 @@ gfx::Rect RenderFrameHostImpl::AccessibilityGetViewBounds() const {
} }
float RenderFrameHostImpl::AccessibilityGetDeviceScaleFactor() const { float RenderFrameHostImpl::AccessibilityGetDeviceScaleFactor() const {
if (!is_active())
return 1.0f;
RenderWidgetHostView* view = render_view_host_->GetWidget()->GetView(); RenderWidgetHostView* view = render_view_host_->GetWidget()->GetView();
if (view) if (view)
return GetScaleFactorForView(view); return GetScaleFactorForView(view);
...@@ -1748,7 +1762,7 @@ RenderFrameHostImpl::AccessibilityGetAcceleratedWidget() { ...@@ -1748,7 +1762,7 @@ RenderFrameHostImpl::AccessibilityGetAcceleratedWidget() {
// Only the main frame's current frame host is connected to the native // Only the main frame's current frame host is connected to the native
// widget tree for accessibility, so return null if this is queried on // widget tree for accessibility, so return null if this is queried on
// any other frame. // any other frame.
if (frame_tree_node()->parent() || !IsCurrent()) if (!is_active() || frame_tree_node()->parent() || !IsCurrent())
return gfx::kNullAcceleratedWidget; return gfx::kNullAcceleratedWidget;
RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>(
...@@ -1760,6 +1774,9 @@ RenderFrameHostImpl::AccessibilityGetAcceleratedWidget() { ...@@ -1760,6 +1774,9 @@ RenderFrameHostImpl::AccessibilityGetAcceleratedWidget() {
gfx::NativeViewAccessible gfx::NativeViewAccessible
RenderFrameHostImpl::AccessibilityGetNativeViewAccessible() { RenderFrameHostImpl::AccessibilityGetNativeViewAccessible() {
if (!is_active())
return nullptr;
RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>(
render_view_host_->GetWidget()->GetView()); render_view_host_->GetWidget()->GetView());
if (view) if (view)
...@@ -1769,6 +1786,9 @@ RenderFrameHostImpl::AccessibilityGetNativeViewAccessible() { ...@@ -1769,6 +1786,9 @@ RenderFrameHostImpl::AccessibilityGetNativeViewAccessible() {
gfx::NativeViewAccessible gfx::NativeViewAccessible
RenderFrameHostImpl::AccessibilityGetNativeViewAccessibleForWindow() { RenderFrameHostImpl::AccessibilityGetNativeViewAccessibleForWindow() {
if (!is_active())
return nullptr;
RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>(
render_view_host_->GetWidget()->GetView()); render_view_host_->GetWidget()->GetView());
if (view) if (view)
...@@ -1777,10 +1797,14 @@ RenderFrameHostImpl::AccessibilityGetNativeViewAccessibleForWindow() { ...@@ -1777,10 +1797,14 @@ RenderFrameHostImpl::AccessibilityGetNativeViewAccessibleForWindow() {
} }
WebContents* RenderFrameHostImpl::AccessibilityWebContents() { WebContents* RenderFrameHostImpl::AccessibilityWebContents() {
if (!is_active())
return nullptr;
return delegate()->GetAsWebContents(); return delegate()->GetAsWebContents();
} }
bool RenderFrameHostImpl::AccessibilityIsMainFrame() const { bool RenderFrameHostImpl::AccessibilityIsMainFrame() const {
if (!is_active())
return false;
return frame_tree_node()->IsMainFrame(); return frame_tree_node()->IsMainFrame();
} }
...@@ -3763,12 +3787,12 @@ void RenderFrameHostImpl::EvictFromBackForwardCacheWithReason( ...@@ -3763,12 +3787,12 @@ void RenderFrameHostImpl::EvictFromBackForwardCacheWithReason(
void RenderFrameHostImpl::OnAccessibilityLocationChanges( void RenderFrameHostImpl::OnAccessibilityLocationChanges(
const std::vector<AccessibilityHostMsg_LocationChangeParams>& params) { const std::vector<AccessibilityHostMsg_LocationChangeParams>& params) {
if (accessibility_reset_token_) if (accessibility_reset_token_ || !is_active())
return; return;
RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>(
render_view_host_->GetWidget()->GetView()); render_view_host_->GetWidget()->GetView());
if (view && is_active()) { if (view) {
ui::AXMode accessibility_mode = delegate_->GetAccessibilityMode(); ui::AXMode accessibility_mode = delegate_->GetAccessibilityMode();
if (accessibility_mode.has_mode(ui::AXMode::kNativeAPIs)) { if (accessibility_mode.has_mode(ui::AXMode::kNativeAPIs)) {
BrowserAccessibilityManager* manager = BrowserAccessibilityManager* manager =
...@@ -3795,7 +3819,7 @@ void RenderFrameHostImpl::OnAccessibilityLocationChanges( ...@@ -3795,7 +3819,7 @@ void RenderFrameHostImpl::OnAccessibilityLocationChanges(
void RenderFrameHostImpl::OnAccessibilityFindInPageResult( void RenderFrameHostImpl::OnAccessibilityFindInPageResult(
const AccessibilityHostMsg_FindInPageResultParams& params) { const AccessibilityHostMsg_FindInPageResultParams& params) {
ui::AXMode accessibility_mode = delegate_->GetAccessibilityMode(); ui::AXMode accessibility_mode = delegate_->GetAccessibilityMode();
if (accessibility_mode.has_mode(ui::AXMode::kNativeAPIs)) { if (accessibility_mode.has_mode(ui::AXMode::kNativeAPIs) && is_active()) {
BrowserAccessibilityManager* manager = BrowserAccessibilityManager* manager =
GetOrCreateBrowserAccessibilityManager(); GetOrCreateBrowserAccessibilityManager();
if (manager) { if (manager) {
...@@ -3808,7 +3832,7 @@ void RenderFrameHostImpl::OnAccessibilityFindInPageResult( ...@@ -3808,7 +3832,7 @@ void RenderFrameHostImpl::OnAccessibilityFindInPageResult(
void RenderFrameHostImpl::OnAccessibilityFindInPageTermination() { void RenderFrameHostImpl::OnAccessibilityFindInPageTermination() {
ui::AXMode accessibility_mode = delegate_->GetAccessibilityMode(); ui::AXMode accessibility_mode = delegate_->GetAccessibilityMode();
if (accessibility_mode.has_mode(ui::AXMode::kNativeAPIs)) { if (accessibility_mode.has_mode(ui::AXMode::kNativeAPIs) && is_active()) {
BrowserAccessibilityManager* manager = BrowserAccessibilityManager* manager =
GetOrCreateBrowserAccessibilityManager(); GetOrCreateBrowserAccessibilityManager();
if (manager) if (manager)
...@@ -3837,7 +3861,7 @@ void RenderFrameHostImpl::OnAccessibilityChildFrameHitTestResult( ...@@ -3837,7 +3861,7 @@ void RenderFrameHostImpl::OnAccessibilityChildFrameHitTestResult(
NOTREACHED(); NOTREACHED();
} }
if (!child_frame) if (!child_frame || !child_frame->is_active())
return; return;
ui::AXActionData action_data; ui::AXActionData action_data;
......
...@@ -607,7 +607,7 @@ class CONTENT_EXPORT RenderFrameHostImpl ...@@ -607,7 +607,7 @@ class CONTENT_EXPORT RenderFrameHostImpl
// until it is pending deletion. Pending deletion starts when SwapOut is // until it is pending deletion. Pending deletion starts when SwapOut is
// called on the frame or one of its ancestors. // called on the frame or one of its ancestors.
// BackForwardCache: Returns false when the frame is in the BackForwardCache. // BackForwardCache: Returns false when the frame is in the BackForwardCache.
bool is_active() { bool is_active() const {
return unload_state_ == UnloadState::NotRun && !is_in_back_forward_cache_; return unload_state_ == UnloadState::NotRun && !is_in_back_forward_cache_;
} }
...@@ -968,7 +968,7 @@ class CONTENT_EXPORT RenderFrameHostImpl ...@@ -968,7 +968,7 @@ class CONTENT_EXPORT RenderFrameHostImpl
// BackForwardCache after time to live. // BackForwardCache after time to live.
void StartBackForwardCacheEvictionTimer(); void StartBackForwardCacheEvictionTimer();
bool is_in_back_forward_cache() { return is_in_back_forward_cache_; } bool is_in_back_forward_cache() const { return is_in_back_forward_cache_; }
bool is_back_forward_cache_disabled() const { bool is_back_forward_cache_disabled() const {
return is_back_forward_cache_disabled_; return is_back_forward_cache_disabled_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment