From 01d0fbfa683012623f030ec75a63e1a9fabcb916 Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Tue, 1 Dec 2009 14:52:19 -0800 Subject: [PATCH] Fix a leak in WebView. Fixes #2296601. WebView and its related APIs are keeping static objects that hold references to Context instance. This could cause applications to leak their first Activity and all the associated resources. --- core/java/android/webkit/BrowserFrame.java | 15 +++++++++------ core/java/android/webkit/CacheManager.java | 2 +- core/java/android/webkit/CookieSyncManager.java | 2 +- core/java/android/webkit/PluginManager.java | 2 +- core/java/android/webkit/WebView.java | 2 +- 5 files changed, 13 insertions(+), 10 deletions(-) diff --git a/core/java/android/webkit/BrowserFrame.java b/core/java/android/webkit/BrowserFrame.java index e6e26fa8a0f0d..1496f1bf4dafc 100644 --- a/core/java/android/webkit/BrowserFrame.java +++ b/core/java/android/webkit/BrowserFrame.java @@ -105,10 +105,13 @@ class BrowserFrame extends Handler { */ public BrowserFrame(Context context, WebViewCore w, CallbackProxy proxy, WebSettings settings, Map javascriptInterfaces) { + + Context appContext = context.getApplicationContext(); + // Create a global JWebCoreJavaBridge to handle timers and // cookies in the WebCore thread. if (sJavaBridge == null) { - sJavaBridge = new JWebCoreJavaBridge(context); + sJavaBridge = new JWebCoreJavaBridge(appContext); // set WebCore native cache size ActivityManager am = (ActivityManager) context .getSystemService(Context.ACTIVITY_SERVICE); @@ -118,18 +121,18 @@ class BrowserFrame extends Handler { sJavaBridge.setCacheSize(4 * 1024 * 1024); } // initialize CacheManager - CacheManager.init(context); + CacheManager.init(appContext); // create CookieSyncManager with current Context - CookieSyncManager.createInstance(context); + CookieSyncManager.createInstance(appContext); // create PluginManager with current Context - PluginManager.getInstance(context); + PluginManager.getInstance(appContext); } mJSInterfaceMap = javascriptInterfaces; mSettings = settings; mContext = context; mCallbackProxy = proxy; - mDatabase = WebViewDatabase.getInstance(context); + mDatabase = WebViewDatabase.getInstance(appContext); mWebViewCore = w; AssetManager am = context.getAssets(); @@ -496,7 +499,7 @@ class BrowserFrame extends Handler { * @param uri A String representing the URI of the desired file. * @param buffer The byte array to copy the data into. * @param offset The offet into buffer to place the data. - * @param expectSize The size that the buffer has allocated for this file. + * @param expectedSize The size that the buffer has allocated for this file. * @return int The size of the given file, or zero if it fails. */ private int getFile(String uri, byte[] buffer, int offset, diff --git a/core/java/android/webkit/CacheManager.java b/core/java/android/webkit/CacheManager.java index c167414120034..c4e26bc34461e 100644 --- a/core/java/android/webkit/CacheManager.java +++ b/core/java/android/webkit/CacheManager.java @@ -167,7 +167,7 @@ public final class CacheManager { * @param context The application context. */ static void init(Context context) { - mDataBase = WebViewDatabase.getInstance(context); + mDataBase = WebViewDatabase.getInstance(context.getApplicationContext()); mBaseDir = new File(context.getCacheDir(), "webviewCache"); if (createCacheDirectory() && mClearCacheOnInit) { removeAllCacheFiles(); diff --git a/core/java/android/webkit/CookieSyncManager.java b/core/java/android/webkit/CookieSyncManager.java index 14375d2b13228..abe91789b6e61 100644 --- a/core/java/android/webkit/CookieSyncManager.java +++ b/core/java/android/webkit/CookieSyncManager.java @@ -93,7 +93,7 @@ public final class CookieSyncManager extends WebSyncManager { public static synchronized CookieSyncManager createInstance( Context context) { if (sRef == null) { - sRef = new CookieSyncManager(context); + sRef = new CookieSyncManager(context.getApplicationContext()); } return sRef; } diff --git a/core/java/android/webkit/PluginManager.java b/core/java/android/webkit/PluginManager.java index 88429c50442f3..141984a7fd847 100644 --- a/core/java/android/webkit/PluginManager.java +++ b/core/java/android/webkit/PluginManager.java @@ -96,7 +96,7 @@ public class PluginManager { throw new IllegalStateException( "First call to PluginManager need a valid context."); } - mInstance = new PluginManager(context); + mInstance = new PluginManager(context.getApplicationContext()); } return mInstance; } diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index 3207c7901f6dd..add4ac774354c 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -732,7 +732,7 @@ public class WebView extends AbsoluteLayout /** * Construct a new WebView with layout parameters, a default style and a set * of custom Javscript interfaces to be added to the WebView at initialization - * time. This guraratees that these interfaces will be available when the JS + * time. This guarantees that these interfaces will be available when the JS * context is initialized. * @param context A Context object used to access application assets. * @param attrs An AttributeSet passed to our parent.