Yet more ApplicationDelegate -> ApplicationImplBase conversion.

Almost there.

R=vardhan@google.com

Review URL: https://codereview.chromium.org/2015363003 .
diff --git a/apps/benchmark/benchmark_app.cc b/apps/benchmark/benchmark_app.cc
index 3e2ea0b..87b5ec3 100644
--- a/apps/benchmark/benchmark_app.cc
+++ b/apps/benchmark/benchmark_app.cc
@@ -19,11 +19,11 @@
 #include "base/strings/string_util.h"
 #include "base/time/time.h"
 #include "base/trace_event/trace_event.h"
-#include "mojo/application/application_runner_chromium.h"
+#include "mojo/environment/scoped_chromium_init.h"
 #include "mojo/public/c/system/main.h"
-#include "mojo/public/cpp/application/application_delegate.h"
-#include "mojo/public/cpp/application/application_impl.h"
+#include "mojo/public/cpp/application/application_impl_base.h"
 #include "mojo/public/cpp/application/connect.h"
+#include "mojo/public/cpp/application/run_application.h"
 #include "mojo/public/cpp/bindings/interface_handle.h"
 #include "mojo/public/interfaces/application/service_provider.mojom.h"
 #include "mojo/services/tracing/interfaces/tracing.mojom.h"
@@ -31,18 +31,18 @@
 namespace benchmark {
 namespace {
 
-class BenchmarkApp : public mojo::ApplicationDelegate,
+class BenchmarkApp : public mojo::ApplicationImplBase,
                      public TraceCollectorClient::Receiver {
  public:
   BenchmarkApp() {}
   ~BenchmarkApp() override {}
 
-  // mojo:ApplicationDelegate:
-  void Initialize(mojo::ApplicationImpl* app) override {
+  // mojo:ApplicationImplBase:
+  void OnInitialize() override {
     // Parse command-line arguments.
-    if (!GetRunArgs(app->args(), &args_)) {
+    if (!GetRunArgs(args(), &args_)) {
       LOG(ERROR) << "Failed to parse the input arguments.";
-      mojo::ApplicationImpl::Terminate();
+      mojo::TerminateApplication(MOJO_RESULT_INVALID_ARGUMENT);
       return;
     }
 
@@ -57,8 +57,7 @@
     // Connect to trace collector, which will fetch the trace events produced by
     // the app being benchmarked.
     tracing::TraceCollectorPtr trace_collector;
-    mojo::ConnectToService(app->shell(), "mojo:tracing",
-                           GetProxy(&trace_collector));
+    mojo::ConnectToService(shell(), "mojo:tracing", GetProxy(&trace_collector));
     trace_collector_client_.reset(
         new TraceCollectorClient(this, trace_collector.Pass()));
     trace_collector_client_->Start(categories_str);
@@ -66,7 +65,7 @@
     // Start tracing the application with 1 sec of delay.
     base::MessageLoop::current()->PostDelayedTask(
         FROM_HERE, base::Bind(&BenchmarkApp::StartTracedApplication,
-                              base::Unretained(this), app),
+                              base::Unretained(this)),
         base::TimeDelta::FromSeconds(1));
   }
 
@@ -85,12 +84,12 @@
     return base::JoinString(unique_categories, ",");
   }
 
-  void StartTracedApplication(mojo::ApplicationImpl* app) {
+  void StartTracedApplication() {
     // Record the time origin for measurements just before connecting to the app
     // being benchmarked.
     time_origin_ = base::TimeTicks::FromInternalValue(MojoGetTimeTicksNow());
-    app->shell()->ConnectToApplication(
-        args_.app, GetProxy(&traced_app_connection_), nullptr);
+    shell()->ConnectToApplication(args_.app, GetProxy(&traced_app_connection_),
+                                  nullptr);
 
     // Post task to stop tracing when the time is up.
     base::MessageLoop::current()->PostDelayedTask(
@@ -122,7 +121,7 @@
     std::vector<Event> events;
     if (!GetEvents(trace_data, &events)) {
       LOG(ERROR) << "Failed to parse the trace data";
-      mojo::ApplicationImpl::Terminate();
+      mojo::TerminateApplication(MOJO_RESULT_UNKNOWN);
       return;
     }
 
@@ -147,7 +146,7 @@
     } else {
       printf("some measurements failed\n");
     }
-    mojo::ApplicationImpl::Terminate();
+    mojo::TerminateApplication(MOJO_RESULT_OK);
   }
 
  private:
@@ -162,8 +161,9 @@
 }  // namespace benchmark
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(new benchmark::BenchmarkApp);
-  auto ret = runner.Run(application_request);
+  mojo::ScopedChromiumInit init;
+  benchmark::BenchmarkApp benchmark_app;
+  auto ret = mojo::RunApplication(application_request, &benchmark_app);
   fflush(nullptr);
   return ret;
 }
diff --git a/examples/echo/echo_benchmark.cc b/examples/echo/echo_benchmark.cc
index 30e8044..3d4f27d 100644
--- a/examples/echo/echo_benchmark.cc
+++ b/examples/echo/echo_benchmark.cc
@@ -8,12 +8,12 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/trace_event/trace_event.h"
 #include "examples/echo/echo.mojom.h"
-#include "mojo/application/application_runner_chromium.h"
 #include "mojo/common/tracing_impl.h"
+#include "mojo/environment/scoped_chromium_init.h"
 #include "mojo/public/c/system/main.h"
-#include "mojo/public/cpp/application/application_delegate.h"
-#include "mojo/public/cpp/application/application_impl.h"
+#include "mojo/public/cpp/application/application_impl_base.h"
 #include "mojo/public/cpp/application/connect.h"
+#include "mojo/public/cpp/application/run_application.h"
 #include "mojo/public/cpp/utility/run_loop.h"
 
 namespace mojo {
@@ -24,24 +24,24 @@
 
 static const base::TimeDelta kDelayTime = base::TimeDelta::FromMicroseconds(50);
 
-class EchoClientDelegate;
+class EchoClientApp;
 
 class EchoResponse {
  public:
-  EchoResponse(EchoClientDelegate* echo, int idx, bool traced)
-      : echoDelegate_(echo), idx_(idx), traced_(traced) {}
+  EchoResponse(EchoClientApp* echo, int idx, bool traced)
+      : echo_client_app_(echo), idx_(idx), traced_(traced) {}
 
   void Run(const String& value) const;
 
  private:
-  EchoClientDelegate* echoDelegate_;
+  EchoClientApp* echo_client_app_;
   int idx_;
   bool traced_;
 };
 
-class EchoClientDelegate : public ApplicationDelegate {
+class EchoClientApp : public ApplicationImplBase {
  public:
-  EchoClientDelegate()
+  EchoClientApp()
       : warmup_(true),
         num_clients_(1),
         num_active_clients_(1),
@@ -49,25 +49,24 @@
         ending_(false),
         benchmark_duration_(base::TimeDelta::FromSeconds(10)) {}
 
-  void Initialize(ApplicationImpl* app) override {
-    tracing_.Initialize(app->shell(), &app->args());
+  void OnInitialize() override {
+    tracing_.Initialize(shell(), &args());
 
-    ParseArguments(app);
+    ParseArguments();
 
     for (int i = 0; i < num_clients_; i++) {
       EchoPtr echo;
       if (use_dart_server_) {
-        ConnectToService(app->shell(), "mojo:dart_echo_server",
-                         GetProxy(&echo));
+        ConnectToService(shell(), "mojo:dart_echo_server", GetProxy(&echo));
       } else {
-        ConnectToService(app->shell(), "mojo:echo_server", GetProxy(&echo));
+        ConnectToService(shell(), "mojo:echo_server", GetProxy(&echo));
       }
       echoClients_.push_back(echo.Pass());
     }
     BeginEcho(0);
     base::MessageLoop::current()->PostDelayedTask(
         FROM_HERE,
-        base::Bind(&EchoClientDelegate::EndWarmup, base::Unretained(this)),
+        base::Bind(&EchoClientApp::EndWarmup, base::Unretained(this)),
         kWarmupTime);
   }
 
@@ -77,12 +76,10 @@
       idx = 0;
     }
     base::MessageLoop::current()->PostDelayedTask(
-        FROM_HERE,
-        base::Bind(&EchoClientDelegate::Run, base::Unretained(this), idx),
+        FROM_HERE, base::Bind(&EchoClientApp::Run, base::Unretained(this), idx),
         kDelayTime);
     base::MessageLoop::current()->PostDelayedTask(
-        FROM_HERE,
-        base::Bind(&EchoClientDelegate::EndRun, base::Unretained(this)),
+        FROM_HERE, base::Bind(&EchoClientApp::EndRun, base::Unretained(this)),
         benchmark_duration_);
   }
 
@@ -129,10 +126,10 @@
     return false;
   }
 
-  void ParseArguments(ApplicationImpl* app) {
+  void ParseArguments() {
     int benchmark_duration_seconds = 0;
-    for (size_t i = 0; i < app->args().size(); i++) {
-      const std::string& argument = app->args()[i];
+    for (size_t i = 0; i < args().size(); i++) {
+      const std::string& argument = args()[i];
       if (GetBoolArgument(argument, "--dart-server", &use_dart_server_)) {
         continue;
       }
@@ -167,15 +164,15 @@
 };
 
 void EchoResponse::Run(const String& value) const {
-  echoDelegate_->EndEcho(idx_, traced_);
-  echoDelegate_->BeginEcho(idx_ + 1);
+  echo_client_app_->EndEcho(idx_, traced_);
+  echo_client_app_->BeginEcho(idx_ + 1);
 }
 
 }  // namespace examples
 }  // namespace mojo
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(
-      new mojo::examples::EchoClientDelegate);
-  return runner.Run(application_request);
+  mojo::ScopedChromiumInit init;
+  mojo::examples::EchoClientApp echo_client_app;
+  return mojo::RunApplication(application_request, &echo_client_app);
 }
diff --git a/examples/forwarding_content_handler/forwarding_content_handler.cc b/examples/forwarding_content_handler/forwarding_content_handler.cc
index cfc284a..e6d3531 100644
--- a/examples/forwarding_content_handler/forwarding_content_handler.cc
+++ b/examples/forwarding_content_handler/forwarding_content_handler.cc
@@ -6,11 +6,12 @@
 
 #include "base/macros.h"
 #include "base/memory/scoped_ptr.h"
-#include "mojo/application/application_runner_chromium.h"
 #include "mojo/application/content_handler_factory.h"
 #include "mojo/data_pipe_utils/data_pipe_utils.h"
+#include "mojo/environment/scoped_chromium_init.h"
 #include "mojo/public/c/system/main.h"
-#include "mojo/public/cpp/application/application_delegate.h"
+#include "mojo/public/cpp/application/application_impl_base.h"
+#include "mojo/public/cpp/application/run_application.h"
 #include "mojo/public/cpp/application/service_provider_impl.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/public/cpp/utility/run_loop.h"
@@ -51,15 +52,14 @@
   ShellPtr shell_;
 };
 
-class ForwardingContentHandler : public ApplicationDelegate,
+class ForwardingContentHandler : public ApplicationImplBase,
                                  public ContentHandlerFactory::ManagedDelegate {
  public:
   ForwardingContentHandler() {}
 
  private:
-  // Overridden from ApplicationDelegate:
-  bool ConfigureIncomingConnection(
-      ServiceProviderImpl* service_provider_impl) override {
+  // Overridden from ApplicationImplBase:
+  bool OnAcceptConnection(ServiceProviderImpl* service_provider_impl) override {
     service_provider_impl->AddService<ContentHandler>(
         ContentHandlerFactory::GetInterfaceRequestHandler(this));
     return true;
@@ -87,7 +87,7 @@
 }  // namespace mojo
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(
-      new mojo::examples::ForwardingContentHandler());
-  return runner.Run(application_request);
+  mojo::ScopedChromiumInit init;
+  mojo::examples::ForwardingContentHandler forwarding_content_handler;
+  return mojo::RunApplication(application_request, &forwarding_content_handler);
 }
diff --git a/examples/trace_me/trace_me_app.cc b/examples/trace_me/trace_me_app.cc
index 81887cf..6ab1913 100644
--- a/examples/trace_me/trace_me_app.cc
+++ b/examples/trace_me/trace_me_app.cc
@@ -8,11 +8,11 @@
 #include "base/threading/thread.h"
 #include "base/time/time.h"
 #include "base/trace_event/trace_event.h"
-#include "mojo/application/application_runner_chromium.h"
 #include "mojo/common/tracing_impl.h"
+#include "mojo/environment/scoped_chromium_init.h"
 #include "mojo/public/c/system/main.h"
-#include "mojo/public/cpp/application/application_delegate.h"
-#include "mojo/public/cpp/application/application_impl.h"
+#include "mojo/public/cpp/application/application_impl_base.h"
+#include "mojo/public/cpp/application/run_application.h"
 #include "mojo/public/cpp/application/service_provider_impl.h"
 
 // This is an example app that uses implementation of tracing from mojo/common
@@ -44,16 +44,16 @@
                                                 kDoWorkDelay);
 }
 
-class TraceMeApp : public mojo::ApplicationDelegate {
+class TraceMeApp : public mojo::ApplicationImplBase {
  public:
   TraceMeApp() {}
   ~TraceMeApp() override {}
 
-  // mojo:ApplicationDelegate:
-  void Initialize(mojo::ApplicationImpl* app) override {
+  // mojo:ApplicationImplBase:
+  void OnInitialize() override {
     // Allow TracingImpl to connect to the central tracing service, advertising
     // its ability to provide trace events.
-    tracing_.Initialize(app->shell(), &app->args());
+    tracing_.Initialize(shell(), &args());
 
     TRACE_EVENT0("trace_me", "initialized");
 
@@ -61,8 +61,8 @@
         FROM_HERE, base::Bind(&DoWork), kDoWorkDelay);
   }
 
-  // mojo:ApplicationDelegate:
-  bool ConfigureIncomingConnection(
+  // mojo:ApplicationImplBase:
+  bool OnAcceptConnection(
       mojo::ServiceProviderImpl* service_provider_impl) override {
     TRACE_EVENT0("trace_me", "connected");
     return true;
@@ -76,6 +76,7 @@
 }  // namespace examples
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(new examples::TraceMeApp);
-  return runner.Run(application_request);
+  mojo::ScopedChromiumInit init;
+  examples::TraceMeApp trace_me_app;
+  return mojo::RunApplication(application_request, &trace_me_app);
 }
diff --git a/mojo/application/run_application.cc b/mojo/application/run_application.cc
index ea067d4..9f84b9e 100644
--- a/mojo/application/run_application.cc
+++ b/mojo/application/run_application.cc
@@ -10,6 +10,7 @@
 #include "base/command_line.h"
 #include "base/debug/stack_trace.h"
 #include "base/lazy_instance.h"
+#include "base/logging.h"
 #include "base/message_loop/message_loop.h"
 #include "base/threading/thread_local.h"
 #include "build/build_config.h"
@@ -73,7 +74,15 @@
 }
 
 void TerminateApplication(MojoResult result) {
-  DCHECK(base::MessageLoop::current()->is_running());
+  // TODO(vtl): Rather than asserting |...->is_running()|, just assert that we
+  // have one, since we may be called during message loop teardown. (The
+  // HandleWatcher is notified of the message loop's pending destruction, and
+  // triggers connection errors.) I should think about this some more.
+  DCHECK(base::MessageLoop::current());
+  if (!base::MessageLoop::current()->is_running()) {
+    DLOG(WARNING) << "TerminateApplication() with message loop not running";
+    return;
+  }
   base::MessageLoop::current()->Quit();
 
   ResultHolder* result_holder = g_current_result_holder.Pointer()->Get();
diff --git a/services/debugger/debugger.cc b/services/debugger/debugger.cc
index e642f1a..689e0c2 100644
--- a/services/debugger/debugger.cc
+++ b/services/debugger/debugger.cc
@@ -8,12 +8,12 @@
 #include "base/debug/profiler.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
-#include "mojo/application/application_runner_chromium.h"
 #include "mojo/data_pipe_utils/data_pipe_utils.h"
+#include "mojo/environment/scoped_chromium_init.h"
 #include "mojo/public/c/system/main.h"
-#include "mojo/public/cpp/application/application_delegate.h"
-#include "mojo/public/cpp/application/application_impl.h"
+#include "mojo/public/cpp/application/application_impl_base.h"
 #include "mojo/public/cpp/application/connect.h"
+#include "mojo/public/cpp/application/run_application.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/services/http_server/cpp/http_server_util.h"
 #include "mojo/services/http_server/interfaces/http_server.mojom.h"
@@ -29,26 +29,24 @@
 
 namespace debugger {
 
-class Debugger : public mojo::ApplicationDelegate,
+class Debugger : public mojo::ApplicationImplBase,
                  public http_server::HttpHandler {
  public:
-  Debugger() : is_tracing_(false), app_(nullptr), handler_binding_(this) {}
+  Debugger() : is_tracing_(false), handler_binding_(this) {}
   ~Debugger() override {}
 
  private:
-  // mojo::ApplicationDelegate:
-  void Initialize(mojo::ApplicationImpl* app) override {
-    app_ = app;
-
+  // mojo::ApplicationImplBase:
+  void OnInitialize() override {
     // Format: --args-for="app_url command_port"
-    if (app->args().size() < 2) {
+    if (args().size() < 2) {
       LOG(ERROR) << "--args-for required to specify command_port";
-      mojo::ApplicationImpl::Terminate();
+      mojo::TerminateApplication(MOJO_RESULT_INVALID_ARGUMENT);
       return;
     }
-    base::StringToUint(app->args()[1], &command_port_);
+    base::StringToUint(args()[1], &command_port_);
     http_server::HttpServerFactoryPtr http_server_factory;
-    mojo::ConnectToService(app->shell(), "mojo:http_server",
+    mojo::ConnectToService(shell(), "mojo:http_server",
                            GetProxy(&http_server_factory));
 
     mojo::NetAddressPtr local_address(mojo::NetAddress::New());
@@ -118,8 +116,7 @@
     }
 
     if (!tracing_) {
-      mojo::ConnectToService(app_->shell(), "mojo:tracing",
-                             GetProxy(&tracing_));
+      mojo::ConnectToService(shell(), "mojo:tracing", GetProxy(&tracing_));
     }
     is_tracing_ = true;
     mojo::DataPipe pipe;
@@ -146,7 +143,6 @@
   }
 
   bool is_tracing_;
-  mojo::ApplicationImpl* app_;
   tracing::TraceCollectorPtr tracing_;
   uint32_t command_port_;
 
@@ -161,7 +157,7 @@
 }  // namespace debugger
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(new debugger::Debugger);
-  runner.set_message_loop_type(base::MessageLoop::TYPE_IO);
-  return runner.Run(application_request);
+  mojo::ScopedChromiumInit init;
+  debugger::Debugger debugger_app;
+  return mojo::RunApplication(application_request, &debugger_app);
 }
diff --git a/services/gfx/compositor/compositor_app.cc b/services/gfx/compositor/compositor_app.cc
index bd05c8a..7f52199 100644
--- a/services/gfx/compositor/compositor_app.cc
+++ b/services/gfx/compositor/compositor_app.cc
@@ -16,25 +16,23 @@
 
 namespace compositor {
 
-CompositorApp::CompositorApp() : app_impl_(nullptr) {}
+CompositorApp::CompositorApp() {}
 
 CompositorApp::~CompositorApp() {}
 
-void CompositorApp::Initialize(mojo::ApplicationImpl* app_impl) {
-  app_impl_ = app_impl;
-
+void CompositorApp::OnInitialize() {
   auto command_line = base::CommandLine::ForCurrentProcess();
-  command_line->InitFromArgv(app_impl_->args());
+  command_line->InitFromArgv(args());
   logging::LoggingSettings settings;
   settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG;
   logging::InitLogging(settings);
 
-  tracing_.Initialize(app_impl_->shell(), &app_impl_->args());
+  tracing_.Initialize(shell(), &args());
 
   engine_.reset(new CompositorEngine());
 }
 
-bool CompositorApp::ConfigureIncomingConnection(
+bool CompositorApp::OnAcceptConnection(
     mojo::ServiceProviderImpl* service_provider_impl) {
   service_provider_impl->AddService<mojo::gfx::composition::Compositor>(
       [this](const mojo::ConnectionContext& connection_context,
diff --git a/services/gfx/compositor/compositor_app.h b/services/gfx/compositor/compositor_app.h
index ceb0428..892ba2e 100644
--- a/services/gfx/compositor/compositor_app.h
+++ b/services/gfx/compositor/compositor_app.h
@@ -8,28 +8,26 @@
 #include <memory>
 
 #include "base/macros.h"
-#include "base/memory/scoped_ptr.h"
 #include "mojo/common/strong_binding_set.h"
 #include "mojo/common/tracing_impl.h"
-#include "mojo/public/cpp/application/application_delegate.h"
+#include "mojo/public/cpp/application/application_impl_base.h"
 #include "mojo/services/gfx/composition/interfaces/compositor.mojom.h"
 #include "services/gfx/compositor/compositor_engine.h"
 
 namespace compositor {
 
 // Compositor application entry point.
-class CompositorApp : public mojo::ApplicationDelegate {
+class CompositorApp : public mojo::ApplicationImplBase {
  public:
   CompositorApp();
   ~CompositorApp() override;
 
  private:
-  // |ApplicationDelegate|:
-  void Initialize(mojo::ApplicationImpl* app_impl) override;
-  bool ConfigureIncomingConnection(
+  // |ApplicationImplBase|:
+  void OnInitialize() override;
+  bool OnAcceptConnection(
       mojo::ServiceProviderImpl* service_provider_impl) override;
 
-  mojo::ApplicationImpl* app_impl_;
   mojo::TracingImpl tracing_;
 
   mojo::StrongBindingSet<mojo::gfx::composition::Compositor>
diff --git a/services/gfx/compositor/main.cc b/services/gfx/compositor/main.cc
index e03e9ca..f3d9354 100644
--- a/services/gfx/compositor/main.cc
+++ b/services/gfx/compositor/main.cc
@@ -2,11 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/application/application_runner_chromium.h"
+#include "mojo/environment/scoped_chromium_init.h"
 #include "mojo/public/c/system/main.h"
+#include "mojo/public/cpp/application/run_application.h"
 #include "services/gfx/compositor/compositor_app.h"
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(new compositor::CompositorApp);
-  return runner.Run(application_request);
+  mojo::ScopedChromiumInit init;
+  compositor::CompositorApp compositor_app;
+  return mojo::RunApplication(application_request, &compositor_app);
 }
diff --git a/services/http_server/http_server_app.cc b/services/http_server/http_server_app.cc
index c6d6b3c..780dd9c 100644
--- a/services/http_server/http_server_app.cc
+++ b/services/http_server/http_server_app.cc
@@ -20,7 +20,7 @@
   ~HttpServerApp() override {}
 
  private:
-  // ApplicationDelegate:
+  // ApplicationImplBase:
   bool OnAcceptConnection(
       mojo::ServiceProviderImpl* service_provider_impl) override {
     service_provider_impl->AddService<HttpServerFactory>([this](
diff --git a/services/ui/input_manager/input_manager_app.cc b/services/ui/input_manager/input_manager_app.cc
index d75969c..62d8ab7 100644
--- a/services/ui/input_manager/input_manager_app.cc
+++ b/services/ui/input_manager/input_manager_app.cc
@@ -7,32 +7,27 @@
 #include "base/command_line.h"
 #include "base/logging.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/service_provider_impl.h"
 #include "services/ui/input_manager/input_associate.h"
 
 namespace input_manager {
 
-InputManagerApp::InputManagerApp() : app_impl_(nullptr) {}
+InputManagerApp::InputManagerApp() {}
 
 InputManagerApp::~InputManagerApp() {}
 
-void InputManagerApp::Initialize(mojo::ApplicationImpl* app_impl) {
-  app_impl_ = app_impl;
-
+void InputManagerApp::OnInitialize() {
   auto command_line = base::CommandLine::ForCurrentProcess();
-  command_line->InitFromArgv(app_impl_->args());
+  command_line->InitFromArgv(args());
   logging::LoggingSettings settings;
   settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG;
   logging::InitLogging(settings);
 
-  tracing_.Initialize(app_impl->shell(), &app_impl->args());
+  tracing_.Initialize(shell(), &args());
 }
 
-bool InputManagerApp::ConfigureIncomingConnection(
+bool InputManagerApp::OnAcceptConnection(
     mojo::ServiceProviderImpl* service_provider_impl) {
   service_provider_impl->AddService<mojo::ui::ViewAssociate>([this](
       const mojo::ConnectionContext& connection_context,
diff --git a/services/ui/input_manager/input_manager_app.h b/services/ui/input_manager/input_manager_app.h
index d0c13ac..36eb65e 100644
--- a/services/ui/input_manager/input_manager_app.h
+++ b/services/ui/input_manager/input_manager_app.h
@@ -5,29 +5,26 @@
 #ifndef SERVICES_UI_INPUT_MANAGER_INPUT_MANAGER_APP_H_
 #define SERVICES_UI_INPUT_MANAGER_INPUT_MANAGER_APP_H_
 
-#include <memory>
-
 #include "base/macros.h"
 #include "mojo/common/strong_binding_set.h"
 #include "mojo/common/tracing_impl.h"
-#include "mojo/public/cpp/application/application_delegate.h"
+#include "mojo/public/cpp/application/application_impl_base.h"
 #include "mojo/services/ui/views/interfaces/view_associates.mojom.h"
 
 namespace input_manager {
 
 // Input manager application entry point.
-class InputManagerApp : public mojo::ApplicationDelegate {
+class InputManagerApp : public mojo::ApplicationImplBase {
  public:
   InputManagerApp();
   ~InputManagerApp() override;
 
  private:
-  // |ApplicationDelegate|:
-  void Initialize(mojo::ApplicationImpl* app_impl) override;
-  bool ConfigureIncomingConnection(
+  // |ApplicationImplBase|:
+  void OnInitialize() override;
+  bool OnAcceptConnection(
       mojo::ServiceProviderImpl* service_provider_impl) override;
 
-  mojo::ApplicationImpl* app_impl_;
   mojo::TracingImpl tracing_;
 
   mojo::StrongBindingSet<mojo::ui::ViewAssociate> input_associates_;
diff --git a/services/ui/input_manager/main.cc b/services/ui/input_manager/main.cc
index 286f898..ed3768a 100644
--- a/services/ui/input_manager/main.cc
+++ b/services/ui/input_manager/main.cc
@@ -2,11 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/application/application_runner_chromium.h"
+#include "mojo/environment/scoped_chromium_init.h"
 #include "mojo/public/c/system/main.h"
+#include "mojo/public/cpp/application/run_application.h"
 #include "services/ui/input_manager/input_manager_app.h"
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(new input_manager::InputManagerApp);
-  return runner.Run(application_request);
+  mojo::ScopedChromiumInit init;
+  input_manager::InputManagerApp input_manager_app;
+  return mojo::RunApplication(application_request, &input_manager_app);
 }
diff --git a/services/ui/launcher/launch_instance.cc b/services/ui/launcher/launch_instance.cc
index ce3149e..6a95fdc 100644
--- a/services/ui/launcher/launch_instance.cc
+++ b/services/ui/launcher/launch_instance.cc
@@ -5,25 +5,18 @@
 #include "services/ui/launcher/launch_instance.h"
 
 #include "base/bind.h"
-#include "base/command_line.h"
 #include "base/logging.h"
 #include "base/trace_event/trace_event.h"
-#include "mojo/application/application_runner_chromium.h"
-#include "mojo/public/c/system/main.h"
-#include "mojo/public/cpp/application/application_impl.h"
-#include "mojo/public/cpp/application/connect.h"
 #include "services/ui/launcher/launcher_view_tree.h"
 
 namespace launcher {
 
-LaunchInstance::LaunchInstance(mojo::ApplicationImpl* app_impl,
-                               mojo::NativeViewportPtr viewport,
+LaunchInstance::LaunchInstance(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),
-      viewport_(viewport.Pass()),
+    : viewport_(viewport.Pass()),
       view_provider_(view_provider.Pass()),
       compositor_(compositor),
       view_manager_(view_manager),
diff --git a/services/ui/launcher/launch_instance.h b/services/ui/launcher/launch_instance.h
index 9e63db0..7f94617 100644
--- a/services/ui/launcher/launch_instance.h
+++ b/services/ui/launcher/launch_instance.h
@@ -8,8 +8,6 @@
 #include <memory>
 
 #include "base/callback.h"
-#include "mojo/public/cpp/application/application_delegate.h"
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/services/gfx/composition/interfaces/compositor.mojom.h"
 #include "mojo/services/native_viewport/interfaces/native_viewport.mojom.h"
@@ -23,8 +21,7 @@
 
 class LaunchInstance : public mojo::NativeViewportEventDispatcher {
  public:
-  LaunchInstance(mojo::ApplicationImpl* app_impl,
-                 mojo::NativeViewportPtr viewport,
+  LaunchInstance(mojo::NativeViewportPtr viewport,
                  mojo::ui::ViewProviderPtr view_provider,
                  mojo::gfx::composition::Compositor* compositor,
                  mojo::ui::ViewManager* view_manager,
@@ -44,12 +41,11 @@
   void OnViewportMetricsChanged(mojo::ViewportMetricsPtr metrics);
   void RequestUpdatedViewportMetrics();
 
-  mojo::ApplicationImpl* app_impl_;
   mojo::NativeViewportPtr viewport_;
   mojo::ui::ViewProviderPtr view_provider_;
 
-  mojo::gfx::composition::Compositor* compositor_;
-  mojo::ui::ViewManager* view_manager_;
+  mojo::gfx::composition::Compositor* const compositor_;
+  mojo::ui::ViewManager* const view_manager_;
   base::Closure shutdown_callback_;
 
   mojo::Binding<NativeViewportEventDispatcher>
diff --git a/services/ui/launcher/launcher_app.cc b/services/ui/launcher/launcher_app.cc
index b29f831..0359d95 100644
--- a/services/ui/launcher/launcher_app.cc
+++ b/services/ui/launcher/launcher_app.cc
@@ -8,29 +8,25 @@
 #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/run_application.h"
 #include "mojo/public/cpp/application/service_provider_impl.h"
 
 namespace launcher {
 
-LauncherApp::LauncherApp() : app_impl_(nullptr), next_id_(0u) {}
+LauncherApp::LauncherApp() : next_id_(0u) {}
 
 LauncherApp::~LauncherApp() {}
 
-void LauncherApp::Initialize(mojo::ApplicationImpl* app_impl) {
-  app_impl_ = app_impl;
-
+void LauncherApp::OnInitialize() {
   auto command_line = base::CommandLine::ForCurrentProcess();
-  command_line->InitFromArgv(app_impl_->args());
+  command_line->InitFromArgv(args());
   logging::LoggingSettings settings;
   settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG;
   logging::InitLogging(settings);
 
-  tracing_.Initialize(app_impl_->shell(), &app_impl_->args());
+  tracing_.Initialize(shell(), &args());
   TRACE_EVENT0("launcher", __func__);
 
   InitCompositor();
@@ -43,14 +39,14 @@
 }
 
 void LauncherApp::InitCompositor() {
-  mojo::ConnectToService(app_impl_->shell(), "mojo:compositor_service",
+  mojo::ConnectToService(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",
+  mojo::ConnectToService(shell(), "mojo:view_manager_service",
                          GetProxy(&view_manager_));
   view_manager_.set_connection_error_handler(base::Bind(
       &LauncherApp::OnViewManagerConnectionError, base::Unretained(this)));
@@ -76,7 +72,7 @@
     // Connect to the ViewAssociate.
     DVLOG(2) << "Connecting to ViewAssociate " << url;
     mojo::ui::ViewAssociatePtr view_associate;
-    mojo::ConnectToService(app_impl_->shell(), url, GetProxy(&view_associate));
+    mojo::ConnectToService(shell(), url, GetProxy(&view_associate));
 
     // Wire up the associate to the ViewManager.
     mojo::ui::ViewAssociateOwnerPtr view_associate_owner;
@@ -91,7 +87,7 @@
   view_manager_->FinishedRegisteringViewAssociates();
 }
 
-bool LauncherApp::ConfigureIncomingConnection(
+bool LauncherApp::OnAcceptConnection(
     mojo::ServiceProviderImpl* service_provider_impl) {
   // Only present the launcher interface to the shell.
   if (service_provider_impl->connection_context().remote_url.empty()) {
@@ -108,15 +104,15 @@
   DVLOG(1) << "Launching " << application_url;
 
   mojo::NativeViewportPtr viewport;
-  mojo::ConnectToService(app_impl_->shell(), "mojo:native_viewport_service",
+  mojo::ConnectToService(shell(), "mojo:native_viewport_service",
                          GetProxy(&viewport));
 
   mojo::ui::ViewProviderPtr view_provider;
-  mojo::ConnectToService(app_impl_->shell(), application_url,
-                         GetProxy(&view_provider));
+  mojo::ConnectToService(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) {
@@ -128,7 +124,7 @@
                                  mojo::ui::ViewProviderPtr view_provider) {
   uint32_t next_id = next_id_++;
   std::unique_ptr<LaunchInstance> instance(new LaunchInstance(
-      app_impl_, viewport.Pass(), view_provider.Pass(), compositor_.get(),
+      viewport.Pass(), view_provider.Pass(), compositor_.get(),
       view_manager_.get(), base::Bind(&LauncherApp::OnLaunchTermination,
                                       base::Unretained(this), next_id)));
   instance->Launch();
@@ -138,23 +134,23 @@
 void LauncherApp::OnLaunchTermination(uint32_t id) {
   launch_instances_.erase(id);
   if (launch_instances_.empty()) {
-    app_impl_->Terminate();
+    mojo::TerminateApplication(MOJO_RESULT_OK);
   }
 }
 
 void LauncherApp::OnCompositorConnectionError() {
   LOG(ERROR) << "Exiting due to compositor connection error.";
-  app_impl_->Terminate();
+  mojo::TerminateApplication(MOJO_RESULT_UNKNOWN);
 }
 
 void LauncherApp::OnViewManagerConnectionError() {
   LOG(ERROR) << "Exiting due to view manager connection error.";
-  app_impl_->Terminate();
+  mojo::TerminateApplication(MOJO_RESULT_UNKNOWN);
 }
 
 void LauncherApp::OnViewAssociateConnectionError() {
   LOG(ERROR) << "Exiting due to view associate connection error.";
-  app_impl_->Terminate();
+  mojo::TerminateApplication(MOJO_RESULT_UNKNOWN);
 };
 
 }  // namespace launcher
diff --git a/services/ui/launcher/launcher_app.h b/services/ui/launcher/launcher_app.h
index e15ca4e..ab7d7ad 100644
--- a/services/ui/launcher/launcher_app.h
+++ b/services/ui/launcher/launcher_app.h
@@ -7,27 +7,28 @@
 
 #include <memory>
 #include <unordered_map>
+#include <vector>
 
 #include "mojo/common/binding_set.h"
 #include "mojo/common/tracing_impl.h"
-#include "mojo/public/cpp/application/application_delegate.h"
+#include "mojo/public/cpp/application/application_impl_base.h"
 #include "services/ui/launcher/launch_instance.h"
 #include "services/ui/launcher/launcher.mojom.h"
 
 namespace launcher {
 
-class LauncherApp : public mojo::ApplicationDelegate, public Launcher {
+class LauncherApp : public mojo::ApplicationImplBase, public Launcher {
  public:
   LauncherApp();
   ~LauncherApp() override;
 
  private:
-  // |ApplicationDelegate|:
-  void Initialize(mojo::ApplicationImpl* app_impl) override;
+  // |ApplicationImplBase|:
+  void OnInitialize() override;
   void InitCompositor();
   void InitViewManager();
   void InitViewAssociates(const std::string& associate_urls_command_line_param);
-  bool ConfigureIncomingConnection(
+  bool OnAcceptConnection(
       mojo::ServiceProviderImpl* service_provider_impl) override;
 
   // |Launcher|:
@@ -44,7 +45,6 @@
   void OnViewManagerConnectionError();
   void OnViewAssociateConnectionError();
 
-  mojo::ApplicationImpl* app_impl_;
   mojo::TracingImpl tracing_;
 
   mojo::BindingSet<Launcher> bindings_;
diff --git a/services/ui/launcher/main.cc b/services/ui/launcher/main.cc
index fa82e08..9ba77ad 100644
--- a/services/ui/launcher/main.cc
+++ b/services/ui/launcher/main.cc
@@ -2,11 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/application/application_runner_chromium.h"
+#include "mojo/environment/scoped_chromium_init.h"
 #include "mojo/public/c/system/main.h"
+#include "mojo/public/cpp/application/run_application.h"
 #include "services/ui/launcher/launcher_app.h"
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(new launcher::LauncherApp);
-  return runner.Run(application_request);
+  mojo::ScopedChromiumInit init;
+  launcher::LauncherApp launcher_app;
+  return mojo::RunApplication(application_request, &launcher_app);
 }
diff --git a/services/ui/view_manager/main.cc b/services/ui/view_manager/main.cc
index dbfdade..f278090 100644
--- a/services/ui/view_manager/main.cc
+++ b/services/ui/view_manager/main.cc
@@ -2,11 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/application/application_runner_chromium.h"
+#include "mojo/environment/scoped_chromium_init.h"
 #include "mojo/public/c/system/main.h"
+#include "mojo/public/cpp/application/run_application.h"
 #include "services/ui/view_manager/view_manager_app.h"
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(new view_manager::ViewManagerApp);
-  return runner.Run(application_request);
+  mojo::ScopedChromiumInit init;
+  view_manager::ViewManagerApp view_manager_app;
+  return mojo::RunApplication(application_request, &view_manager_app);
 }
diff --git a/services/ui/view_manager/view_manager_app.cc b/services/ui/view_manager/view_manager_app.cc
index 7a80178..ff5a201 100644
--- a/services/ui/view_manager/view_manager_app.cc
+++ b/services/ui/view_manager/view_manager_app.cc
@@ -4,40 +4,33 @@
 
 #include "services/ui/view_manager/view_manager_app.h"
 
-#include <string>
-#include <vector>
-
 #include "base/command_line.h"
 #include "base/logging.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/run_application.h"
 #include "mojo/public/cpp/application/service_provider_impl.h"
 #include "services/ui/view_manager/view_manager_impl.h"
 
 namespace view_manager {
 
-ViewManagerApp::ViewManagerApp() : app_impl_(nullptr) {}
+ViewManagerApp::ViewManagerApp() {}
 
 ViewManagerApp::~ViewManagerApp() {}
 
-void ViewManagerApp::Initialize(mojo::ApplicationImpl* app_impl) {
-  app_impl_ = app_impl;
-
+void ViewManagerApp::OnInitialize() {
   auto command_line = base::CommandLine::ForCurrentProcess();
-  command_line->InitFromArgv(app_impl_->args());
+  command_line->InitFromArgv(args());
   logging::LoggingSettings settings;
   settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG;
   logging::InitLogging(settings);
 
-  tracing_.Initialize(app_impl_->shell(), &app_impl_->args());
+  tracing_.Initialize(shell(), &args());
 
   // Connect to compositor.
   mojo::gfx::composition::CompositorPtr compositor;
-  mojo::ConnectToService(app_impl_->shell(), "mojo:compositor_service",
+  mojo::ConnectToService(shell(), "mojo:compositor_service",
                          GetProxy(&compositor));
   compositor.set_connection_error_handler(base::Bind(
       &ViewManagerApp::OnCompositorConnectionError, base::Unretained(this)));
@@ -46,7 +39,7 @@
   registry_.reset(new ViewRegistry(compositor.Pass()));
 }
 
-bool ViewManagerApp::ConfigureIncomingConnection(
+bool ViewManagerApp::OnAcceptConnection(
     mojo::ServiceProviderImpl* service_provider_impl) {
   service_provider_impl->AddService<mojo::ui::ViewManager>([this](
       const mojo::ConnectionContext& connection_context,
@@ -64,7 +57,7 @@
 }
 
 void ViewManagerApp::Shutdown() {
-  app_impl_->Terminate();
+  mojo::TerminateApplication(MOJO_RESULT_OK);
 }
 
 }  // namespace view_manager
diff --git a/services/ui/view_manager/view_manager_app.h b/services/ui/view_manager/view_manager_app.h
index 05e0844..f28ae7e 100644
--- a/services/ui/view_manager/view_manager_app.h
+++ b/services/ui/view_manager/view_manager_app.h
@@ -10,7 +10,7 @@
 #include "base/macros.h"
 #include "mojo/common/strong_binding_set.h"
 #include "mojo/common/tracing_impl.h"
-#include "mojo/public/cpp/application/application_delegate.h"
+#include "mojo/public/cpp/application/application_impl_base.h"
 #include "mojo/services/gfx/composition/interfaces/compositor.mojom.h"
 #include "mojo/services/ui/views/interfaces/view_manager.mojom.h"
 #include "services/ui/view_manager/view_registry.h"
@@ -18,22 +18,21 @@
 namespace view_manager {
 
 // View manager application entry point.
-class ViewManagerApp : public mojo::ApplicationDelegate {
+class ViewManagerApp : public mojo::ApplicationImplBase {
  public:
   ViewManagerApp();
   ~ViewManagerApp() override;
 
  private:
-  // |ApplicationDelegate|:
-  void Initialize(mojo::ApplicationImpl* app_impl) override;
-  bool ConfigureIncomingConnection(
+  // |ApplicationImplBase|:
+  void OnInitialize() override;
+  bool OnAcceptConnection(
       mojo::ServiceProviderImpl* service_provider_impl) override;
 
   void OnCompositorConnectionError();
 
   void Shutdown();
 
-  mojo::ApplicationImpl* app_impl_;
   mojo::TracingImpl tracing_;
 
   mojo::StrongBindingSet<mojo::ui::ViewManager> view_managers_;