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/mojo_main.h" | 5 #include "shell/android/mojo_main.h" |
6 | 6 |
7 #include "base/android/command_line_android.h" | 7 #include "base/android/command_line_android.h" |
8 #include "base/android/java_handler_thread.h" | 8 #include "base/android/java_handler_thread.h" |
9 #include "base/android/jni_android.h" | 9 #include "base/android/jni_android.h" |
10 #include "base/android/jni_string.h" | 10 #include "base/android/jni_string.h" |
11 #include "base/at_exit.h" | 11 #include "base/at_exit.h" |
12 #include "base/bind.h" | 12 #include "base/bind.h" |
13 #include "base/command_line.h" | 13 #include "base/command_line.h" |
14 #include "base/files/file_path.h" | 14 #include "base/files/file_path.h" |
15 #include "base/lazy_instance.h" | 15 #include "base/lazy_instance.h" |
16 #include "base/logging.h" | 16 #include "base/logging.h" |
17 #include "base/macros.h" | 17 #include "base/macros.h" |
18 #include "base/message_loop/message_loop.h" | 18 #include "base/message_loop/message_loop.h" |
19 #include "jni/MojoMain_jni.h" | 19 #include "jni/MojoMain_jni.h" |
20 #include "mojo/application_manager/application_loader.h" | 20 #include "mojo/application_manager/application_loader.h" |
21 #include "mojo/application_manager/application_manager.h" | 21 #include "mojo/application_manager/application_manager.h" |
22 #include "mojo/application_manager/background_shell_application_loader.h" | |
qsr
2014/12/16 09:20:49
You might not want to do this here, but this class
| |
23 #include "services/gles2/gpu_impl.h" | |
24 #include "services/native_viewport/native_viewport_impl.h" | |
25 #include "shell/android/android_handler_loader.h" | |
26 #include "shell/android/ui_application_loader_android.h" | |
22 #include "shell/context.h" | 27 #include "shell/context.h" |
23 #include "shell/init.h" | 28 #include "shell/init.h" |
24 #include "ui/gl/gl_surface_egl.h" | 29 #include "ui/gl/gl_surface_egl.h" |
25 | 30 |
26 using base::LazyInstance; | 31 using base::LazyInstance; |
27 | 32 |
28 namespace mojo { | 33 namespace mojo { |
34 namespace shell { | |
29 | 35 |
30 namespace { | 36 namespace { |
31 | 37 |
32 LazyInstance<scoped_ptr<base::MessageLoop>> g_java_message_loop = | 38 LazyInstance<scoped_ptr<base::MessageLoop>> g_java_message_loop = |
33 LAZY_INSTANCE_INITIALIZER; | 39 LAZY_INSTANCE_INITIALIZER; |
34 | 40 |
35 LazyInstance<scoped_ptr<shell::Context>> g_context = LAZY_INSTANCE_INITIALIZER; | 41 LazyInstance<scoped_ptr<Context>> g_context = LAZY_INSTANCE_INITIALIZER; |
36 | 42 |
37 LazyInstance<scoped_ptr<base::android::JavaHandlerThread>> g_shell_thread = | 43 LazyInstance<scoped_ptr<base::android::JavaHandlerThread>> g_shell_thread = |
38 LAZY_INSTANCE_INITIALIZER; | 44 LAZY_INSTANCE_INITIALIZER; |
39 | 45 |
46 class NativeViewportApplicationLoader : public ApplicationLoader, | |
qsr
2014/12/16 09:20:49
You might also not want to do this here, but this
| |
47 public ApplicationDelegate, | |
48 public InterfaceFactory<NativeViewport>, | |
49 public InterfaceFactory<Gpu> { | |
50 public: | |
51 NativeViewportApplicationLoader() : gpu_state_(new gles2::GpuImpl::State) {} | |
52 ~NativeViewportApplicationLoader() override {} | |
53 | |
54 private: | |
55 // ApplicationLoader implementation. | |
56 void Load(ApplicationManager* manager, | |
57 const GURL& url, | |
58 ScopedMessagePipeHandle shell_handle, | |
59 LoadCallback callback) override { | |
60 DCHECK(shell_handle.is_valid()); | |
61 app_.reset(new ApplicationImpl(this, shell_handle.Pass())); | |
62 } | |
63 | |
64 void OnApplicationError(ApplicationManager* manager, | |
65 const GURL& url) override {} | |
66 | |
67 // ApplicationDelegate implementation. | |
68 bool ConfigureIncomingConnection( | |
69 mojo::ApplicationConnection* connection) override { | |
70 connection->AddService<NativeViewport>(this); | |
71 connection->AddService<Gpu>(this); | |
72 return true; | |
73 } | |
74 | |
75 // InterfaceFactory<NativeViewport> implementation. | |
76 void Create(ApplicationConnection* connection, | |
77 InterfaceRequest<NativeViewport> request) override { | |
78 BindToRequest(new NativeViewportImpl(app_.get(), false), &request); | |
79 } | |
80 | |
81 // InterfaceFactory<Gpu> implementation. | |
82 void Create(ApplicationConnection* connection, | |
83 InterfaceRequest<Gpu> request) override { | |
84 new gles2::GpuImpl(request.Pass(), gpu_state_); | |
85 } | |
86 | |
87 scoped_refptr<gles2::GpuImpl::State> gpu_state_; | |
88 scoped_ptr<ApplicationImpl> app_; | |
89 DISALLOW_COPY_AND_ASSIGN(NativeViewportApplicationLoader); | |
90 }; | |
91 | |
92 void ConfigureAndroidServices(Context* context) { | |
93 context->application_manager()->SetLoaderForURL( | |
94 make_scoped_ptr(new UIApplicationLoader( | |
95 make_scoped_ptr(new NativeViewportApplicationLoader()), | |
96 g_java_message_loop.Get().get())), | |
97 GURL("mojo:native_viewport_service")); | |
98 | |
99 // Android handler is bundled with the Mojo shell, because it uses the | |
100 // MojoShell application as the JNI bridge to bootstrap execution of other | |
101 // Android Mojo apps that need JNI. | |
102 scoped_ptr<BackgroundShellApplicationLoader> loader( | |
103 new BackgroundShellApplicationLoader( | |
104 make_scoped_ptr(new AndroidHandlerLoader()), "android_handler", | |
105 base::MessageLoop::TYPE_DEFAULT)); | |
106 context->application_manager()->SetLoaderForURL(loader.Pass(), | |
qsr
2014/12/16 09:20:49
I know this is a refactoring, but any reason t use
sky
2014/12/16 16:30:17
Done.
| |
107 GURL("mojo:android_handler")); | |
108 } | |
109 | |
40 void RunShell(std::vector<GURL> app_urls) { | 110 void RunShell(std::vector<GURL> app_urls) { |
41 shell::Context* context = g_context.Pointer()->get(); | 111 Context* context = g_context.Pointer()->get(); |
42 context->Init(); | 112 context->Init(); |
43 context->set_ui_loop(g_java_message_loop.Get().get()); | 113 ConfigureAndroidServices(context); |
44 for (std::vector<GURL>::const_iterator it = app_urls.begin(); | 114 for (std::vector<GURL>::const_iterator it = app_urls.begin(); |
45 it != app_urls.end(); ++it) { | 115 it != app_urls.end(); ++it) { |
46 context->Run(*it); | 116 context->Run(*it); |
47 } | 117 } |
48 } | 118 } |
49 | 119 |
50 } // namespace | 120 } // namespace |
51 | 121 |
52 static void Init(JNIEnv* env, | 122 static void Init(JNIEnv* env, |
53 jclass clazz, | 123 jclass clazz, |
54 jobject context, | 124 jobject context, |
55 jstring mojo_shell_path, | 125 jstring mojo_shell_path, |
56 jobjectArray jparameters, | 126 jobjectArray jparameters, |
57 jstring j_local_apps_directory) { | 127 jstring j_local_apps_directory) { |
58 base::android::ScopedJavaLocalRef<jobject> scoped_context(env, context); | 128 base::android::ScopedJavaLocalRef<jobject> scoped_context(env, context); |
59 base::android::InitApplicationContext(env, scoped_context); | 129 base::android::InitApplicationContext(env, scoped_context); |
60 | 130 |
61 base::android::InitNativeCommandLineFromJavaArray(env, jparameters); | 131 base::android::InitNativeCommandLineFromJavaArray(env, jparameters); |
62 base::FilePath mojo_shell_file_path( | 132 base::FilePath mojo_shell_file_path( |
63 base::android::ConvertJavaStringToUTF8(env, mojo_shell_path)); | 133 base::android::ConvertJavaStringToUTF8(env, mojo_shell_path)); |
64 base::CommandLine::ForCurrentProcess()->SetProgram(mojo_shell_file_path); | 134 base::CommandLine::ForCurrentProcess()->SetProgram(mojo_shell_file_path); |
65 mojo::shell::InitializeLogging(); | 135 InitializeLogging(); |
66 | 136 |
67 // We want ~MessageLoop to happen prior to ~Context. Initializing | 137 // We want ~MessageLoop to happen prior to ~Context. Initializing |
68 // LazyInstances is akin to stack-allocating objects; their destructors | 138 // LazyInstances is akin to stack-allocating objects; their destructors |
69 // will be invoked first-in-last-out. | 139 // will be invoked first-in-last-out. |
70 shell::Context* shell_context = new shell::Context(); | 140 Context* shell_context = new Context(); |
71 shell_context->mojo_url_resolver()->SetLocalAppsPath(base::FilePath( | 141 shell_context->mojo_url_resolver()->SetLocalAppsPath(base::FilePath( |
72 base::android::ConvertJavaStringToUTF8(env, j_local_apps_directory))); | 142 base::android::ConvertJavaStringToUTF8(env, j_local_apps_directory))); |
73 g_context.Get().reset(shell_context); | 143 g_context.Get().reset(shell_context); |
74 | 144 |
75 g_java_message_loop.Get().reset(new base::MessageLoopForUI); | 145 g_java_message_loop.Get().reset(new base::MessageLoopForUI); |
76 base::MessageLoopForUI::current()->Start(); | 146 base::MessageLoopForUI::current()->Start(); |
77 | 147 |
78 // TODO(abarth): At which point should we switch to cross-platform | 148 // TODO(abarth): At which point should we switch to cross-platform |
79 // initialization? | 149 // initialization? |
80 | 150 |
(...skipping 15 matching lines...) Expand all Loading... | |
96 new base::android::JavaHandlerThread("shell_thread")); | 166 new base::android::JavaHandlerThread("shell_thread")); |
97 g_shell_thread.Get()->Start(); | 167 g_shell_thread.Get()->Start(); |
98 g_shell_thread.Get()->message_loop()->PostTask( | 168 g_shell_thread.Get()->message_loop()->PostTask( |
99 FROM_HERE, base::Bind(&RunShell, app_urls)); | 169 FROM_HERE, base::Bind(&RunShell, app_urls)); |
100 } | 170 } |
101 | 171 |
102 bool RegisterMojoMain(JNIEnv* env) { | 172 bool RegisterMojoMain(JNIEnv* env) { |
103 return RegisterNativesImpl(env); | 173 return RegisterNativesImpl(env); |
104 } | 174 } |
105 | 175 |
176 } // namespace shell | |
106 } // namespace mojo | 177 } // namespace mojo |
OLD | NEW |