Commit d852249e authored by Dominic Mazzoni's avatar Dominic Mazzoni Committed by Commit Bot

Fix WebContentsAccessibilityAndroid lifecycle issue.

After r808115 (http://crrev.com/c/2415928) there was a corner case where
the WebContentsAccessibilityAndroid could change, but the root
BrowserAccessibilityManagerAndroid wouldn't be pointing to it.
This would manifest as TalkBack not speaking in response to the page
changing.

Bug: 1126657, 1131356
Change-Id: I99041aeae4e0fc0d643b86c3e99212dce626b9f4
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2425292Reviewed-by: default avatarBo <boliu@chromium.org>
Commit-Queue: Dominic Mazzoni <dmazzoni@chromium.org>
Cr-Commit-Position: refs/heads/master@{#809806}
parent 42c72a44
...@@ -346,6 +346,7 @@ void WebContentsAccessibilityAndroid::Connector::UpdateRenderProcessConnection( ...@@ -346,6 +346,7 @@ void WebContentsAccessibilityAndroid::Connector::UpdateRenderProcessConnection(
old_rwhva->SetWebContentsAccessibility(nullptr); old_rwhva->SetWebContentsAccessibility(nullptr);
if (new_rwhva) if (new_rwhva)
new_rwhva->SetWebContentsAccessibility(accessibility_.get()); new_rwhva->SetWebContentsAccessibility(accessibility_.get());
accessibility_->UpdateBrowserAccessibilityManager();
} }
WebContentsAccessibilityAndroid::WebContentsAccessibilityAndroid( WebContentsAccessibilityAndroid::WebContentsAccessibilityAndroid(
...@@ -355,8 +356,12 @@ WebContentsAccessibilityAndroid::WebContentsAccessibilityAndroid( ...@@ -355,8 +356,12 @@ WebContentsAccessibilityAndroid::WebContentsAccessibilityAndroid(
: java_ref_(env, obj), : java_ref_(env, obj),
web_contents_(static_cast<WebContentsImpl*>(web_contents)), web_contents_(static_cast<WebContentsImpl*>(web_contents)),
frame_info_initialized_(false), frame_info_initialized_(false),
use_zoom_for_dsf_enabled_(IsUseZoomForDSFEnabled()), use_zoom_for_dsf_enabled_(IsUseZoomForDSFEnabled()) {
connector_(new Connector(web_contents, this)) { // We must initialize this after weak_ptr_factory_ because it can result in
// calling UpdateBrowserAccessibilityManager() which accesses
// weak_ptr_factory_.
connector_ = new Connector(web_contents, this);
CollectStats(); CollectStats();
} }
...@@ -372,6 +377,12 @@ WebContentsAccessibilityAndroid::~WebContentsAccessibilityAndroid() { ...@@ -372,6 +377,12 @@ WebContentsAccessibilityAndroid::~WebContentsAccessibilityAndroid() {
Java_WebContentsAccessibilityImpl_onNativeObjectDestroyed(env, obj); Java_WebContentsAccessibilityImpl_onNativeObjectDestroyed(env, obj);
} }
void WebContentsAccessibilityAndroid::UpdateBrowserAccessibilityManager() {
auto* manager = GetRootBrowserAccessibilityManager();
if (manager)
manager->set_web_contents_accessibility(GetWeakPtr());
}
void WebContentsAccessibilityAndroid::DeleteEarly(JNIEnv* env) { void WebContentsAccessibilityAndroid::DeleteEarly(JNIEnv* env) {
connector_->DeleteEarly(); connector_->DeleteEarly();
} }
......
...@@ -39,6 +39,10 @@ class CONTENT_EXPORT WebContentsAccessibilityAndroid ...@@ -39,6 +39,10 @@ class CONTENT_EXPORT WebContentsAccessibilityAndroid
WebContents* web_contents); WebContents* web_contents);
~WebContentsAccessibilityAndroid() override; ~WebContentsAccessibilityAndroid() override;
// Notify the root BrowserAccessibilityManager that this is the
// WebContentsAccessibilityAndroid it should talk to.
void UpdateBrowserAccessibilityManager();
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// Methods called from Java via JNI // Methods called from Java via JNI
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
...@@ -297,7 +301,7 @@ class CONTENT_EXPORT WebContentsAccessibilityAndroid ...@@ -297,7 +301,7 @@ class CONTENT_EXPORT WebContentsAccessibilityAndroid
// receives accessibility events. // receives accessibility events.
// Owns itself, and destroyed upon WebContentsObserver::WebContentsDestroyed. // Owns itself, and destroyed upon WebContentsObserver::WebContentsDestroyed.
class Connector; class Connector;
Connector* connector_; Connector* connector_ = nullptr;
base::WeakPtrFactory<WebContentsAccessibilityAndroid> weak_ptr_factory_{this}; base::WeakPtrFactory<WebContentsAccessibilityAndroid> weak_ptr_factory_{this};
......
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