| 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 | 
|  |