diff options
| author | 2012-03-05 09:16:35 -0800 | |
|---|---|---|
| committer | 2012-03-05 09:16:35 -0800 | |
| commit | 02b693ecd4d13e75b2bae5972242c1c23cf98764 (patch) | |
| tree | f225f90d908342a47d19e09426331c1ec8170811 | |
| parent | c730aceb64233592c5a0d8b6a429d645443b3818 (diff) | |
| parent | 6ddf44d81538fbcc8c0732ea53770bc23a6d7cf7 (diff) | |
Merge "fix race condition in WebViewClassic.destroy()"
| -rw-r--r-- | core/java/android/webkit/CallbackProxy.java | 6 | ||||
| -rw-r--r-- | core/java/android/webkit/WebViewClassic.java | 10 | ||||
| -rw-r--r-- | core/java/android/webkit/WebViewCore.java | 6 |
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(); |