Merge "Remove WebView leak"

This commit is contained in:
Kristian Monsen
2010-12-20 06:04:51 -08:00
committed by Android (Google) Code Review
2 changed files with 49 additions and 50 deletions

View File

@@ -991,10 +991,10 @@ public class WebView extends AbsoluteLayout
}
/*
* The intent receiver that monitors for changes to relevant packages (e.g.,
* sGoogleApps) and notifies WebViewCore of their existence.
* A variable to track if there is a receiver added for ACTION_PACKAGE_ADDED
* or ACTION_PACKAGE_REMOVED.
*/
private static BroadcastReceiver sPackageInstallationReceiver = null;
private static boolean sPackageInstallationReceiverAdded = false;
/*
* A set of Google packages we monitor for the
@@ -1007,6 +1007,32 @@ public class WebView extends AbsoluteLayout
sGoogleApps.add("com.google.android.youtube");
}
private static class PackageListener extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
final String packageName = intent.getData().getSchemeSpecificPart();
final boolean replacing = intent.getBooleanExtra(Intent.EXTRA_REPLACING, false);
if (Intent.ACTION_PACKAGE_REMOVED.equals(action) && replacing) {
// if it is replacing, refreshPlugins() when adding
return;
}
if (sGoogleApps.contains(packageName)) {
if (Intent.ACTION_PACKAGE_ADDED.equals(action)) {
WebViewCore.sendStaticMessage(EventHub.ADD_PACKAGE_NAME, packageName);
} else {
WebViewCore.sendStaticMessage(EventHub.REMOVE_PACKAGE_NAME, packageName);
}
}
PluginManager pm = PluginManager.getInstance(context);
if (pm.containsPluginPermissionAndSignatures(packageName)) {
pm.refreshPlugins(Intent.ACTION_PACKAGE_ADDED.equals(action));
}
}
}
private void setupPackageListener(Context context) {
/*
@@ -1018,41 +1044,16 @@ public class WebView extends AbsoluteLayout
// if the receiver already exists then we do not need to register it
// again
if (sPackageInstallationReceiver != null) {
if (sPackageInstallationReceiverAdded) {
return;
}
IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
filter.addDataScheme("package");
sPackageInstallationReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
final String packageName = intent.getData().getSchemeSpecificPart();
final boolean replacing = intent.getBooleanExtra(Intent.EXTRA_REPLACING, false);
if (Intent.ACTION_PACKAGE_REMOVED.equals(action) && replacing) {
// if it is replacing, refreshPlugins() when adding
return;
}
if (sGoogleApps.contains(packageName) && mWebViewCore != null) {
if (Intent.ACTION_PACKAGE_ADDED.equals(action)) {
mWebViewCore.sendMessage(EventHub.ADD_PACKAGE_NAME, packageName);
} else {
mWebViewCore.sendMessage(EventHub.REMOVE_PACKAGE_NAME, packageName);
}
}
PluginManager pm = PluginManager.getInstance(context);
if (pm.containsPluginPermissionAndSignatures(packageName)) {
pm.refreshPlugins(Intent.ACTION_PACKAGE_ADDED.equals(action));
}
}
};
context.getApplicationContext().registerReceiver(sPackageInstallationReceiver, filter);
BroadcastReceiver packageListener = new PackageListener();
context.getApplicationContext().registerReceiver(packageListener, filter);
sPackageInstallationReceiverAdded = true;
}
// check if any of the monitored apps are already installed

View File

@@ -668,6 +668,22 @@ final class WebViewCore {
Process.setThreadPriority(
Process.THREAD_PRIORITY_DEFAULT);
break;
case EventHub.ADD_PACKAGE_NAME:
if (BrowserFrame.sJavaBridge == null) {
throw new IllegalStateException(
"No WebView has been created in this process!");
}
BrowserFrame.sJavaBridge.addPackageName((String) msg.obj);
break;
case EventHub.REMOVE_PACKAGE_NAME:
if (BrowserFrame.sJavaBridge == null) {
throw new IllegalStateException(
"No WebView has been created in this process!");
}
BrowserFrame.sJavaBridge.removePackageName((String) msg.obj);
break;
}
}
};
@@ -1488,24 +1504,6 @@ final class WebViewCore {
(Set<String>) msg.obj);
break;
case ADD_PACKAGE_NAME:
if (BrowserFrame.sJavaBridge == null) {
throw new IllegalStateException("No WebView " +
"has been created in this process!");
}
BrowserFrame.sJavaBridge.addPackageName(
(String) msg.obj);
break;
case REMOVE_PACKAGE_NAME:
if (BrowserFrame.sJavaBridge == null) {
throw new IllegalStateException("No WebView " +
"has been created in this process!");
}
BrowserFrame.sJavaBridge.removePackageName(
(String) msg.obj);
break;
case GET_TOUCH_HIGHLIGHT_RECTS:
TouchHighlightData d = (TouchHighlightData) msg.obj;
ArrayList<Rect> rects = nativeGetTouchHighlightRects