From 08d584cd1cba05284ccd2d0ea128c297624f0c47 Mon Sep 17 00:00:00 2001 From: Steve Block Date: Tue, 17 May 2011 19:05:03 +0100 Subject: [PATCH] Log a StrictMode violation when WebView methods are called on the wrong thread Bug: 4373919 Change-Id: I1f526e033ce316e51b3de7fe4ac88119fbc65b4e --- core/java/android/os/StrictMode.java | 7 +++++++ core/java/android/webkit/WebView.java | 19 ++++++++++--------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/core/java/android/os/StrictMode.java b/core/java/android/os/StrictMode.java index 1375a29b1ddd7..01c640a38db11 100644 --- a/core/java/android/os/StrictMode.java +++ b/core/java/android/os/StrictMode.java @@ -1481,6 +1481,13 @@ public final class StrictMode { onVmPolicyViolation(message, originStack); } + /** + * @hide + */ + public static void onWebViewMethodCalledOnWrongThread(Throwable originStack) { + onVmPolicyViolation(null, originStack); + } + // Map from VM violation fingerprint to uptime millis. private static final HashMap sLastVmViolationTime = new HashMap(); diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index f7748030a6427..61a69cad55cfe 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -54,7 +54,9 @@ import android.net.http.SslCertificate; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; +import android.os.Looper; import android.os.Message; +import android.os.StrictMode; import android.provider.Settings; import android.speech.tts.TextToSpeech; import android.text.Selection; @@ -8933,15 +8935,14 @@ public class WebView extends AbsoluteLayout } private static void checkThread() { - if (!"main".equals(Thread.currentThread().getName())) { - try { - throw new RuntimeException("A WebView method was called on thread '" + - Thread.currentThread().getName() + "'. " + - "All WebView methods must be called on the UI thread. " + - "Future versions of WebView may not support use on other threads."); - } catch (RuntimeException e) { - Log.e(LOGTAG, Log.getStackTraceString(e)); - } + if (Looper.myLooper() != Looper.getMainLooper()) { + RuntimeException exception = new RuntimeException( + "A WebView method was called on thread '" + + Thread.currentThread().getName() + "'. " + + "All WebView methods must be called on the UI thread. " + + "Future versions of WebView may not support use on other threads."); + Log.e(LOGTAG, Log.getStackTraceString(exception)); + StrictMode.onWebViewMethodCalledOnWrongThread(exception); } }