diff options
author | Ben Murdoch <benm@google.com> | 2014-09-08 10:39:12 +0100 |
---|---|---|
committer | Ben Murdoch <benm@google.com> | 2014-09-08 10:39:12 +0100 |
commit | 101e658ed8b57cb6fc90aa36ea2df1ea7aa9391e (patch) | |
tree | 7f49d53af5025cc2ce9f601081d7643de8343ef5 /android_webview | |
parent | c622a8f4bfc6aaf5ef2ccfe28cc3249c35af26ef (diff) | |
download | chromium_org-101e658ed8b57cb6fc90aa36ea2df1ea7aa9391e.tar.gz |
Cherry pick Android WebView: clean up the AwContentsClientBridge webcontents userdata.
Bug: 17396873
Original description:
When we destroy the AwContentsClientBridge, clear the pointer to it
held by webcontents user data.
Also ensure that if we don't post the callback to the java side
to run the js dialog callback in the embedding app that we run
the callback.
BUG=411399
Committed: https://chromium.googlesource.com/chromium/src/+/bafb7ef3239ed1db29393ca1d528af08a2f19dfb
Change-Id: Ib9fbb4fc6b4e4dc45688db814e3ec886d469e222
Diffstat (limited to 'android_webview')
5 files changed, 23 insertions, 2 deletions
diff --git a/android_webview/browser/aw_contents_client_bridge_base.cc b/android_webview/browser/aw_contents_client_bridge_base.cc index 4e31f71bb9..ffd7160fe0 100644 --- a/android_webview/browser/aw_contents_client_bridge_base.cc +++ b/android_webview/browser/aw_contents_client_bridge_base.cc @@ -47,6 +47,11 @@ void AwContentsClientBridgeBase::Associate( new UserData(handler)); } +void AwContentsClientBridgeBase::Disassociate( + WebContents* web_contents) { + web_contents->RemoveUserData(kAwContentsClientBridgeBase); +} + // static AwContentsClientBridgeBase* AwContentsClientBridgeBase::FromWebContents( WebContents* web_contents) { diff --git a/android_webview/browser/aw_contents_client_bridge_base.h b/android_webview/browser/aw_contents_client_bridge_base.h index a24aa4bd9a..3bc1815199 100644 --- a/android_webview/browser/aw_contents_client_bridge_base.h +++ b/android_webview/browser/aw_contents_client_bridge_base.h @@ -34,6 +34,7 @@ class AwContentsClientBridgeBase { // Adds the handler to the UserData registry. static void Associate(content::WebContents* web_contents, AwContentsClientBridgeBase* handler); + static void Disassociate(content::WebContents* web_contents); static AwContentsClientBridgeBase* FromWebContents( content::WebContents* web_contents); static AwContentsClientBridgeBase* FromID(int render_process_id, diff --git a/android_webview/browser/aw_javascript_dialog_manager.cc b/android_webview/browser/aw_javascript_dialog_manager.cc index 630c7bfd7a..476935a53c 100644 --- a/android_webview/browser/aw_javascript_dialog_manager.cc +++ b/android_webview/browser/aw_javascript_dialog_manager.cc @@ -25,6 +25,11 @@ void AwJavaScriptDialogManager::RunJavaScriptDialog( bool* did_suppress_message) { AwContentsClientBridgeBase* bridge = AwContentsClientBridgeBase::FromWebContents(web_contents); + if (!bridge) { + callback.Run(false, base::string16()); + return; + } + bridge->RunJavaScriptDialog(message_type, origin_url, message_text, @@ -39,6 +44,11 @@ void AwJavaScriptDialogManager::RunBeforeUnloadDialog( const DialogClosedCallback& callback) { AwContentsClientBridgeBase* bridge = AwContentsClientBridgeBase::FromWebContents(web_contents); + if (!bridge) { + callback.Run(false, base::string16()); + return; + } + bridge->RunBeforeUnloadDialog(web_contents->GetURL(), message_text, callback); diff --git a/android_webview/native/aw_contents.cc b/android_webview/native/aw_contents.cc index 4c8a4f288a..774f63e922 100644 --- a/android_webview/native/aw_contents.cc +++ b/android_webview/native/aw_contents.cc @@ -297,6 +297,7 @@ void AwContents::Destroy(JNIEnv* env, jobject obj) { // the java peer. This is important for the popup window case, where we are // swapping AwContents out that share the same java AwContentsClientBridge. // See b/15074651. + AwContentsClientBridgeBase::Disassociate(web_contents_.get()); contents_client_bridge_.reset(); // We do not delete AwContents immediately. Some applications try to delete diff --git a/android_webview/native/aw_contents_client_bridge.cc b/android_webview/native/aw_contents_client_bridge.cc index a4f87d30fd..61cc2559e0 100644 --- a/android_webview/native/aw_contents_client_bridge.cc +++ b/android_webview/native/aw_contents_client_bridge.cc @@ -263,8 +263,10 @@ void AwContentsClientBridge::RunJavaScriptDialog( JNIEnv* env = AttachCurrentThread(); ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); - if (obj.is_null()) + if (obj.is_null()) { + callback.Run(false, base::string16()); return; + } int callback_id = pending_js_dialog_callbacks_.Add( new content::JavaScriptDialogManager::DialogClosedCallback(callback)); @@ -311,8 +313,10 @@ void AwContentsClientBridge::RunBeforeUnloadDialog( JNIEnv* env = AttachCurrentThread(); ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); - if (obj.is_null()) + if (obj.is_null()) { + callback.Run(false, base::string16()); return; + } int callback_id = pending_js_dialog_callbacks_.Add( new content::JavaScriptDialogManager::DialogClosedCallback(callback)); |