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 e7118ffcc6ffd7b8982cfd94d14735ec8e217f05..2f0d5bc92324edd9dba1efa651b07c78a880d148 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) |
+ explicit SurfaceTexturePeerSandboxedImpl( |
+ const base::android::ScopedJavaLocalRef<jobject>& service) |
: service_(service) { |
+ GpuSurfaceLookup::InitInstance(this); |
} |
virtual ~SurfaceTexturePeerSandboxedImpl() { |
+ GpuSurfaceLookup::InitInstance(NULL); |
} |
virtual void EstablishSurfaceTexturePeer( |
@@ -41,15 +50,30 @@ class SurfaceTexturePeerSandboxedImpl : public content::SurfaceTexturePeer { |
int secondary_id) { |
JNIEnv* env = base::android::AttachCurrentThread(); |
content::Java_SandboxedProcessService_establishSurfaceTexturePeer( |
- env, service_, pid, |
+ 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)); |
+ |
+ 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); |
}; |
@@ -61,9 +85,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. |
@@ -84,8 +110,6 @@ void QuitSandboxMainThreadMessageLoop() { |
} // namespace <anonymous> |
-namespace content { |
- |
void InitSandboxedProcess(JNIEnv* env, |
jclass clazz, |
jobject context, |