Index: mojo/apps/js/js_app.cc |
diff --git a/mojo/apps/js/js_app.cc b/mojo/apps/js/js_app.cc |
index 32499d35ad4189f9a756f0b2ccffce8579af323c..91e62b6f4ab8a0c19c2f90effb564518cd34b5bf 100644 |
--- a/mojo/apps/js/js_app.cc |
+++ b/mojo/apps/js/js_app.cc |
@@ -7,107 +7,63 @@ |
#include "base/bind.h" |
#include "gin/array_buffer.h" |
#include "gin/converter.h" |
-#include "mojo/apps/js/application_delegate_impl.h" |
#include "mojo/apps/js/mojo_bridge_module.h" |
+#include "mojo/common/data_pipe_utils.h" |
namespace mojo { |
namespace apps { |
-JSApp::JSApp(ApplicationDelegateImpl* app_delegate_impl) |
- : app_delegate_impl_(app_delegate_impl), |
- thread_("Mojo JS"), |
- app_delegate_impl_task_runner_( |
- base::MessageLoop::current()->task_runner()) { |
- CHECK(on_app_delegate_impl_thread()); |
- runner_delegate_.AddBuiltinModule(MojoInternals::kModuleName, |
- base::Bind(MojoInternals::GetModule, this)); |
-} |
+JSApp::JSApp(ShellPtr shell, URLResponsePtr response) : shell_(shell.Pass()) { |
+ // TODO(hansmuller): handle load failure here and below. |
+ DCHECK(!response.is_null()); |
+ file_name_ = response->url; |
+ bool result = common::BlockingCopyToString(response->body.Pass(), &source_); |
+ DCHECK(result); |
-JSApp::~JSApp() { |
+ runner_delegate.AddBuiltinModule(MojoInternals::kModuleName, |
+ base::Bind(MojoInternals::GetModule, this)); |
+ shell_.set_client(this); |
} |
-bool JSApp::Start() { |
- CHECK(!js_app_task_runner_.get() && on_app_delegate_impl_thread()); |
- base::Thread::Options thread_options(base::MessageLoop::TYPE_IO, 0); |
- thread_.StartWithOptions(thread_options); |
- |
- // TODO(hansmuller): check thread_.StartWithOptions() return value. |
- // TODO(hansmuller): need to funnel Run() failures back to the caller. |
- |
- thread_.message_loop()->PostTask( |
- FROM_HERE, base::Bind(&JSApp::Run, base::Unretained(this))); |
- return true; |
+JSApp::~JSApp() { |
} |
void JSApp::Quit() { |
- CHECK(on_js_app_thread()); |
- |
- // The terminate operation is posted to the message_loop so that |
- // the shell_runner isn't destroyed before this JS function returns. |
- thread_.message_loop()->PostTask( |
- FROM_HERE, base::Bind(&JSApp::Terminate, base::Unretained(this))); |
+ isolate_holder_.RemoveRunMicrotasksObserver(); |
+ base::MessageLoop::current()->PostTask( |
+ FROM_HERE, base::Bind(&JSApp::QuitInternal, base::Unretained(this))); |
} |
MessagePipeHandle JSApp::ConnectToApplication( |
const std::string& application_url) { |
- CHECK(on_js_app_thread()); |
MessagePipe pipe; |
InterfaceRequest<ServiceProvider> request = |
MakeRequest<ServiceProvider>(pipe.handle1.Pass()); |
- |
- app_delegate_impl_task_runner_->PostTask( |
- FROM_HERE, |
- base::Bind(&ApplicationDelegateImpl::ConnectToApplication, |
- base::Unretained(app_delegate_impl_), |
- application_url, |
- base::Passed(request.Pass()))); |
- |
+ shell_->ConnectToApplication(application_url, request.Pass()); |
return pipe.handle0.Pass().release(); |
} |
+MessagePipeHandle JSApp::RequestorMessagePipeHandle() { |
+ return requestor_handle_.get(); |
+} |
-void JSApp::Run() { |
- CHECK(!js_app_task_runner_.get() && !on_app_delegate_impl_thread()); |
- js_app_task_runner_ = base::MessageLoop::current()->task_runner(); |
- |
- std::string source; |
- std::string file_name; |
- Load(&source, &file_name); // TODO(hansmuller): handle Load() failure. |
- |
- isolate_holder_.reset(new gin::IsolateHolder()); |
- isolate_holder_->AddRunMicrotasksObserver(); |
+void JSApp::AcceptConnection(const String& requestor_url, |
+ ServiceProviderPtr provider) { |
+ requestor_handle_ = provider.PassMessagePipe(); |
+ isolate_holder_.AddRunMicrotasksObserver(); |
shell_runner_.reset( |
- new gin::ShellRunner(&runner_delegate_, isolate_holder_->isolate())); |
- |
+ new gin::ShellRunner(&runner_delegate, isolate_holder_.isolate())); |
gin::Runner::Scope scope(shell_runner_.get()); |
- shell_runner_->Run(source.c_str(), file_name.c_str()); |
-} |
- |
-void JSApp::Terminate() { |
- isolate_holder_->RemoveRunMicrotasksObserver(); |
- shell_runner_.reset(nullptr); |
- |
- // This JSApp's thread must be stopped on the thread that started it. Ask the |
- // app_delegate_impl_ to erase its AppVector entry for this app, which |
- // implicitly destroys this JSApp and stops its thread. |
- app_delegate_impl_task_runner_->PostTask( |
- FROM_HERE, |
- base::Bind(&ApplicationDelegateImpl::QuitJSApp, |
- base::Unretained(app_delegate_impl_), |
- base::Unretained(this))); |
+ shell_runner_->Run(source_.c_str(), file_name_.c_str()); |
} |
-bool JSApp::on_app_delegate_impl_thread() const { |
- return app_delegate_impl_task_runner_.get() && |
- app_delegate_impl_task_runner_.get() == |
- base::MessageLoop::current()->task_runner().get(); |
+void JSApp::Initialize(Array<String> args) { |
} |
-bool JSApp::on_js_app_thread() const { |
- return js_app_task_runner_.get() && |
- js_app_task_runner_.get() == |
- base::MessageLoop::current()->task_runner().get(); |
+void JSApp::QuitInternal() { |
+ shell_runner_.reset(); |
+ base::MessageLoop::current()->QuitWhenIdle(); |
} |
} // namespace apps |