| Index: services/ui/launcher/launcher_app.cc
 | 
| diff --git a/services/ui/launcher/launcher_app.cc b/services/ui/launcher/launcher_app.cc
 | 
| index cc140a791ec61d4837db7078b768255ae3e58d6d..d301cc164fece10eae0d1d85fa089aeaa1f30895 100644
 | 
| --- a/services/ui/launcher/launcher_app.cc
 | 
| +++ b/services/ui/launcher/launcher_app.cc
 | 
| @@ -6,11 +6,13 @@
 | 
|  
 | 
|  #include "base/command_line.h"
 | 
|  #include "base/logging.h"
 | 
| +#include "base/strings/string_split.h"
 | 
|  #include "base/trace_event/trace_event.h"
 | 
|  #include "mojo/application/application_runner_chromium.h"
 | 
|  #include "mojo/common/tracing_impl.h"
 | 
|  #include "mojo/public/c/system/main.h"
 | 
|  #include "mojo/public/cpp/application/application_impl.h"
 | 
| +#include "mojo/public/cpp/application/connect.h"
 | 
|  #include "mojo/public/cpp/application/service_provider_impl.h"
 | 
|  
 | 
|  namespace launcher {
 | 
| @@ -31,11 +33,64 @@ void LauncherApp::Initialize(mojo::ApplicationImpl* app_impl) {
 | 
|    tracing_.Initialize(app_impl_);
 | 
|    TRACE_EVENT0("launcher", __func__);
 | 
|  
 | 
| +  InitCompositor();
 | 
| +  InitViewManager();
 | 
| +  InitViewAssociates(command_line->GetSwitchValueASCII("view_associate_urls"));
 | 
| +
 | 
|    for (size_t i = 0; i < command_line->GetArgs().size(); ++i) {
 | 
|      Launch(command_line->GetArgs()[i]);
 | 
|    }
 | 
|  }
 | 
|  
 | 
| +void LauncherApp::InitCompositor() {
 | 
| +  mojo::ConnectToService(app_impl_->shell(), "mojo:compositor_service",
 | 
| +                         GetProxy(&compositor_));
 | 
| +  compositor_.set_connection_error_handler(base::Bind(
 | 
| +      &LauncherApp::OnCompositorConnectionError, base::Unretained(this)));
 | 
| +}
 | 
| +
 | 
| +void LauncherApp::InitViewManager() {
 | 
| +  mojo::ConnectToService(app_impl_->shell(), "mojo:view_manager_service",
 | 
| +                         GetProxy(&view_manager_));
 | 
| +  view_manager_.set_connection_error_handler(base::Bind(
 | 
| +      &LauncherApp::OnViewManagerConnectionError, base::Unretained(this)));
 | 
| +}
 | 
| +
 | 
| +void LauncherApp::InitViewAssociates(
 | 
| +    const std::string& associate_urls_command_line_param) {
 | 
| +  // Build up the list of ViewAssociates we are going to start
 | 
| +  auto associate_urls =
 | 
| +      SplitString(associate_urls_command_line_param, ",", base::KEEP_WHITESPACE,
 | 
| +                  base::SPLIT_WANT_ALL);
 | 
| +
 | 
| +  // If there's nothing we got from the command line, use our own list
 | 
| +  if (associate_urls.empty()) {
 | 
| +    // TODO(jeffbrown): Replace this hardcoded list.
 | 
| +    associate_urls.push_back("mojo:input_manager_service");
 | 
| +  }
 | 
| +
 | 
| +  view_associate_owners_.reserve(associate_urls.size());
 | 
| +
 | 
| +  // Connect to ViewAssociates.
 | 
| +  for (const auto& url : associate_urls) {
 | 
| +    // Connect to the ViewAssociate.
 | 
| +    DVLOG(2) << "Connecting to ViewAssociate " << url;
 | 
| +    mojo::ui::ViewAssociatePtr view_associate;
 | 
| +    mojo::ConnectToService(app_impl_->shell(), url, GetProxy(&view_associate));
 | 
| +
 | 
| +    // Wire up the associate to the ViewManager.
 | 
| +    mojo::ui::ViewAssociateOwnerPtr view_associate_owner;
 | 
| +    view_manager_->RegisterViewAssociate(view_associate.Pass(),
 | 
| +                                         GetProxy(&view_associate_owner), url);
 | 
| +
 | 
| +    view_associate_owner.set_connection_error_handler(base::Bind(
 | 
| +        &LauncherApp::OnViewAssociateConnectionError, base::Unretained(this)));
 | 
| +
 | 
| +    view_associate_owners_.push_back(view_associate_owner.Pass());
 | 
| +  }
 | 
| +  view_manager_->FinishedRegisteringViewAssociates();
 | 
| +}
 | 
| +
 | 
|  bool LauncherApp::ConfigureIncomingConnection(
 | 
|      mojo::ServiceProviderImpl* service_provider_impl) {
 | 
|    // Only present the launcher interface to the shell.
 | 
| @@ -52,8 +107,9 @@ bool LauncherApp::ConfigureIncomingConnection(
 | 
|  void LauncherApp::Launch(const mojo::String& application_url) {
 | 
|    uint32_t next_id = next_id_++;
 | 
|    std::unique_ptr<LaunchInstance> instance(new LaunchInstance(
 | 
| -      app_impl_, application_url, base::Bind(&LauncherApp::OnLaunchTermination,
 | 
| -                                             base::Unretained(this), next_id)));
 | 
| +      app_impl_, application_url, compositor_.get(), view_manager_.get(),
 | 
| +      base::Bind(&LauncherApp::OnLaunchTermination, base::Unretained(this),
 | 
| +                 next_id)));
 | 
|    instance->Launch();
 | 
|    launch_instances_.emplace(next_id, std::move(instance));
 | 
|  }
 | 
| @@ -65,4 +121,19 @@ void LauncherApp::OnLaunchTermination(uint32_t id) {
 | 
|    }
 | 
|  }
 | 
|  
 | 
| +void LauncherApp::OnCompositorConnectionError() {
 | 
| +  LOG(ERROR) << "Exiting due to compositor connection error.";
 | 
| +  app_impl_->Terminate();
 | 
| +}
 | 
| +
 | 
| +void LauncherApp::OnViewManagerConnectionError() {
 | 
| +  LOG(ERROR) << "Exiting due to view manager connection error.";
 | 
| +  app_impl_->Terminate();
 | 
| +}
 | 
| +
 | 
| +void LauncherApp::OnViewAssociateConnectionError() {
 | 
| +  LOG(ERROR) << "Exiting due to view associate connection error.";
 | 
| +  app_impl_->Terminate();
 | 
| +};
 | 
| +
 | 
|  }  // namespace launcher
 | 
| 
 |