Chromium Code Reviews| 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 |
| index 6316ab8f7f78fb880e5b81efd02aacfcf5f91344..d694f5b4f0847b2bf530c6f7c2335ea127b0fe1c 100644 |
| --- a/content/app/android/sandboxed_process_service.cc |
| +++ b/content/app/android/sandboxed_process_service.cc |
| @@ -4,14 +4,17 @@ |
| #include "content/app/android/sandboxed_process_service.h" |
| +#include <android/native_window_jni.h> |
| #include <cpu-features.h> |
| #include "base/android/jni_array.h" |
| #include "base/logging.h" |
| #include "base/posix/global_descriptors.h" |
| +#include "content/common/android/scoped_java_surface.h" |
| #include "content/common/android/surface_texture_peer.h" |
| #include "content/common/child_process.h" |
| #include "content/common/child_thread.h" |
| +#include "content/common/gpu/gpu_surface_lookup.h" |
| #include "content/public/app/android_library_loader_hooks.h" |
| #include "content/public/common/content_descriptors.h" |
| #include "ipc/ipc_descriptors.h" |
| @@ -21,17 +24,23 @@ using base::android::AttachCurrentThread; |
| using base::android::CheckException; |
| using base::android::JavaIntArrayToIntVector; |
| +namespace content { |
| + |
| namespace { |
| -class SurfaceTexturePeerSandboxedImpl : public content::SurfaceTexturePeer { |
| +class SurfaceTexturePeerSandboxedImpl : public content::SurfaceTexturePeer, |
| + public content::GpuSurfaceLookup { |
| public: |
| // |service| is the instance of |
| // org.chromium.content.app.SandboxedProcessService. |
| - SurfaceTexturePeerSandboxedImpl(jobject service) |
| + SurfaceTexturePeerSandboxedImpl( |
|
bulach
2013/03/05 14:23:58
nit: explicit
no sievers
2013/03/07 00:51:06
Done.
|
| + const base::android::ScopedJavaLocalRef<jobject>& service) |
| : service_(service) { |
| + GpuSurfaceLookup::InitInstance(this); |
| } |
| virtual ~SurfaceTexturePeerSandboxedImpl() { |
| + GpuSurfaceLookup::InitInstance(NULL); |
| } |
| virtual void EstablishSurfaceTexturePeer( |
| @@ -42,15 +51,31 @@ class SurfaceTexturePeerSandboxedImpl : public content::SurfaceTexturePeer { |
| int secondary_id) { |
| JNIEnv* env = base::android::AttachCurrentThread(); |
| content::Java_SandboxedProcessService_establishSurfaceTexturePeer( |
| - env, service_, pid, type, |
| + env, service_.obj(), pid, |
| surface_texture_bridge->j_surface_texture().obj(), primary_id, |
| secondary_id); |
| CheckException(env); |
| } |
| + virtual gfx::AcceleratedWidget AcquireNativeWidget(int surface_id) OVERRIDE { |
| + JNIEnv* env = base::android::AttachCurrentThread(); |
| + ScopedJavaSurface surface( |
| + content::Java_SandboxedProcessService_getViewSurface( |
| + env, service_.obj(), surface_id)); |
| + CheckException(env); |
|
bulach
2013/03/05 14:23:58
nit: all generated Java_ methods call "CheckExcept
no sievers
2013/03/07 00:51:06
Done.
|
| + |
| + if (surface.j_surface().is_null()) |
| + return NULL; |
| + |
| + ANativeWindow* native_window = ANativeWindow_fromSurface( |
| + env, surface.j_surface().obj()); |
| + |
| + return native_window; |
| + } |
| + |
| private: |
| // The instance of org.chromium.content.app.SandboxedProcessService. |
| - jobject service_; |
| + base::android::ScopedJavaGlobalRef<jobject> service_; |
| DISALLOW_COPY_AND_ASSIGN(SurfaceTexturePeerSandboxedImpl); |
| }; |
| @@ -62,9 +87,11 @@ void InternalInitSandboxedProcess(const std::vector<int>& file_ids, |
| JNIEnv* env, |
| jclass clazz, |
| jobject context, |
| - jobject service, |
| + jobject service_in, |
| jint cpu_count, |
| jlong cpu_features) { |
| + base::android::ScopedJavaLocalRef<jobject> service(env, service_in); |
| + |
| // Set the CPU properties. |
| android_setCpu(cpu_count, cpu_features); |
| // Register the file descriptors. |
| @@ -85,8 +112,6 @@ void QuitSandboxMainThreadMessageLoop() { |
| } // namespace <anonymous> |
| -namespace content { |
| - |
| void InitSandboxedProcess(JNIEnv* env, |
| jclass clazz, |
| jobject context, |