summaryrefslogtreecommitdiff
path: root/android_webview
diff options
context:
space:
mode:
authorBen Murdoch <benm@google.com>2014-09-08 10:39:12 +0100
committerBen Murdoch <benm@google.com>2014-09-08 10:39:12 +0100
commit101e658ed8b57cb6fc90aa36ea2df1ea7aa9391e (patch)
tree7f49d53af5025cc2ce9f601081d7643de8343ef5 /android_webview
parentc622a8f4bfc6aaf5ef2ccfe28cc3249c35af26ef (diff)
downloadchromium_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')
-rw-r--r--android_webview/browser/aw_contents_client_bridge_base.cc5
-rw-r--r--android_webview/browser/aw_contents_client_bridge_base.h1
-rw-r--r--android_webview/browser/aw_javascript_dialog_manager.cc10
-rw-r--r--android_webview/native/aw_contents.cc1
-rw-r--r--android_webview/native/aw_contents_client_bridge.cc8
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));