Index: content/common/mojo/mojo_shell_connection_impl.cc |
diff --git a/content/common/mojo/mojo_shell_connection_impl.cc b/content/common/mojo/mojo_shell_connection_impl.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..5125df35de953d4f6e615a3569d5035e4ca5ca6a |
--- /dev/null |
+++ b/content/common/mojo/mojo_shell_connection_impl.cc |
@@ -0,0 +1,95 @@ |
+// Copyright 2015 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 "content/common/mojo/mojo_shell_connection_impl.h" |
+ |
+#include "base/command_line.h" |
+#include "base/lazy_instance.h" |
+#include "base/threading/thread_local.h" |
+#include "mojo/application/public/cpp/application_delegate.h" |
+#include "mojo/application/public/cpp/application_impl.h" |
+#include "mojo/converters/network/network_type_converters.h" |
+#include "mojo/runner/child/runner_connection.h" |
+ |
+namespace content { |
+namespace { |
+using MojoShellConnectionPtr = |
+ base::ThreadLocalPointer<MojoShellConnectionImpl>; |
+ |
+// Env is thread local so that aura may be used on multiple threads. |
+base::LazyInstance<MojoShellConnectionPtr>::Leaky lazy_tls_ptr = |
+ LAZY_INSTANCE_INITIALIZER; |
+ |
+} // namespace |
+ |
+bool IsRunningInMojoShell() { |
+ return base::CommandLine::ForCurrentProcess()->HasSwitch( |
+ "mojo-platform-channel-handle"); |
+} |
+ |
+// static |
+void MojoShellConnectionImpl::Create() { |
+ DCHECK(IsRunningInMojoShell()); |
+ DCHECK(!lazy_tls_ptr.Pointer()->Get()); |
+ MojoShellConnectionImpl* connection = new MojoShellConnectionImpl; |
+ lazy_tls_ptr.Pointer()->Set(connection); |
+ connection->WaitForShell(); |
+} |
+ |
+MojoShellConnectionImpl::MojoShellConnectionImpl() : initialized_(false) {} |
+MojoShellConnectionImpl::~MojoShellConnectionImpl() {} |
+ |
+void MojoShellConnectionImpl::WaitForShell() { |
+ mojo::InterfaceRequest<mojo::Application> application_request; |
+ runner_connection_.reset( |
+ mojo::runner::RunnerConnection::ConnectToRunner(&application_request)); |
+ application_impl_.reset(new mojo::ApplicationImpl( |
+ this, application_request.Pass())); |
+ application_impl_->WaitForInitialize(); |
+} |
+ |
+void MojoShellConnectionImpl::Initialize(mojo::ApplicationImpl* application) { |
+ initialized_ = true; |
+} |
+ |
+bool MojoShellConnectionImpl::ConfigureIncomingConnection( |
+ mojo::ApplicationConnection* connection) { |
+ bool found = false; |
+ for (auto listener : listeners_) |
+ found |= listener->ConfigureIncomingConnection(connection); |
+ return found; |
+} |
+ |
+mojo::ApplicationImpl* MojoShellConnectionImpl::GetApplication() { |
+ DCHECK(initialized_); |
+ return application_impl_.get(); |
+} |
+ |
+void MojoShellConnectionImpl::AddListener(Listener* listener) { |
+ DCHECK(std::find(listeners_.begin(), listeners_.end(), listener) == |
+ listeners_.end()); |
+ listeners_.push_back(listener); |
+} |
+ |
+void MojoShellConnectionImpl::RemoveListener(Listener* listener) { |
+ auto it = std::find(listeners_.begin(), listeners_.end(), listener); |
+ DCHECK(it != listeners_.end()); |
+ listeners_.erase(it); |
+} |
+ |
+// static |
+MojoShellConnection* MojoShellConnection::Get() { |
+ return lazy_tls_ptr.Pointer()->Get(); |
+} |
+ |
+// static |
+void MojoShellConnection::Destroy() { |
+ // This joins the shell controller thread. |
+ delete Get(); |
+ lazy_tls_ptr.Pointer()->Set(nullptr); |
+} |
+ |
+MojoShellConnection::~MojoShellConnection() {} |
+ |
+} // namespace content |