summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Michael Kolb <kolby@google.com> 2012-03-05 09:16:35 -0800
committer Android (Google) Code Review <android-gerrit@google.com> 2012-03-05 09:16:35 -0800
commit02b693ecd4d13e75b2bae5972242c1c23cf98764 (patch)
treef225f90d908342a47d19e09426331c1ec8170811
parentc730aceb64233592c5a0d8b6a429d645443b3818 (diff)
parent6ddf44d81538fbcc8c0732ea53770bc23a6d7cf7 (diff)
Merge "fix race condition in WebViewClassic.destroy()"
-rw-r--r--core/java/android/webkit/CallbackProxy.java6
-rw-r--r--core/java/android/webkit/WebViewClassic.java10
-rw-r--r--core/java/android/webkit/WebViewCore.java6
3 files changed, 12 insertions, 10 deletions
diff --git a/core/java/android/webkit/CallbackProxy.java b/core/java/android/webkit/CallbackProxy.java
index 484c449639a8..2afb841b34ab 100644
--- a/core/java/android/webkit/CallbackProxy.java
+++ b/core/java/android/webkit/CallbackProxy.java
@@ -155,6 +155,12 @@ class CallbackProxy extends Handler {
mBackForwardList = new WebBackForwardList(this);
}
+ protected void shutdown() {
+ setWebViewClient(null);
+ setWebChromeClient(null);
+ removeCallbacksAndMessages(null);
+ }
+
/**
* Set the WebViewClient.
* @param client An implementation of WebViewClient.
diff --git a/core/java/android/webkit/WebViewClassic.java b/core/java/android/webkit/WebViewClassic.java
index 4983003e8eae..5f5e83c03ec2 100644
--- a/core/java/android/webkit/WebViewClassic.java
+++ b/core/java/android/webkit/WebViewClassic.java
@@ -2121,10 +2121,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc
}
if (mNativeClass != 0) nativeStopGL();
if (mWebViewCore != null) {
- // Set the handlers to null before destroying WebViewCore so no
- // more messages will be posted.
- mCallbackProxy.setWebViewClient(null);
- mCallbackProxy.setWebChromeClient(null);
// Tell WebViewCore to destroy itself
synchronized (this) {
WebViewCore webViewCore = mWebViewCore;
@@ -2133,12 +2129,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc
}
// Remove any pending messages that might not be serviced yet.
mPrivateHandler.removeCallbacksAndMessages(null);
- mCallbackProxy.removeCallbacksAndMessages(null);
- // Wake up the WebCore thread just in case it is waiting for a
- // JavaScript dialog.
- synchronized (mCallbackProxy) {
- mCallbackProxy.notify();
- }
}
if (mNativeClass != 0) {
nativeDestroy();
diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java
index 4bda5efe242a..bcfa9e273b8c 100644
--- a/core/java/android/webkit/WebViewCore.java
+++ b/core/java/android/webkit/WebViewCore.java
@@ -1252,6 +1252,12 @@ public final class WebViewCore {
// Time to take down the world. Cancel all pending
// loads and destroy the native view and frame.
synchronized (WebViewCore.this) {
+ mCallbackProxy.shutdown();
+ // Wake up the WebCore thread just in case it is waiting for a
+ // JavaScript dialog.
+ synchronized (mCallbackProxy) {
+ mCallbackProxy.notify();
+ }
mBrowserFrame.destroy();
mBrowserFrame = null;
mSettings.onDestroyed();