12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/android/child_process_launcher_android.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/android/jni_android.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/android/jni_array.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/browser/frame_host/render_frame_host_impl.h"
12d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "content/browser/media/android/browser_media_player_manager.h"
13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "content/browser/media/media_web_contents_observer.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/compositor_impl_android.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/render_view_host_impl.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/browser_thread.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/render_process_host.h"
187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/public/common/content_switches.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "jni/ChildProcessLauncher_jni.h"
20b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "media/base/android/media_player_android.h"
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/gl/android/scoped_java_surface.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using base::android::AttachCurrentThread;
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using base::android::ToJavaArrayOfStrings;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using base::android::ScopedJavaGlobalRef;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using base::android::ScopedJavaLocalRef;
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::StartChildProcessCallback;
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content {
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
33b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// Pass a java surface object to the MediaPlayerAndroid object
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// identified by render process handle, render frame ID and player ID.
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void SetSurfacePeer(
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::android::JavaRef<jobject>& surface,
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::ProcessHandle render_process_handle,
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    int render_frame_id,
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int player_id) {
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int render_process_id = 0;
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderProcessHost::iterator it = RenderProcessHost::AllHostsIterator();
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (!it.IsAtEnd()) {
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (it.GetCurrentValue()->GetHandle() == render_process_handle) {
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      render_process_id = it.GetCurrentValue()->GetID();
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    it.Advance();
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!render_process_id) {
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DVLOG(1) << "Cannot find render process for render_process_handle "
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)             << render_process_handle;
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RenderFrameHostImpl* frame =
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      RenderFrameHostImpl::FromID(render_process_id, render_frame_id);
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!frame) {
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DVLOG(1) << "Cannot find frame for render_frame_id " << render_frame_id;
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RenderViewHostImpl* view =
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      static_cast<RenderViewHostImpl*>(frame->GetRenderViewHost());
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  BrowserMediaPlayerManager* player_manager =
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      view->media_web_contents_observer()->GetMediaPlayerManager(frame);
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!player_manager) {
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DVLOG(1) << "Cannot find the media player manager for frame " << frame;
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  media::MediaPlayerAndroid* player = player_manager->GetPlayer(player_id);
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!player) {
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DVLOG(1) << "Cannot find media player for player_id " << player_id;
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (player != player_manager->GetFullscreenPlayer()) {
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    gfx::ScopedJavaSurface scoped_surface(surface);
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    player->SetVideoSurface(scoped_surface.Pass());
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // anonymous namespace
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Called from ChildProcessLauncher.java when the ChildProcess was
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// started.
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// |client_context| is the pointer to StartChildProcessCallback which was
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// passed in from StartChildProcess.
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// |handle| is the processID of the child process as originated in Java, 0 if
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the ChildProcess could not be created.
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void OnChildProcessStarted(JNIEnv*,
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  jclass,
93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                  jlong client_context,
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  jint handle) {
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StartChildProcessCallback* callback =
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      reinterpret_cast<StartChildProcessCallback*>(client_context);
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (handle)
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    callback->Run(static_cast<base::ProcessHandle>(handle));
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delete callback;
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void StartChildProcess(
1036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const base::CommandLine::StringVector& argv,
1044ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    int child_process_id,
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::vector<content::FileDescriptorInfo>& files_to_register,
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const StartChildProcessCallback& callback) {
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(env);
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Create the Command line String[]
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jobjectArray> j_argv = ToJavaArrayOfStrings(env, argv);
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t file_count = files_to_register.size();
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(file_count > 0);
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jintArray> j_file_ids(env, env->NewIntArray(file_count));
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::android::CheckException(env);
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  jint* file_ids = env->GetIntArrayElements(j_file_ids.obj(), NULL);
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::android::CheckException(env);
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jintArray> j_file_fds(env, env->NewIntArray(file_count));
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::android::CheckException(env);
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  jint* file_fds = env->GetIntArrayElements(j_file_fds.obj(), NULL);
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::android::CheckException(env);
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jbooleanArray> j_file_auto_close(
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      env, env->NewBooleanArray(file_count));
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::android::CheckException(env);
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  jboolean* file_auto_close =
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      env->GetBooleanArrayElements(j_file_auto_close.obj(), NULL);
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::android::CheckException(env);
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < file_count; ++i) {
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const content::FileDescriptorInfo& fd_info = files_to_register[i];
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file_ids[i] = fd_info.id;
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file_fds[i] = fd_info.fd.fd;
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file_auto_close[i] = fd_info.fd.auto_close;
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  env->ReleaseIntArrayElements(j_file_ids.obj(), file_ids, 0);
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  env->ReleaseIntArrayElements(j_file_fds.obj(), file_fds, 0);
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  env->ReleaseBooleanArrayElements(j_file_auto_close.obj(), file_auto_close, 0);
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Java_ChildProcessLauncher_start(env,
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::android::GetApplicationContext(),
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      j_argv.obj(),
1434ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      child_process_id,
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      j_file_ids.obj(),
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      j_file_fds.obj(),
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      j_file_auto_close.obj(),
147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      reinterpret_cast<intptr_t>(new StartChildProcessCallback(callback)));
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void StopChildProcess(base::ProcessHandle handle) {
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(env);
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Java_ChildProcessLauncher_stop(env, static_cast<jint>(handle));
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool IsChildProcessOomProtected(base::ProcessHandle handle) {
157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(env);
159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return Java_ChildProcessLauncher_isOomProtected(env,
160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      static_cast<jint>(handle));
161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
163a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid SetChildProcessInForeground(base::ProcessHandle handle,
164a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    bool in_foreground) {
165a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  JNIEnv* env = AttachCurrentThread();
166a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  DCHECK(env);
167a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return Java_ChildProcessLauncher_setInForeground(env,
168a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      static_cast<jint>(handle), static_cast<jboolean>(in_foreground));
169a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
170a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void EstablishSurfacePeer(
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    JNIEnv* env, jclass clazz,
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    jint pid, jobject surface, jint primary_id, jint secondary_id) {
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaGlobalRef<jobject> jsurface;
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  jsurface.Reset(env, surface);
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (jsurface.is_null())
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::UI));
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &SetSurfacePeer, jsurface, pid, primary_id, secondary_id));
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
184c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RegisterViewSurface(int surface_id, jobject j_surface) {
185c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  JNIEnv* env = AttachCurrentThread();
186c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DCHECK(env);
187c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  Java_ChildProcessLauncher_registerViewSurface(env, surface_id, j_surface);
1884ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch}
1894ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
190c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid UnregisterViewSurface(int surface_id) {
191c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  JNIEnv* env = AttachCurrentThread();
192c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DCHECK(env);
193c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  Java_ChildProcessLauncher_unregisterViewSurface(env, surface_id);
194c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
195c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
196c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RegisterChildProcessSurfaceTexture(int surface_texture_id,
197c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                        int child_process_id,
198c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                        jobject j_surface_texture) {
199c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  JNIEnv* env = AttachCurrentThread();
200c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DCHECK(env);
201c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  Java_ChildProcessLauncher_registerSurfaceTexture(
202c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      env, surface_texture_id, child_process_id, j_surface_texture);
203c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
204c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
205c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid UnregisterChildProcessSurfaceTexture(int surface_texture_id,
206c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                          int child_process_id) {
207c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  JNIEnv* env = AttachCurrentThread();
208c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DCHECK(env);
209c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  Java_ChildProcessLauncher_unregisterSurfaceTexture(
210c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      env, surface_texture_id, child_process_id);
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochjboolean IsSingleProcess(JNIEnv* env, jclass clazz) {
2146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return base::CommandLine::ForCurrentProcess()->HasSwitch(
2156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      switches::kSingleProcess);
2167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RegisterChildProcessLauncher(JNIEnv* env) {
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return RegisterNativesImpl(env);
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace content
223