summaryrefslogtreecommitdiffstats
path: root/android_webview
diff options
context:
space:
mode:
authorbenm <benm@chromium.org>2014-09-06 17:04:54 -0700
committerCommit bot <commit-bot@chromium.org>2014-09-07 00:08:38 +0000
commitad2403bd4cae2c2764097addf2caa9dfc44e9b10 (patch)
tree5ae0e9a8ba6cf6f3c319bf57be9e38c205bb1a52 /android_webview
parent863973350592b999dce0150ce76b3744fd34dc66 (diff)
downloadchromium_src-ad2403bd4cae2c2764097addf2caa9dfc44e9b10.zip
chromium_src-ad2403bd4cae2c2764097addf2caa9dfc44e9b10.tar.gz
chromium_src-ad2403bd4cae2c2764097addf2caa9dfc44e9b10.tar.bz2
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 Review URL: https://codereview.chromium.org/545963002 Cr-Commit-Position: refs/heads/master@{#293642}
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 4e31f71..ffd7160 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 a24aa4b..3bc1815 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 630c7bf..476935a 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 2155f57..e38fd5e 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 5431be7..f5bccdf 100644
--- a/android_webview/native/aw_contents_client_bridge.cc
+++ b/android_webview/native/aw_contents_client_bridge.cc
@@ -262,8 +262,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));
@@ -310,8 +312,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));