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, |