Update launcher API.

Allow caller to specify the native viewport to launch the application
on.

R=ppi@chromium.org, jeffbrown@google.com

Review URL: https://codereview.chromium.org/2003003002 .
diff --git a/services/ui/launcher/BUILD.gn b/services/ui/launcher/BUILD.gn
index 289104e..4b37039 100644
--- a/services/ui/launcher/BUILD.gn
+++ b/services/ui/launcher/BUILD.gn
@@ -50,4 +50,6 @@
   sources = [
     "launcher.mojom",
   ]
+
+  import_dirs = [ get_path_info("../../../mojo/services", "abspath") ]
 }
diff --git a/services/ui/launcher/launch_instance.cc b/services/ui/launcher/launch_instance.cc
index 9c65fcd..ce3149e 100644
--- a/services/ui/launcher/launch_instance.cc
+++ b/services/ui/launcher/launch_instance.cc
@@ -12,18 +12,19 @@
 #include "mojo/public/c/system/main.h"
 #include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/application/connect.h"
-#include "mojo/services/ui/views/interfaces/view_provider.mojom.h"
 #include "services/ui/launcher/launcher_view_tree.h"
 
 namespace launcher {
 
 LaunchInstance::LaunchInstance(mojo::ApplicationImpl* app_impl,
-                               const std::string& app_url,
+                               mojo::NativeViewportPtr viewport,
+                               mojo::ui::ViewProviderPtr view_provider,
                                mojo::gfx::composition::Compositor* compositor,
                                mojo::ui::ViewManager* view_manager,
                                const base::Closure& shutdown_callback)
     : app_impl_(app_impl),
-      app_url_(app_url),
+      viewport_(viewport.Pass()),
+      view_provider_(view_provider.Pass()),
       compositor_(compositor),
       view_manager_(view_manager),
       shutdown_callback_(shutdown_callback),
@@ -32,21 +33,15 @@
 LaunchInstance::~LaunchInstance() {}
 
 void LaunchInstance::Launch() {
-  DVLOG(1) << "Launching " << app_url_;
   TRACE_EVENT0("launcher", __func__);
 
   InitViewport();
 
-  mojo::ui::ViewProviderPtr client_view_provider;
-  mojo::ConnectToService(app_impl_->shell(), app_url_,
-                         GetProxy(&client_view_provider));
-
-  client_view_provider->CreateView(GetProxy(&client_view_owner_), nullptr);
+  view_provider_->CreateView(GetProxy(&client_view_owner_), nullptr);
+  view_provider_.reset();
 }
 
 void LaunchInstance::InitViewport() {
-  mojo::ConnectToService(app_impl_->shell(), "mojo:native_viewport_service",
-                         GetProxy(&viewport_));
   viewport_.set_connection_error_handler(base::Bind(
       &LaunchInstance::OnViewportConnectionError, base::Unretained(this)));
 
diff --git a/services/ui/launcher/launch_instance.h b/services/ui/launcher/launch_instance.h
index 6a9c71b..9e63db0 100644
--- a/services/ui/launcher/launch_instance.h
+++ b/services/ui/launcher/launch_instance.h
@@ -15,6 +15,7 @@
 #include "mojo/services/native_viewport/interfaces/native_viewport.mojom.h"
 #include "mojo/services/native_viewport/interfaces/native_viewport_event_dispatcher.mojom.h"
 #include "mojo/services/ui/views/interfaces/view_manager.mojom.h"
+#include "mojo/services/ui/views/interfaces/view_provider.mojom.h"
 
 namespace launcher {
 
@@ -23,7 +24,8 @@
 class LaunchInstance : public mojo::NativeViewportEventDispatcher {
  public:
   LaunchInstance(mojo::ApplicationImpl* app_impl,
-                 const std::string& app_url,
+                 mojo::NativeViewportPtr viewport,
+                 mojo::ui::ViewProviderPtr view_provider,
                  mojo::gfx::composition::Compositor* compositor,
                  mojo::ui::ViewManager* view_manager,
                  const base::Closure& shutdown_callback);
@@ -43,13 +45,13 @@
   void RequestUpdatedViewportMetrics();
 
   mojo::ApplicationImpl* app_impl_;
-  std::string app_url_;
+  mojo::NativeViewportPtr viewport_;
+  mojo::ui::ViewProviderPtr view_provider_;
 
   mojo::gfx::composition::Compositor* compositor_;
   mojo::ui::ViewManager* view_manager_;
   base::Closure shutdown_callback_;
 
-  mojo::NativeViewportPtr viewport_;
   mojo::Binding<NativeViewportEventDispatcher>
       viewport_event_dispatcher_binding_;
 
diff --git a/services/ui/launcher/launcher.mojom b/services/ui/launcher/launcher.mojom
index 2303732..ae25ad0 100644
--- a/services/ui/launcher/launcher.mojom
+++ b/services/ui/launcher/launcher.mojom
@@ -4,9 +4,16 @@
 
 module launcher;
 
+import "mojo/services/native_viewport/interfaces/native_viewport.mojom";
+import "mojo/services/ui/views/interfaces/view_provider.mojom";
+
 // Private interface for the shell. Allows the shell to start an ui
 // application.
 [ServiceName="launcher::Launcher"]
 interface Launcher {
   Launch(string application_url);
+  // Displays the view provided by |view_provider| in the provided |viewport|.
+  // Used by https://manganese.googlesource.com/.
+  LaunchOnViewport(mojo.NativeViewport viewport,
+                   mojo.ui.ViewProvider view_provider);
 };
diff --git a/services/ui/launcher/launcher_app.cc b/services/ui/launcher/launcher_app.cc
index c231ce6..b29f831 100644
--- a/services/ui/launcher/launcher_app.cc
+++ b/services/ui/launcher/launcher_app.cc
@@ -105,11 +105,32 @@
 }
 
 void LauncherApp::Launch(const mojo::String& application_url) {
+  DVLOG(1) << "Launching " << application_url;
+
+  mojo::NativeViewportPtr viewport;
+  mojo::ConnectToService(app_impl_->shell(), "mojo:native_viewport_service",
+                         GetProxy(&viewport));
+
+  mojo::ui::ViewProviderPtr view_provider;
+  mojo::ConnectToService(app_impl_->shell(), application_url,
+                         GetProxy(&view_provider));
+
+  LaunchInternal(viewport.Pass(), view_provider.Pass());
+}
+void LauncherApp::LaunchOnViewport(
+    mojo::InterfaceHandle<mojo::NativeViewport> viewport,
+    mojo::InterfaceHandle<mojo::ui::ViewProvider> view_provider) {
+  LaunchInternal(mojo::NativeViewportPtr::Create(viewport.Pass()),
+                 mojo::ui::ViewProviderPtr::Create(view_provider.Pass()));
+}
+
+void LauncherApp::LaunchInternal(mojo::NativeViewportPtr viewport,
+                                 mojo::ui::ViewProviderPtr view_provider) {
   uint32_t next_id = next_id_++;
   std::unique_ptr<LaunchInstance> instance(new LaunchInstance(
-      app_impl_, application_url, compositor_.get(), view_manager_.get(),
-      base::Bind(&LauncherApp::OnLaunchTermination, base::Unretained(this),
-                 next_id)));
+      app_impl_, viewport.Pass(), view_provider.Pass(), compositor_.get(),
+      view_manager_.get(), base::Bind(&LauncherApp::OnLaunchTermination,
+                                      base::Unretained(this), next_id)));
   instance->Launch();
   launch_instances_.emplace(next_id, std::move(instance));
 }
diff --git a/services/ui/launcher/launcher_app.h b/services/ui/launcher/launcher_app.h
index f04e645..e15ca4e 100644
--- a/services/ui/launcher/launcher_app.h
+++ b/services/ui/launcher/launcher_app.h
@@ -32,7 +32,12 @@
 
   // |Launcher|:
   void Launch(const mojo::String& application_url) override;
+  void LaunchOnViewport(
+      mojo::InterfaceHandle<mojo::NativeViewport> viewport,
+      mojo::InterfaceHandle<mojo::ui::ViewProvider> view_provider) override;
 
+  void LaunchInternal(mojo::NativeViewportPtr viewport,
+                      mojo::ui::ViewProviderPtr view_provider);
   void OnLaunchTermination(uint32_t id);
 
   void OnCompositorConnectionError();