Index: content/app/android/sandboxed_process_service.cc |
diff --git a/content/app/android/sandboxed_process_service.cc b/content/app/android/sandboxed_process_service.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6954d280559e1e32f5699e73f38fcbccc11db67b |
--- /dev/null |
+++ b/content/app/android/sandboxed_process_service.cc |
@@ -0,0 +1,101 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "content/app/android/sandboxed_process_service.h" |
+ |
+#include "base/global_descriptors_posix.h" |
+#include "base/logging.h" |
+#include "content/common/android/surface_texture_peer.h" |
+#if !defined(ANDROID_UPSTREAM_BRINGUP) |
+#include "content/common/chrome_descriptors.h" |
+#endif |
+#include "content/public/app/android_library_loader_hooks.h" |
+#include "ipc/ipc_descriptors.h" |
+#include "jni/sandboxed_process_service_jni.h" |
+ |
+using base::android::AttachCurrentThread; |
+using base::android::CheckException; |
+ |
+namespace { |
+ |
+class SurfaceTexturePeerSandboxedImpl : public content::SurfaceTexturePeer { |
+ public: |
+ // |service| is the instance of |
+ // org.chromium.content.app.SandboxedProcessService. |
+ SurfaceTexturePeerSandboxedImpl(jobject service) |
+ : service_(service) { |
+ } |
+ |
+ virtual ~SurfaceTexturePeerSandboxedImpl() { |
+ } |
+ |
+ virtual void EstablishSurfaceTexturePeer(base::ProcessHandle pid, |
+ SurfaceTextureTarget type, |
+ jobject j_surface_texture, |
+ int primary_id, |
+ int secondary_id) { |
+ JNIEnv* env = base::android::AttachCurrentThread(); |
+ Java_SandboxedProcessService_establishSurfaceTexturePeer(env, service_, |
+ pid, type, j_surface_texture, primary_id, secondary_id); |
+ CheckException(env); |
+ } |
+ |
+ private: |
+ // The instance of org.chromium.content.app.SandboxedProcessService. |
+ jobject service_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(SurfaceTexturePeerSandboxedImpl); |
+}; |
+ |
+// Chrome actually uses the renderer code path for all of its sandboxed |
+// processes such as renderers, plugins, etc. |
+void InternalInitSandboxedProcess(int ipc_fd, |
+ int crash_fd, |
+ JNIEnv* env, |
+ jclass clazz, |
+ jobject context, |
+ jobject service) { |
+ // Set up the IPC file descriptor mapping. |
+ base::GlobalDescriptors::GetInstance()->Set(kPrimaryIPCChannel, ipc_fd); |
+#if defined(USE_LINUX_BREAKPAD) |
+ if (crash_fd > 0) { |
+ base::GlobalDescriptors::GetInstance()->Set(kCrashDumpSignal, crash_fd); |
+ } |
+#endif |
+ content::SurfaceTexturePeer::InitInstance( |
+ new SurfaceTexturePeerSandboxedImpl(service)); |
+ |
+} |
+ |
+} // namespace <anonymous> |
+ |
+static void InitSandboxedProcess(JNIEnv* env, |
+ jclass clazz, |
+ jobject context, |
+ jobject service, |
+ jint ipc_fd, |
+ jint crash_fd) { |
+ InternalInitSandboxedProcess(static_cast<int>(ipc_fd), |
+ static_cast<int>(crash_fd), env, clazz, context, service); |
+ |
+ // sandboxed process can't be reused. There is no need to wait for the browser |
+ // to unbind the service. Just exit and done. |
+ LOG(INFO) << "SandboxedProcessService: Drop out of SandboxedProcessMain."; |
+} |
+ |
+static void ExitSandboxedProcess(JNIEnv* env, jclass clazz) { |
+ LOG(INFO) << "SandboxedProcessService: Exiting sandboxed process."; |
+ // TODO(tedchoc): These methods should also be in the content namespace to |
+ // avoid specifying it in the LibraryLoaderExitHook call. |
+ content::LibraryLoaderExitHook(); |
+ _exit(0); |
+} |
+ |
+namespace content { |
+ |
+bool RegisterSandboxedProcessService(JNIEnv* env) { |
+ return RegisterNativesImpl(env); |
+} |
+ |
+} // namespace content |