summaryrefslogtreecommitdiffstats
path: root/android_webview
diff options
context:
space:
mode:
authorgsennton <gsennton@chromium.org>2015-08-12 06:03:57 -0700
committerCommit bot <commit-bot@chromium.org>2015-08-12 13:04:31 +0000
commitfbcead00c43e9206a225312e794868da70e9290a (patch)
treee9947ff5c7603295ceb22732b647692708f0da93 /android_webview
parent243b94b81c7a01c3ed72e4d0f96a66a4dcab1fdb (diff)
downloadchromium_src-fbcead00c43e9206a225312e794868da70e9290a.zip
chromium_src-fbcead00c43e9206a225312e794868da70e9290a.tar.gz
chromium_src-fbcead00c43e9206a225312e794868da70e9290a.tar.bz2
Ensure that we do not receive callbacks after destroying WebView
An app that calls destroy() on a WebView for which a callback is pending (e.g. onPageFinished) can accidentically use the WebView from that callback after the destroy method has finished. To prevent this from happening we now reset the WebView callback listeners (e.g. WebViewClient) when destroying WebView. BUG=498796 Review URL: https://codereview.chromium.org/1284923002 Cr-Commit-Position: refs/heads/master@{#343006}
Diffstat (limited to 'android_webview')
-rw-r--r--android_webview/glue/java/src/com/android/webview/chromium/WebViewChromium.java6
-rw-r--r--android_webview/java/src/org/chromium/android_webview/AwContents.java3
-rw-r--r--android_webview/java/src/org/chromium/android_webview/AwContentsClientCallbackHelper.java4
3 files changed, 13 insertions, 0 deletions
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromium.java b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromium.java
index 1ad4d91..97d169f 100644
--- a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromium.java
+++ b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromium.java
@@ -432,6 +432,12 @@ class WebViewChromium implements WebViewProvider, WebViewProvider.ScrollDelegate
return;
}
+ // Make sure that we do not trigger any callbacks after destruction
+ mContentsClientAdapter.setWebChromeClient(null);
+ mContentsClientAdapter.setWebViewClient(null);
+ mContentsClientAdapter.setPictureListener(null);
+ mContentsClientAdapter.setFindListener(null);
+
mAwContents.destroy();
if (mGLfunctor != null) {
mGLfunctor.destroy();
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContents.java b/android_webview/java/src/org/chromium/android_webview/AwContents.java
index e56aca1..bdcbd37 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwContents.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java
@@ -1058,6 +1058,9 @@ public class AwContents implements SmartClipProvider,
if (TRACE) Log.d(TAG, "destroy");
if (isDestroyed()) return;
+ // Remove pending messages
+ mContentsClient.getCallbackHelper().removeCallbacksAndMessages();
+
if (mPostMessageSender != null) {
mBrowserContext.getMessagePortService().removeObserver(mPostMessageSender);
mPostMessageSender = null;
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContentsClientCallbackHelper.java b/android_webview/java/src/org/chromium/android_webview/AwContentsClientCallbackHelper.java
index ee15d99..39fc42e 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwContentsClientCallbackHelper.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwContentsClientCallbackHelper.java
@@ -303,4 +303,8 @@ public class AwContentsClientCallbackHelper {
OnFormResubmissionInfo info = new OnFormResubmissionInfo(dontResend, resend);
mHandler.sendMessage(mHandler.obtainMessage(MSG_ON_FORM_RESUBMISSION, info));
}
+
+ void removeCallbacksAndMessages() {
+ mHandler.removeCallbacksAndMessages(null);
+ }
}