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