| // Copyright 2014 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "services/js/js_app.h" |
| |
| #include "base/bind.h" |
| #include "gin/array_buffer.h" |
| #include "gin/converter.h" |
| #include "mojo/common/data_pipe_utils.h" |
| #include "services/js/mojo_bridge_module.h" |
| |
| namespace mojo { |
| namespace js { |
| |
| 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); |
| |
| runner_delegate.AddBuiltinModule(MojoInternals::kModuleName, |
| base::Bind(MojoInternals::GetModule, this)); |
| shell_.set_client(this); |
| } |
| |
| JSApp::~JSApp() { |
| } |
| |
| void JSApp::Quit() { |
| isolate_holder_.RemoveRunMicrotasksObserver(); |
| base::MessageLoop::current()->PostTask( |
| FROM_HERE, base::Bind(&JSApp::QuitInternal, base::Unretained(this))); |
| } |
| |
| MessagePipeHandle JSApp::ConnectToApplication( |
| const std::string& application_url) { |
| MessagePipe pipe; |
| InterfaceRequest<ServiceProvider> request = |
| MakeRequest<ServiceProvider>(pipe.handle1.Pass()); |
| shell_->ConnectToApplication(application_url, request.Pass()); |
| return pipe.handle0.Pass().release(); |
| } |
| |
| MessagePipeHandle JSApp::RequestorMessagePipeHandle() { |
| return requestor_handle_.get(); |
| } |
| |
| 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())); |
| gin::Runner::Scope scope(shell_runner_.get()); |
| shell_runner_->Run(source_.c_str(), file_name_.c_str()); |
| } |
| |
| void JSApp::Initialize(Array<String> args) { |
| } |
| |
| void JSApp::QuitInternal() { |
| shell_runner_.reset(); |
| base::MessageLoop::current()->QuitWhenIdle(); |
| } |
| |
| } // namespace js |
| } // namespace mojo |