| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "shell/android/main.h" | 5 #include "shell/android/main.h" |
| 6 | 6 |
| 7 #include "base/android/fifo_utils.h" | 7 #include "base/android/fifo_utils.h" |
| 8 #include "base/android/jni_android.h" | 8 #include "base/android/jni_android.h" |
| 9 #include "base/android/jni_array.h" | 9 #include "base/android/jni_array.h" |
| 10 #include "base/android/jni_string.h" | 10 #include "base/android/jni_string.h" |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 #include "jni/ShellMain_jni.h" | 22 #include "jni/ShellMain_jni.h" |
| 23 #include "mojo/common/message_pump_mojo.h" | 23 #include "mojo/common/message_pump_mojo.h" |
| 24 #include "shell/android/android_handler_loader.h" | 24 #include "shell/android/android_handler_loader.h" |
| 25 #include "shell/android/background_application_loader.h" | 25 #include "shell/android/background_application_loader.h" |
| 26 #include "shell/android/native_viewport_application_loader.h" | 26 #include "shell/android/native_viewport_application_loader.h" |
| 27 #include "shell/android/ui_application_loader_android.h" | 27 #include "shell/android/ui_application_loader_android.h" |
| 28 #include "shell/application_manager/application_loader.h" | 28 #include "shell/application_manager/application_loader.h" |
| 29 #include "shell/command_line_util.h" | 29 #include "shell/command_line_util.h" |
| 30 #include "shell/context.h" | 30 #include "shell/context.h" |
| 31 #include "shell/init.h" | 31 #include "shell/init.h" |
| 32 #include "shell/switches.h" |
| 33 #include "shell/tracer.h" |
| 32 #include "ui/gl/gl_surface_egl.h" | 34 #include "ui/gl/gl_surface_egl.h" |
| 33 | 35 |
| 34 using base::LazyInstance; | 36 using base::LazyInstance; |
| 35 | 37 |
| 36 namespace shell { | 38 namespace shell { |
| 37 | 39 |
| 38 namespace { | 40 namespace { |
| 39 | 41 |
| 40 // Tag for logging. | 42 // Tag for logging. |
| 41 const char kLogTag[] = "chromium"; | 43 const char kLogTag[] = "chromium"; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 59 const base::FilePath mojo_shell_path_; | 61 const base::FilePath mojo_shell_path_; |
| 60 const base::FilePath mojo_shell_child_path_; | 62 const base::FilePath mojo_shell_child_path_; |
| 61 const std::vector<std::string> parameters_; | 63 const std::vector<std::string> parameters_; |
| 62 | 64 |
| 63 DISALLOW_COPY_AND_ASSIGN(MojoShellRunner); | 65 DISALLOW_COPY_AND_ASSIGN(MojoShellRunner); |
| 64 }; | 66 }; |
| 65 | 67 |
| 66 LazyInstance<scoped_ptr<base::MessageLoop>> g_java_message_loop = | 68 LazyInstance<scoped_ptr<base::MessageLoop>> g_java_message_loop = |
| 67 LAZY_INSTANCE_INITIALIZER; | 69 LAZY_INSTANCE_INITIALIZER; |
| 68 | 70 |
| 71 LazyInstance<scoped_ptr<Tracer>> g_tracer = LAZY_INSTANCE_INITIALIZER; |
| 69 LazyInstance<scoped_ptr<Context>> g_context = LAZY_INSTANCE_INITIALIZER; | 72 LazyInstance<scoped_ptr<Context>> g_context = LAZY_INSTANCE_INITIALIZER; |
| 70 | 73 |
| 71 LazyInstance<scoped_ptr<MojoShellRunner>> g_shell_runner = | 74 LazyInstance<scoped_ptr<MojoShellRunner>> g_shell_runner = |
| 72 LAZY_INSTANCE_INITIALIZER; | 75 LAZY_INSTANCE_INITIALIZER; |
| 73 | 76 |
| 74 LazyInstance<scoped_ptr<base::DelegateSimpleThread>> g_shell_thread = | 77 LazyInstance<scoped_ptr<base::DelegateSimpleThread>> g_shell_thread = |
| 75 LAZY_INSTANCE_INITIALIZER; | 78 LAZY_INSTANCE_INITIALIZER; |
| 76 | 79 |
| 77 LazyInstance<base::android::ScopedJavaGlobalRef<jobject>> g_main_activiy = | 80 LazyInstance<base::android::ScopedJavaGlobalRef<jobject>> g_main_activity = |
| 78 LAZY_INSTANCE_INITIALIZER; | 81 LAZY_INSTANCE_INITIALIZER; |
| 79 | 82 |
| 80 void ConfigureAndroidServices(Context* context) { | 83 void ConfigureAndroidServices(Context* context) { |
| 81 context->application_manager()->SetLoaderForURL( | 84 context->application_manager()->SetLoaderForURL( |
| 82 make_scoped_ptr(new UIApplicationLoader( | 85 make_scoped_ptr(new UIApplicationLoader( |
| 83 make_scoped_ptr(new NativeViewportApplicationLoader()), | 86 make_scoped_ptr(new NativeViewportApplicationLoader()), |
| 84 g_java_message_loop.Get().get())), | 87 g_java_message_loop.Get().get())), |
| 85 GURL("mojo:native_viewport_service")); | 88 GURL("mojo:native_viewport_service")); |
| 86 | 89 |
| 87 // Android handler is bundled with the Mojo shell, because it uses the | 90 // Android handler is bundled with the Mojo shell, because it uses the |
| 88 // MojoShell application as the JNI bridge to bootstrap execution of other | 91 // MojoShell application as the JNI bridge to bootstrap execution of other |
| 89 // Android Mojo apps that need JNI. | 92 // Android Mojo apps that need JNI. |
| 90 context->application_manager()->SetLoaderForURL( | 93 context->application_manager()->SetLoaderForURL( |
| 91 make_scoped_ptr(new BackgroundApplicationLoader( | 94 make_scoped_ptr(new BackgroundApplicationLoader( |
| 92 make_scoped_ptr(new AndroidHandlerLoader()), "android_handler", | 95 make_scoped_ptr(new AndroidHandlerLoader()), "android_handler", |
| 93 base::MessageLoop::TYPE_DEFAULT)), | 96 base::MessageLoop::TYPE_DEFAULT)), |
| 94 GURL("mojo:android_handler")); | 97 GURL("mojo:android_handler")); |
| 95 | 98 |
| 96 // By default, the keyboard is handled by the native_viewport_service. | 99 // By default, the keyboard is handled by the native_viewport_service. |
| 97 context->url_resolver()->AddURLMapping(GURL("mojo:keyboard"), | 100 context->url_resolver()->AddURLMapping(GURL("mojo:keyboard"), |
| 98 GURL("mojo:native_viewport_service")); | 101 GURL("mojo:native_viewport_service")); |
| 99 } | 102 } |
| 100 | 103 |
| 101 void QuitShellThread() { | 104 void QuitShellThread() { |
| 102 g_shell_thread.Get()->Join(); | 105 g_shell_thread.Get()->Join(); |
| 103 g_shell_thread.Pointer()->reset(); | 106 g_shell_thread.Pointer()->reset(); |
| 104 Java_ShellMain_finishActivity(base::android::AttachCurrentThread(), | 107 Java_ShellMain_finishActivity(base::android::AttachCurrentThread(), |
| 105 g_main_activiy.Get().obj()); | 108 g_main_activity.Get().obj()); |
| 106 exit(0); | 109 exit(0); |
| 107 } | 110 } |
| 108 | 111 |
| 109 void MojoShellRunner::Run() { | 112 void MojoShellRunner::Run() { |
| 110 base::MessageLoop loop(mojo::common::MessagePumpMojo::Create()); | 113 base::MessageLoop loop(mojo::common::MessagePumpMojo::Create()); |
| 111 Context* context = g_context.Pointer()->get(); | 114 Context* context = g_context.Pointer()->get(); |
| 112 ConfigureAndroidServices(context); | 115 ConfigureAndroidServices(context); |
| 113 context->InitWithPaths(mojo_shell_path_, mojo_shell_child_path_); | 116 context->InitWithPaths(mojo_shell_path_, mojo_shell_child_path_); |
| 114 | 117 |
| 115 for (const auto& args : parameters_) | 118 for (const auto& args : parameters_) |
| (...skipping 28 matching lines...) Expand all Loading... |
| 144 } // namespace | 147 } // namespace |
| 145 | 148 |
| 146 static void Init(JNIEnv* env, | 149 static void Init(JNIEnv* env, |
| 147 jclass clazz, | 150 jclass clazz, |
| 148 jobject activity, | 151 jobject activity, |
| 149 jstring mojo_shell_path, | 152 jstring mojo_shell_path, |
| 150 jstring mojo_shell_child_path, | 153 jstring mojo_shell_child_path, |
| 151 jobjectArray jparameters, | 154 jobjectArray jparameters, |
| 152 jstring j_local_apps_directory, | 155 jstring j_local_apps_directory, |
| 153 jstring j_tmp_dir) { | 156 jstring j_tmp_dir) { |
| 154 g_main_activiy.Get().Reset(env, activity); | 157 g_main_activity.Get().Reset(env, activity); |
| 155 | 158 |
| 159 std::string tmp_dir = base::android::ConvertJavaStringToUTF8(env, j_tmp_dir); |
| 156 // Setting the TMPDIR environment variable so that applications can use it. | 160 // Setting the TMPDIR environment variable so that applications can use it. |
| 157 // TODO(qsr) We will need our subprocesses to inherit this. | 161 // TODO(qsr) We will need our subprocesses to inherit this. |
| 158 int return_value = | 162 int return_value = setenv("TMPDIR", tmp_dir.c_str(), 1); |
| 159 setenv("TMPDIR", | |
| 160 base::android::ConvertJavaStringToUTF8(env, j_tmp_dir).c_str(), 1); | |
| 161 DCHECK_EQ(return_value, 0); | 163 DCHECK_EQ(return_value, 0); |
| 162 | 164 |
| 163 base::android::ScopedJavaLocalRef<jobject> scoped_activity(env, activity); | 165 base::android::ScopedJavaLocalRef<jobject> scoped_activity(env, activity); |
| 164 base::android::InitApplicationContext(env, scoped_activity); | 166 base::android::InitApplicationContext(env, scoped_activity); |
| 165 | 167 |
| 166 std::vector<std::string> parameters; | 168 std::vector<std::string> parameters; |
| 167 parameters.push_back( | 169 parameters.push_back( |
| 168 base::android::ConvertJavaStringToUTF8(env, mojo_shell_path)); | 170 base::android::ConvertJavaStringToUTF8(env, mojo_shell_path)); |
| 169 base::android::AppendJavaStringArrayToStringVector(env, jparameters, | 171 base::android::AppendJavaStringArrayToStringVector(env, jparameters, |
| 170 ¶meters); | 172 ¶meters); |
| 171 base::CommandLine::Init(0, nullptr); | 173 base::CommandLine::Init(0, nullptr); |
| 172 base::CommandLine::ForCurrentProcess()->InitFromArgv(parameters); | 174 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); |
| 175 command_line->InitFromArgv(parameters); |
| 176 Tracer* tracer = new Tracer; |
| 177 g_tracer.Get().reset(tracer); |
| 178 bool trace_startup = command_line->HasSwitch(switches::kTraceStartup); |
| 179 if (trace_startup) |
| 180 tracer->Start(command_line->GetSwitchValueASCII(switches::kTraceStartup)); |
| 181 |
| 173 g_shell_runner.Get().reset(new MojoShellRunner( | 182 g_shell_runner.Get().reset(new MojoShellRunner( |
| 174 base::FilePath( | 183 base::FilePath( |
| 175 base::android::ConvertJavaStringToUTF8(env, mojo_shell_path)), | 184 base::android::ConvertJavaStringToUTF8(env, mojo_shell_path)), |
| 176 base::FilePath( | 185 base::FilePath( |
| 177 base::android::ConvertJavaStringToUTF8(env, mojo_shell_child_path)), | 186 base::android::ConvertJavaStringToUTF8(env, mojo_shell_child_path)), |
| 178 parameters)); | 187 parameters)); |
| 179 | 188 |
| 180 InitializeLogging(); | 189 InitializeLogging(); |
| 181 | 190 |
| 182 InitializeRedirection(); | 191 InitializeRedirection(); |
| 183 | 192 |
| 184 // We want ~MessageLoop to happen prior to ~Context. Initializing | 193 // We want ~MessageLoop to happen prior to ~Context. Initializing |
| 185 // LazyInstances is akin to stack-allocating objects; their destructors | 194 // LazyInstances is akin to stack-allocating objects; their destructors |
| 186 // will be invoked first-in-last-out. | 195 // will be invoked first-in-last-out. |
| 187 Context* shell_context = new Context(); | 196 Context* shell_context = new Context(); |
| 188 shell_context->SetShellFileRoot(base::FilePath( | 197 shell_context->SetShellFileRoot(base::FilePath( |
| 189 base::android::ConvertJavaStringToUTF8(env, j_local_apps_directory))); | 198 base::android::ConvertJavaStringToUTF8(env, j_local_apps_directory))); |
| 190 g_context.Get().reset(shell_context); | 199 g_context.Get().reset(shell_context); |
| 191 | 200 |
| 192 g_java_message_loop.Get().reset(new base::MessageLoopForUI); | 201 g_java_message_loop.Get().reset(new base::MessageLoopForUI); |
| 193 base::MessageLoopForUI::current()->Start(); | 202 base::MessageLoopForUI::current()->Start(); |
| 194 | 203 |
| 204 if (trace_startup) { |
| 205 g_java_message_loop.Get()->PostDelayedTask( |
| 206 FROM_HERE, |
| 207 base::Bind(&Tracer::StopAndFlushToFile, base::Unretained(tracer), |
| 208 tmp_dir + "/mojo_shell.trace"), |
| 209 base::TimeDelta::FromSeconds(5)); |
| 210 } |
| 211 |
| 195 // TODO(abarth): At which point should we switch to cross-platform | 212 // TODO(abarth): At which point should we switch to cross-platform |
| 196 // initialization? | 213 // initialization? |
| 197 | 214 |
| 198 gfx::GLSurface::InitializeOneOff(); | 215 gfx::GLSurface::InitializeOneOff(); |
| 199 } | 216 } |
| 200 | 217 |
| 201 static jboolean Start(JNIEnv* env, jclass clazz) { | 218 static jboolean Start(JNIEnv* env, jclass clazz) { |
| 202 if (!base::CommandLine::ForCurrentProcess()->GetArgs().size()) | 219 if (!base::CommandLine::ForCurrentProcess()->GetArgs().size()) |
| 203 return false; | 220 return false; |
| 204 | 221 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 223 return RegisterNativesImpl(env); | 240 return RegisterNativesImpl(env); |
| 224 } | 241 } |
| 225 | 242 |
| 226 } // namespace shell | 243 } // namespace shell |
| 227 | 244 |
| 228 // TODO(vtl): We need a main(), even though it should never be called. | 245 // TODO(vtl): We need a main(), even though it should never be called. |
| 229 int main(int argc, char** argv) { | 246 int main(int argc, char** argv) { |
| 230 NOTREACHED(); | 247 NOTREACHED(); |
| 231 return 1; | 248 return 1; |
| 232 } | 249 } |
| OLD | NEW |