Chromium Code Reviews| Index: content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java |
| diff --git a/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java |
| index 357062ac13bb573c6dde441f7ea6d7f6d51f7afb..25bafd8c9f31eac1ef1fa9a3f9da910ca5a6a6b7 100644 |
| --- a/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java |
| +++ b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java |
| @@ -5,6 +5,7 @@ |
| package org.chromium.content.browser; |
| import android.annotation.SuppressLint; |
| +import android.app.Service; |
| import android.content.Context; |
| import android.content.Intent; |
| import android.content.pm.ApplicationInfo; |
| @@ -27,7 +28,6 @@ import org.chromium.base.VisibleForTesting; |
| import org.chromium.base.annotations.CalledByNative; |
| import org.chromium.base.annotations.JNINamespace; |
| import org.chromium.base.library_loader.Linker; |
| -import org.chromium.content.app.ChildProcessService; |
| import org.chromium.content.app.ChromiumLinkerParams; |
| import org.chromium.content.app.DownloadProcessService; |
| import org.chromium.content.app.PrivilegedProcessService; |
| @@ -65,20 +65,20 @@ public class ChildProcessLauncher { |
| private final ArrayList<Integer> mFreeConnectionIndices; |
| private final Object mConnectionLock = new Object(); |
| - private Class<? extends ChildProcessService> mChildClass; |
| + private final Class<? extends Service> mChildClass; |
| private final boolean mInSandbox; |
| // Each Allocator keeps a queue for the pending spawn data. Once a connection is free, we |
| // dequeue the pending spawn data from the same allocator as the connection. |
| private final PendingSpawnQueue mPendingSpawnQueue = new PendingSpawnQueue(); |
| - public ChildConnectionAllocator(boolean inSandbox, int numChildServices) { |
| + public ChildConnectionAllocator(boolean inSandbox, int numChildServices, |
| + Class<? extends Service> serviceClass) { |
| mChildProcessConnections = new ChildProcessConnectionImpl[numChildServices]; |
| mFreeConnectionIndices = new ArrayList<Integer>(numChildServices); |
| for (int i = 0; i < numChildServices; i++) { |
| mFreeConnectionIndices.add(i); |
| } |
| - mChildClass = |
| - inSandbox ? SandboxedProcessService.class : PrivilegedProcessService.class; |
| + mChildClass = serviceClass; |
| mInSandbox = inSandbox; |
| } |
| @@ -235,6 +235,8 @@ public class ChildProcessLauncher { |
| "org.chromium.content.browser.NUM_SANDBOXED_SERVICES"; |
| private static final String NUM_PRIVILEGED_SERVICES_KEY = |
| "org.chromium.content.browser.NUM_PRIVILEGED_SERVICES"; |
| + private static final String SANDBOXED_SERVICES_NAME_KEY = |
| + "org.chromium.content.browser.SANDBOXED_SERVICES_NAME"; |
| // Overrides the number of available sandboxed services. |
| @VisibleForTesting |
| public static final String SWITCH_NUM_SANDBOXED_SERVICES_FOR_TESTING = "num-sandboxed-services"; |
| @@ -272,6 +274,35 @@ public class ChildProcessLauncher { |
| } |
| } |
| + private static Class<? extends Service> getClassOfService(Context context, boolean inSandbox, |
| + String packageName) { |
| + if (!inSandbox) { |
| + return PrivilegedProcessService.class; |
| + } |
| + try { |
| + PackageManager packageManager = context.getPackageManager(); |
| + ApplicationInfo appInfo = packageManager.getApplicationInfo(packageName, |
| + PackageManager.GET_META_DATA); |
| + if (appInfo.metaData != null) { |
| + String serviceName = appInfo.metaData.getString(SANDBOXED_SERVICES_NAME_KEY); |
| + if (serviceName != null) { |
| + try { |
| + Class<? extends Service> service = |
| + (Class<? extends Service>) Class.forName(serviceName); |
| + return service; |
| + } catch (ClassNotFoundException e) { |
| + Log.v(TAG, "The child service class doesn't exist"); |
| + return SandboxedProcessService.class; |
|
no sievers
2016/06/24 19:54:32
Should this throw an exception since it's a malfor
Xi Han
2016/06/24 20:57:47
Done.
|
| + } |
| + } |
| + } |
| + return SandboxedProcessService.class; |
| + } catch (PackageManager.NameNotFoundException e) { |
| + Log.v(TAG, "Could not get application info."); |
| + return SandboxedProcessService.class; |
|
no sievers
2016/06/24 19:54:32
And maybe this also?
Xi Han
2016/06/24 20:57:48
This causes ChildProcessLauncherTest which with a
|
| + } |
| + } |
| + |
| private static void initConnectionAllocatorsIfNecessary( |
| Context context, boolean inSandbox, String packageName) { |
| // TODO(mariakhomenko): Uses an Object to lock the access. |
| @@ -287,11 +318,13 @@ public class ChildProcessLauncher { |
| packageName); |
| sSandboxedChildConnectionAllocatorMap.put(packageName, |
| new ChildConnectionAllocator(true, |
| - getNumberOfServices(context, true, packageName))); |
| + getNumberOfServices(context, true, packageName), |
| + getClassOfService(context, true, packageName))); |
|
no sievers
2016/06/24 19:54:32
Doesn't it ignore the class name you set in ChildP
Xi Han
2016/06/24 20:57:47
Forgot to clean up the WebApkActivity.
|
| } |
| } else if (sPrivilegedChildConnectionAllocator == null) { |
| sPrivilegedChildConnectionAllocator = new ChildConnectionAllocator( |
| - false, getNumberOfServices(context, false, packageName)); |
| + false, getNumberOfServices(context, false, packageName), |
| + getClassOfService(context, false, packageName)); |
| } |
| // TODO(pkotwicz|hanxi): Figure out when old allocators should be removed from |
| // {@code sSandboxedChildConnectionAllocatorMap}. |
| @@ -944,8 +977,10 @@ public class ChildProcessLauncher { |
| @VisibleForTesting |
| static void enqueuePendingSpawnForTesting(Context context, String[] commandLine, |
| ChildProcessCreationParams creationParams, boolean inSandbox) { |
| + String packageName = creationParams != null ? creationParams.getPackageName() |
| + : context.getPackageName(); |
| PendingSpawnQueue pendingSpawnQueue = getPendingSpawnQueue(context, |
| - creationParams.getPackageName(), inSandbox); |
| + packageName, inSandbox); |
| synchronized (pendingSpawnQueue.mPendingSpawnsLock) { |
| pendingSpawnQueue.enqueueLocked(new PendingSpawnData(context, commandLine, 1, |
| new FileDescriptorInfo[0], 0, CALLBACK_FOR_RENDERER_PROCESS, true, |