Add implementations of mojo::{Run,Terminate}[Main]Application() for "chromium".

And convert a bunch of uses of ApplicationRunnerChromium (and
ApplicationDelegate). Mostly, I converted stuff until I got bored.

But:
* I still have to convert some Mozart-related base classes.
* I also have to fix the tracing library to not take an
  ApplicationImpl*.
* I have to add the ability to set the message loop type.
* I made Run[Main]Application() return MOJO_RESULT_OK by default (e.g.,
  if the message loop was quit via something other than
  Terminate[Main]Application()), since it's what
  ApplicationRunner[Chromium] did (and some tests rely on this). We
  should fix this.

R=vardhan@google.com

Review URL: https://codereview.chromium.org/2005103003 .
diff --git a/examples/echo_terminal/main.cc b/examples/echo_terminal/main.cc
index 6c56eaf..518be21 100644
--- a/examples/echo_terminal/main.cc
+++ b/examples/echo_terminal/main.cc
@@ -8,10 +8,10 @@
 #include "base/bind_helpers.h"
 #include "base/logging.h"
 #include "base/macros.h"
-#include "mojo/application/application_runner_chromium.h"
 #include "mojo/common/binding_set.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/services/files/interfaces/file.mojom.h"
 #include "mojo/services/files/interfaces/types.mojom.h"
@@ -95,16 +95,15 @@
   DISALLOW_COPY_AND_ASSIGN(TerminalEchoer);
 };
 
-class EchoTerminalApp
-    : public mojo::ApplicationDelegate,
-      public mojo::terminal::TerminalClient {
+class EchoTerminalApp : public mojo::ApplicationImplBase,
+                        public mojo::terminal::TerminalClient {
  public:
   EchoTerminalApp() {}
   ~EchoTerminalApp() override {}
 
  private:
-  // |ApplicationDelegate| override:
-  bool ConfigureIncomingConnection(
+  // |ApplicationImplBase| override:
+  bool OnAcceptConnection(
       mojo::ServiceProviderImpl* service_provider_impl) override {
     service_provider_impl->AddService<mojo::terminal::TerminalClient>(
         [this](const mojo::ConnectionContext& connection_context,
@@ -130,6 +129,6 @@
 };
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(new EchoTerminalApp());
-  return runner.Run(application_request);
+  EchoTerminalApp echo_terminal_app;
+  return mojo::RunMainApplication(application_request, &echo_terminal_app);
 }
diff --git a/examples/http_handler/http_handler.cc b/examples/http_handler/http_handler.cc
index af4a4cf..95fe142 100644
--- a/examples/http_handler/http_handler.cc
+++ b/examples/http_handler/http_handler.cc
@@ -3,11 +3,10 @@
 // found in the LICENSE file.
 
 #include "base/bind.h"
-#include "mojo/application/application_runner_chromium.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_ptr.h"
 #include "mojo/public/cpp/system/message_pipe.h"
 #include "mojo/services/http_server/cpp/http_server_util.h"
@@ -21,20 +20,20 @@
 // This is an example of a self-contained HTTP handler. It uses the HTTP Server
 // service to handle the HTTP protocol details, and just contains the logic for
 // handling its registered urls.
-class HttpHandler : public ApplicationDelegate,
+class HttpHandler : public ApplicationImplBase,
                     public http_server::HttpHandler {
  public:
   HttpHandler() : binding_(this) {}
   ~HttpHandler() override {}
 
  private:
-  // ApplicationDelegate:
-  void Initialize(ApplicationImpl* app) override {
+  // ApplicationImplBase override:
+  void OnInitialize() override {
     http_server::HttpHandlerPtr http_handler_ptr;
     binding_.Bind(GetProxy(&http_handler_ptr));
 
     http_server::HttpServerFactoryPtr http_server_factory;
-    ConnectToService(app->shell(), "mojo:http_server",
+    ConnectToService(shell(), "mojo:http_server",
                      GetProxy(&http_server_factory));
 
     mojo::NetAddressPtr local_address(mojo::NetAddress::New());
@@ -76,6 +75,6 @@
 }  // namespace mojo
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(new mojo::examples::HttpHandler());
-  return runner.Run(application_request);
+  mojo::examples::HttpHandler http_handler;
+  return mojo::RunMainApplication(application_request, &http_handler);
 }
diff --git a/examples/notification_generator/notification_generator.cc b/examples/notification_generator/notification_generator.cc
index 17bb081..9b173be 100644
--- a/examples/notification_generator/notification_generator.cc
+++ b/examples/notification_generator/notification_generator.cc
@@ -6,12 +6,12 @@
 
 #include "base/bind.h"
 #include "base/macros.h"
-#include "mojo/application/application_runner_chromium.h"
+#include "base/message_loop/message_loop.h"
 #include "mojo/common/binding_set.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/services/notifications/interfaces/notifications.mojom.h"
 
 namespace examples {
@@ -19,16 +19,16 @@
 static const base::TimeDelta kDefaultMessageDelay =
     base::TimeDelta::FromMilliseconds(3000);
 
-class NotificationGeneratorDelegate : public mojo::ApplicationDelegate,
-                                      public notifications::NotificationClient {
+class NotificationGeneratorApp : public mojo::ApplicationImplBase,
+                                 public notifications::NotificationClient {
  public:
-  NotificationGeneratorDelegate() {}
+  NotificationGeneratorApp() {}
 
-  ~NotificationGeneratorDelegate() override {}
+  ~NotificationGeneratorApp() override {}
 
-  // mojo::ApplicationDelegate implementation.
-  void Initialize(mojo::ApplicationImpl* app) override {
-    mojo::ConnectToService(app->shell(), "mojo:notifications",
+  // mojo::ApplicationImplBase implementation.
+  void OnInitialize() override {
+    mojo::ConnectToService(shell(), "mojo:notifications",
                            GetProxy(&notification_service_));
     PostFirstNotification();
   }
@@ -47,17 +47,15 @@
   void PostFirstNotification() {
     PostNotification("First notification", "Next: Second will be created",
                      &first_notification_);
-    PostDelayed(
-        base::Bind(&NotificationGeneratorDelegate::PostSecondNotification,
-                   base::Unretained(this)));
+    PostDelayed(base::Bind(&NotificationGeneratorApp::PostSecondNotification,
+                           base::Unretained(this)));
   }
 
   void PostSecondNotification() {
     PostNotification("Second notification", "Next: First will be updated",
                      &second_notification_);
-    PostDelayed(
-        base::Bind(&NotificationGeneratorDelegate::UpdateFirstNotification,
-                   base::Unretained(this)));
+    PostDelayed(base::Bind(&NotificationGeneratorApp::UpdateFirstNotification,
+                           base::Unretained(this)));
   }
 
   void PostNotification(const char* title,
@@ -76,23 +74,20 @@
     first_notification_->Update(
         CreateNotificationData("First notification updated",
                                "Next: both cancelled; repeat").Pass());
-    PostDelayed(
-        base::Bind(&NotificationGeneratorDelegate::CancelSecondNotification,
-                   base::Unretained(this)));
+    PostDelayed(base::Bind(&NotificationGeneratorApp::CancelSecondNotification,
+                           base::Unretained(this)));
   }
 
   void CancelSecondNotification() {
     second_notification_->Cancel();
-    PostDelayed(
-        base::Bind(&NotificationGeneratorDelegate::CancelFirstNotification,
-                   base::Unretained(this)));
+    PostDelayed(base::Bind(&NotificationGeneratorApp::CancelFirstNotification,
+                           base::Unretained(this)));
   }
 
   void CancelFirstNotification() {
     first_notification_->Cancel();
-    PostDelayed(
-        base::Bind(&NotificationGeneratorDelegate::PostFirstNotification,
-                   base::Unretained(this)));
+    PostDelayed(base::Bind(&NotificationGeneratorApp::PostFirstNotification,
+                           base::Unretained(this)));
   }
 
   notifications::NotificationDataPtr CreateNotificationData(const char* title,
@@ -117,13 +112,13 @@
   notifications::NotificationPtr dismissed_notification_;
   notifications::NotificationPtr select_notification_;
 
-  DISALLOW_COPY_AND_ASSIGN(NotificationGeneratorDelegate);
+  DISALLOW_COPY_AND_ASSIGN(NotificationGeneratorApp);
 };
 
 }  // namespace examples
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(
-      new examples::NotificationGeneratorDelegate);
-  return runner.Run(application_request);
+  examples::NotificationGeneratorApp notification_generator_app;
+  return mojo::RunMainApplication(application_request,
+                                  &notification_generator_app);
 }
diff --git a/mojo/application/BUILD.gn b/mojo/application/BUILD.gn
index 08e7f95..f697dde 100644
--- a/mojo/application/BUILD.gn
+++ b/mojo/application/BUILD.gn
@@ -6,6 +6,7 @@
   sources = [
     "application_runner_chromium.cc",
     "application_runner_chromium.h",
+    "run_application.cc",
   ]
 
   public_deps = [
@@ -13,9 +14,9 @@
   ]
   deps = [
     "//base",
+    "//mojo/environment:chromium",
     "//mojo/message_pump",
     "//mojo/public/cpp/system",
-    "//mojo/environment:chromium",
   ]
 }
 
diff --git a/mojo/application/run_application.cc b/mojo/application/run_application.cc
new file mode 100644
index 0000000..bee1f41
--- /dev/null
+++ b/mojo/application/run_application.cc
@@ -0,0 +1,96 @@
+// Copyright 2016 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 "mojo/public/cpp/application/run_application.h"
+
+#include <memory>
+
+#include "base/at_exit.h"
+#include "base/command_line.h"
+#include "base/debug/stack_trace.h"
+#include "base/message_loop/message_loop.h"
+#include "base/threading/thread_local_storage.h"
+#include "build/build_config.h"
+#include "mojo/message_pump/message_pump_mojo.h"
+#include "mojo/public/cpp/application/application_impl_base.h"
+#include "mojo/public/cpp/system/message_pipe.h"
+
+namespace mojo {
+
+namespace {
+
+base::ThreadLocalStorage::StaticSlot g_current_result_holder = TLS_INITIALIZER;
+
+// We store a pointer to a |ResultHolder|, which just stores a |MojoResult|, in
+// TLS so that |TerminateApplication()| can provide the result that
+// |RunApplication()| will return. (The |ResultHolder| is just on
+// |RunApplication()|'s stack.)
+struct ResultHolder {
+#if !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)
+  bool is_set = false;
+#endif
+  // TODO(vtl): The default result should probably be |MOJO_RESULT_UNKNOWN|, but
+  // |ApplicationRunnerChromium| always returned |MOJO_RESULT_OK|.
+  MojoResult result = MOJO_RESULT_OK;
+};
+
+}  // namespace
+
+MojoResult RunMainApplication(MojoHandle application_request_handle,
+                              ApplicationImplBase* application_impl) {
+  base::CommandLine::Init(0, nullptr);
+  base::AtExitManager at_exit;
+
+  g_current_result_holder.Initialize(nullptr);
+
+#if !defined(NDEBUG) && !defined(OS_NACL)
+  base::debug::EnableInProcessStackDumping();
+#endif
+
+  return RunApplication(application_request_handle, application_impl);
+}
+
+MojoResult RunApplication(MojoHandle application_request_handle,
+                          ApplicationImplBase* application_impl) {
+  DCHECK(!g_current_result_holder.Get());
+
+  ResultHolder result_holder;
+  g_current_result_holder.Set(&result_holder);
+
+  std::unique_ptr<base::MessageLoop> loop;
+  // TODO(vtl): Support other types of message loops. (That's why I'm leaving
+  // |loop| as a unique_ptr.)
+  loop.reset(new base::MessageLoop(common::MessagePumpMojo::Create()));
+  application_impl->Bind(InterfaceRequest<Application>(
+      MakeScopedHandle(MessagePipeHandle(application_request_handle))));
+  loop->Run();
+
+  g_current_result_holder.Set(nullptr);
+
+  // TODO(vtl): We'd like to enable the following assertion, but we quit the
+  // current message loop directly in various places.
+  // DCHECK(result_holder.is_set);
+
+  return result_holder.result;
+}
+
+void TerminateMainApplication(MojoResult result) {
+  TerminateApplication(result);
+}
+
+void TerminateApplication(MojoResult result) {
+  DCHECK(base::MessageLoop::current()->is_running());
+  base::MessageLoop::current()->Quit();
+
+  ResultHolder* result_holder =
+      static_cast<ResultHolder*>(g_current_result_holder.Get());
+  DCHECK(result_holder);
+  DCHECK(!result_holder->is_set);
+  result_holder->result = result;
+#if !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)
+  result_holder->is_set = true;
+#endif
+}
+
+}  // namespace mojo
diff --git a/mojo/public/cpp/application/lib/run_application.cc b/mojo/public/cpp/application/lib/run_application.cc
index 4ca4a1a..e34d245 100644
--- a/mojo/public/cpp/application/lib/run_application.cc
+++ b/mojo/public/cpp/application/lib/run_application.cc
@@ -25,7 +25,9 @@
 #ifndef NDEBUG
   bool is_set = false;
 #endif
-  MojoResult result = MOJO_RESULT_UNKNOWN;
+  // TODO(vtl): The default result should probably be |MOJO_RESULT_UNKNOWN|, but
+  // |ApplicationRunner| always returned |MOJO_RESULT_OK|.
+  MojoResult result = MOJO_RESULT_OK;
 };
 
 pthread_key_t g_current_result_holder_key;
diff --git a/services/asset_bundle/main.cc b/services/asset_bundle/main.cc
index fc3fdf7..d6c8d63 100644
--- a/services/asset_bundle/main.cc
+++ b/services/asset_bundle/main.cc
@@ -4,30 +4,29 @@
 
 #include "base/macros.h"
 #include "base/threading/sequenced_worker_pool.h"
-#include "mojo/application/application_runner_chromium.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 "services/asset_bundle/asset_unpacker_impl.h"
 
 namespace mojo {
 namespace asset_bundle {
 
-class AssetBundleApp : public ApplicationDelegate {
+class AssetBundleApp : public ApplicationImplBase {
  public:
   AssetBundleApp() {}
   ~AssetBundleApp() override {}
 
  private:
-  // |ApplicationDelegate| override:
-  bool ConfigureIncomingConnection(
-      ServiceProviderImpl* service_provider_impl) override {
+  // |ApplicationImplBase| override:
+  bool OnAcceptConnection(ServiceProviderImpl* service_provider_impl) override {
     service_provider_impl->AddService<AssetUnpacker>(
         [this](const ConnectionContext& connection_context,
                InterfaceRequest<AssetUnpacker> asset_unpacker_request) {
           // Lazily initialize |sequenced_worker_pool_|. (We can't create it in
           // the constructor, since AtExitManager is only created in
-          // ApplicationRunnerChromium::Run().)
+          // mojo::RunMainApplication().)
           if (!sequenced_worker_pool_) {
             // TODO(vtl): What's the "right" way to choose the maximum number of
             // threads?
@@ -54,7 +53,6 @@
 }  // namespace mojo
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(
-      new mojo::asset_bundle::AssetBundleApp());
-  return runner.Run(application_request);
+  mojo::asset_bundle::AssetBundleApp asset_bundle_app;
+  return mojo::RunMainApplication(application_request, &asset_bundle_app);
 }
diff --git a/services/authentication/main.cc b/services/authentication/main.cc
index dd77d35..331d306 100644
--- a/services/authentication/main.cc
+++ b/services/authentication/main.cc
@@ -2,12 +2,11 @@
 // 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/common/binding_set.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/application/service_provider_impl.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 #include "mojo/public/cpp/system/macros.h"
@@ -17,20 +16,18 @@
 
 namespace authentication {
 
-class GoogleAccountManagerApp : public mojo::ApplicationDelegate {
+class GoogleAccountManagerApp : public mojo::ApplicationImplBase {
  public:
   GoogleAccountManagerApp() {}
   ~GoogleAccountManagerApp() override {}
 
-  void Initialize(mojo::ApplicationImpl* app) override {
-    mojo::ConnectToService(app->shell(), "mojo:network_service",
+  void OnInitialize() override {
+    mojo::ConnectToService(shell(), "mojo:network_service",
                            GetProxy(&network_service_));
-    mojo::ConnectToService(app->shell(), "mojo:files", GetProxy(&files_));
-
-    app_url_ = app->url();
+    mojo::ConnectToService(shell(), "mojo:files", GetProxy(&files_));
   }
 
-  bool ConfigureIncomingConnection(
+  bool OnAcceptConnection(
       mojo::ServiceProviderImpl* service_provider_impl) override {
     service_provider_impl->AddService<AuthenticationService>(
         [this](const mojo::ConnectionContext& connection_context,
@@ -44,7 +41,7 @@
             LOG(FATAL) << "Unable to initialize accounts DB";
           }
           new authentication::GoogleAuthenticationServiceImpl(
-              request.Pass(), app_url_, network_service_, directory);
+              request.Pass(), url(), network_service_, directory);
         });
     return true;
   }
@@ -52,7 +49,6 @@
  private:
   mojo::NetworkServicePtr network_service_;
   mojo::files::FilesPtr files_;
-  std::string app_url_;
 
   DISALLOW_COPY_AND_ASSIGN(GoogleAccountManagerApp);
 };
@@ -60,7 +56,7 @@
 }  // namespace authentication
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(
-      new authentication::GoogleAccountManagerApp());
-  return runner.Run(application_request);
+  authentication::GoogleAccountManagerApp google_account_manager_app;
+  return mojo::RunMainApplication(application_request,
+                                  &google_account_manager_app);
 }
diff --git a/services/clipboard/main.cc b/services/clipboard/main.cc
index be8faea..80bab3c 100644
--- a/services/clipboard/main.cc
+++ b/services/clipboard/main.cc
@@ -2,19 +2,21 @@
 // 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/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 "services/clipboard/clipboard_standalone_impl.h"
 
-class Delegate : public mojo::ApplicationDelegate {
- public:
-  Delegate() {}
-  ~Delegate() override {}
+namespace {
 
-  // mojo::ApplicationDelegate implementation.
-  bool ConfigureIncomingConnection(
+class ClipboardApp : public mojo::ApplicationImplBase {
+ public:
+  ClipboardApp() {}
+  ~ClipboardApp() override {}
+
+  // mojo::ApplicationImplBase override.
+  bool OnAcceptConnection(
       mojo::ServiceProviderImpl* service_provider_impl) override {
     service_provider_impl->AddService<mojo::Clipboard>(
         [](const mojo::ConnectionContext& connection_context,
@@ -27,7 +29,9 @@
   }
 };
 
+}  // namespace
+
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(new Delegate);
-  return runner.Run(application_request);
+  ClipboardApp clipboard_app;
+  return mojo::RunMainApplication(application_request, &clipboard_app);
 }
diff --git a/services/icu_data/icu_data_impl.cc b/services/icu_data/icu_data_impl.cc
index 48614fe..d213629 100644
--- a/services/icu_data/icu_data_impl.cc
+++ b/services/icu_data/icu_data_impl.cc
@@ -12,7 +12,7 @@
 ICUDataImpl::ICUDataImpl() {}
 ICUDataImpl::~ICUDataImpl() {}
 
-bool ICUDataImpl::ConfigureIncomingConnection(
+bool ICUDataImpl::OnAcceptConnection(
     mojo::ServiceProviderImpl* service_provider_impl) {
   service_provider_impl->AddService<ICUData>(
       [this](const mojo::ConnectionContext& connection_context,
diff --git a/services/icu_data/icu_data_impl.h b/services/icu_data/icu_data_impl.h
index 6c81120..c1a0be8 100644
--- a/services/icu_data/icu_data_impl.h
+++ b/services/icu_data/icu_data_impl.h
@@ -2,21 +2,22 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "base/macros.h"
 #include "base/memory/scoped_ptr.h"
 #include "mojo/common/binding_set.h"
-#include "mojo/public/cpp/application/application_delegate.h"
+#include "mojo/public/cpp/application/application_impl_base.h"
 #include "mojo/public/cpp/application/service_provider_impl.h"
 #include "mojo/services/icu_data/interfaces/icu_data.mojom.h"
 
 namespace icu_data {
 
-class ICUDataImpl : public mojo::ApplicationDelegate, public ICUData {
+class ICUDataImpl : public mojo::ApplicationImplBase, public ICUData {
  public:
   ICUDataImpl();
   ~ICUDataImpl() override;
 
-  // mojo::ApplicationDelegate implementation.
-  bool ConfigureIncomingConnection(
+  // mojo::ApplicationImplBase implementation.
+  bool OnAcceptConnection(
       mojo::ServiceProviderImpl* service_provider_impl) override;
 
   void Map(const mojo::String& sha1hash,
@@ -28,6 +29,8 @@
 
   scoped_ptr<mojo::SharedBuffer> buffer_;
   mojo::BindingSet<ICUData> bindings_;
+
+  DISALLOW_COPY_AND_ASSIGN(ICUDataImpl);
 };
 
 }  // namespace icu_data;
diff --git a/services/icu_data/main.cc b/services/icu_data/main.cc
index a10d795..880a180 100644
--- a/services/icu_data/main.cc
+++ b/services/icu_data/main.cc
@@ -2,11 +2,11 @@
 // 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/public/c/system/main.h"
+#include "mojo/public/cpp/application/run_application.h"
 #include "services/icu_data/icu_data_impl.h"
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(new icu_data::ICUDataImpl);
-  return runner.Run(application_request);
+  icu_data::ICUDataImpl icu_data_impl;
+  return mojo::RunMainApplication(application_request, &icu_data_impl);
 }
diff --git a/services/js/content_handler_main.cc b/services/js/content_handler_main.cc
index 9ed4f84..79eb6c5 100644
--- a/services/js/content_handler_main.cc
+++ b/services/js/content_handler_main.cc
@@ -5,23 +5,22 @@
 #include "base/i18n/icu_util.h"
 #include "gin/array_buffer.h"
 #include "gin/public/isolate_holder.h"
-#include "mojo/application/application_runner_chromium.h"
 #include "mojo/application/content_handler_factory.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 "services/js/js_app.h"
 
 namespace js {
 
-class JsContentHandler : public mojo::ApplicationDelegate,
+class JsContentHandler : public mojo::ApplicationImplBase,
                          public mojo::ContentHandlerFactory::ManagedDelegate {
  public:
   JsContentHandler() {}
 
  private:
-  // Overridden from mojo::ApplicationDelegate:
-  void Initialize(mojo::ApplicationImpl* app) override {
+  // Overridden from mojo::ApplicationImplBase:
+  void OnInitialize() override {
     static const char v8Flags[] = "--harmony-classes";
     v8::V8::SetFlagsFromString(v8Flags, sizeof(v8Flags) - 1);
     base::i18n::InitializeICU();
@@ -29,15 +28,15 @@
                                    gin::ArrayBufferAllocator::SharedInstance());
   }
 
-  // Overridden from ApplicationDelegate:
-  bool ConfigureIncomingConnection(
+  // Overridden from mojo::ApplicationImplBase:
+  bool OnAcceptConnection(
       mojo::ServiceProviderImpl* service_provider_impl) override {
     service_provider_impl->AddService<mojo::ContentHandler>(
         mojo::ContentHandlerFactory::GetInterfaceRequestHandler(this));
     return true;
   }
 
-  // Overridden from ContentHandlerFactory::ManagedDelegate:
+  // Overridden from mojo::ContentHandlerFactory::ManagedDelegate:
   scoped_ptr<mojo::ContentHandlerFactory::HandledApplicationHolder>
   CreateApplication(
       mojo::InterfaceRequest<mojo::Application> application_request,
@@ -52,6 +51,6 @@
 }  // namespace js
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(new js::JsContentHandler);
-  return runner.Run(application_request);
+  js::JsContentHandler js_content_handler;
+  return mojo::RunMainApplication(application_request, &js_content_handler);
 }
diff --git a/services/log/main.cc b/services/log/main.cc
index 574e9bb..9ea6dba 100644
--- a/services/log/main.cc
+++ b/services/log/main.cc
@@ -6,9 +6,9 @@
 
 #include <utility>
 
-#include "mojo/application/application_runner_chromium.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/system/macros.h"
 #include "mojo/services/log/interfaces/log.mojom.h"
@@ -19,15 +19,14 @@
 
 // Provides the mojo.log.Log service.  Binds a new Log implementation for each
 // Log interface request.
-class LogApp : public ApplicationDelegate {
+class LogApp : public ApplicationImplBase {
  public:
   LogApp() {}
   ~LogApp() override {}
 
  private:
-  // |ApplicationDelegate| override:
-  bool ConfigureIncomingConnection(
-      ServiceProviderImpl* service_provider_impl) override {
+  // |ApplicationImplBase| override:
+  bool OnAcceptConnection(ServiceProviderImpl* service_provider_impl) override {
     service_provider_impl->AddService<Log>(
         [](const ConnectionContext& connection_context,
            InterfaceRequest<Log> log_request) {
@@ -46,6 +45,6 @@
 }  // namespace mojo
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(new mojo::log::LogApp());
-  return runner.Run(application_request);
+  mojo::log::LogApp log_app;
+  return mojo::RunMainApplication(application_request, &log_app);
 }
diff --git a/services/nacl/nonsfi/content_handler_main_nexe.cc b/services/nacl/nonsfi/content_handler_main_nexe.cc
index 158816a..9701bbd 100644
--- a/services/nacl/nonsfi/content_handler_main_nexe.cc
+++ b/services/nacl/nonsfi/content_handler_main_nexe.cc
@@ -5,29 +5,26 @@
 #include <fcntl.h>
 
 #include "base/files/file_util.h"
-#include "mojo/application/application_runner_chromium.h"
+#include "base/message_loop/message_loop.h"
 #include "mojo/application/content_handler_factory.h"
 #include "mojo/data_pipe_utils/data_pipe_utils.h"
 #include "mojo/message_pump/message_pump_mojo.h"
 #include "mojo/nacl/nonsfi/nexe_launcher_nonsfi.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"
 
 namespace nacl {
 namespace content_handler {
 
-class NaClContentHandler : public mojo::ApplicationDelegate,
+class NaClContentHandler : public mojo::ApplicationImplBase,
                            public mojo::ContentHandlerFactory::Delegate {
  public:
   NaClContentHandler() {}
 
  private:
-  // Overridden from ApplicationDelegate:
-  void Initialize(mojo::ApplicationImpl* app) override {}
-
-  // Overridden from ApplicationDelegate:
-  bool ConfigureIncomingConnection(
+  // Overridden from ApplicationImplBase:
+  bool OnAcceptConnection(
       mojo::ServiceProviderImpl* service_provider_impl) override {
     service_provider_impl->AddService<mojo::ContentHandler>(
         mojo::ContentHandlerFactory::GetInterfaceRequestHandler(this));
@@ -64,7 +61,6 @@
 }  // namespace nacl
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(
-      new nacl::content_handler::NaClContentHandler());
-  return runner.Run(application_request);
+  nacl::content_handler::NaClContentHandler nacl_content_handler;
+  return mojo::RunMainApplication(application_request, &nacl_content_handler);
 }
diff --git a/services/nacl/nonsfi/content_handler_main_pexe.cc b/services/nacl/nonsfi/content_handler_main_pexe.cc
index e92d3d6..b9e6f2b 100644
--- a/services/nacl/nonsfi/content_handler_main_pexe.cc
+++ b/services/nacl/nonsfi/content_handler_main_pexe.cc
@@ -5,9 +5,9 @@
 #include <fcntl.h>
 
 #include "base/files/file_util.h"
+#include "base/message_loop/message_loop.h"
 #include "base/sha1.h"
 #include "base/strings/string_number_conversions.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/file_utils/file_util.h"
@@ -15,9 +15,9 @@
 #include "mojo/nacl/nonsfi/file_util.h"
 #include "mojo/nacl/nonsfi/nexe_launcher_nonsfi.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/array.h"
 #include "mojo/public/cpp/bindings/synchronous_interface_ptr.h"
 #include "mojo/services/files/interfaces/directory.mojom-sync.h"
@@ -28,19 +28,19 @@
 namespace nacl {
 namespace content_handler {
 
-class PexeContentHandler : public mojo::ApplicationDelegate,
+class PexeContentHandler : public mojo::ApplicationImplBase,
                            public mojo::ContentHandlerFactory::Delegate {
  public:
   PexeContentHandler() {}
 
  private:
-  // Overridden from ApplicationDelegate:
-  void Initialize(mojo::ApplicationImpl* app) override {
-    mojo::ConnectToService(app->shell(), "mojo:pnacl_compile",
+  // Overridden from ApplicationImplBase:
+  void OnInitialize() override {
+    mojo::ConnectToService(shell(), "mojo:pnacl_compile",
                            GetSynchronousProxy(&compiler_init_));
-    mojo::ConnectToService(app->shell(), "mojo:pnacl_link",
+    mojo::ConnectToService(shell(), "mojo:pnacl_link",
                            GetSynchronousProxy(&linker_init_));
-    mojo::ConnectToService(app->shell(), "mojo:files", GetProxy(&files_));
+    mojo::ConnectToService(shell(), "mojo:files", GetProxy(&files_));
     mojo::files::Error error = mojo::files::Error::INTERNAL;
     files_->OpenFileSystem("app_persistent_cache",
                            GetSynchronousProxy(&nexe_cache_directory_),
@@ -49,8 +49,8 @@
     CHECK_EQ(mojo::files::Error::OK, error);
   }
 
-  // Overridden from ApplicationDelegate:
-  bool ConfigureIncomingConnection(
+  // Overridden from ApplicationImplBase:
+  bool OnAcceptConnection(
       mojo::ServiceProviderImpl* service_provider_impl) override {
     service_provider_impl->AddService<mojo::ContentHandler>(
         mojo::ContentHandlerFactory::GetInterfaceRequestHandler(this));
@@ -162,7 +162,6 @@
 }  // namespace nacl
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(
-      new nacl::content_handler::PexeContentHandler());
-  return runner.Run(application_request);
+  nacl::content_handler::PexeContentHandler pexe_content_handler;
+  return mojo::RunMainApplication(application_request, &pexe_content_handler);
 }
diff --git a/services/nacl/sfi/content_handler_main.cc b/services/nacl/sfi/content_handler_main.cc
index 3894e3a..35a6fb1 100644
--- a/services/nacl/sfi/content_handler_main.cc
+++ b/services/nacl/sfi/content_handler_main.cc
@@ -6,15 +6,14 @@
 #include "base/files/scoped_file.h"
 #include "base/message_loop/message_loop.h"
 #include "build/build_config.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/message_pump/message_pump_mojo.h"
 #include "mojo/nacl/sfi/nacl_bindings/monacl_sel_main.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/application/service_provider_impl.h"
 #include "mojo/services/network/interfaces/network_service.mojom.h"
 #include "mojo/services/network/interfaces/url_loader.mojom.h"
@@ -71,23 +70,31 @@
 
 }  // namespace
 
-class NaClContentHandler : public mojo::ApplicationDelegate,
+class NaClContentHandler : public mojo::ApplicationImplBase,
                            public mojo::ContentHandlerFactory::Delegate {
  public:
   NaClContentHandler() {}
 
  private:
-  // Overridden from ApplicationDelegate:
-  void Initialize(mojo::ApplicationImpl* app) override {
-    url_ = GURL(app->url());
+  // Overridden from ApplicationImplBase:
+  void OnInitialize() override {
+    url_ = GURL(url());
 
     mojo::NetworkServicePtr network_service;
-    mojo::ConnectToService(app->shell(), "mojo:network_service",
+    mojo::ConnectToService(shell(), "mojo:network_service",
                            GetProxy(&network_service));
 
     network_service->CreateURLLoader(GetProxy(&url_loader_));
   }
 
+  // Overridden from ApplicationImplBase:
+  bool OnAcceptConnection(
+      mojo::ServiceProviderImpl* service_provider_impl) override {
+    service_provider_impl->AddService<mojo::ContentHandler>(
+        mojo::ContentHandlerFactory::GetInterfaceRequestHandler(this));
+    return true;
+  }
+
   void LoadIRT(mojo::URLLoaderPtr& url_loader) {
     // TODO(ncbray): support other architectures.
     GURL irt_url;
@@ -102,14 +109,6 @@
     CHECK(irt_fp_) << "Could not acquire the IRT";
   }
 
-  // Overridden from ApplicationDelegate:
-  bool ConfigureIncomingConnection(
-      mojo::ServiceProviderImpl* service_provider_impl) override {
-    service_provider_impl->AddService<mojo::ContentHandler>(
-        mojo::ContentHandlerFactory::GetInterfaceRequestHandler(this));
-    return true;
-  }
-
   // Overridden from ContentHandlerFactory::Delegate:
   void RunApplication(
       mojo::InterfaceRequest<mojo::Application> application_request,
@@ -151,7 +150,6 @@
 }  // namespace nacl
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(
-      new nacl::content_handler::NaClContentHandler());
-  return runner.Run(application_request);
+  nacl::content_handler::NaClContentHandler nacl_content_handler;
+  return mojo::RunMainApplication(application_request, &nacl_content_handler);
 }
diff --git a/services/python/content_handler/content_handler_main.cc b/services/python/content_handler/content_handler_main.cc
index 383f4b3..3695889 100644
--- a/services/python/content_handler/content_handler_main.cc
+++ b/services/python/content_handler/content_handler_main.cc
@@ -10,12 +10,11 @@
 #include "base/i18n/icu_util.h"
 #include "base/strings/string_split.h"
 #include "base/strings/stringprintf.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/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/python/src/common.h"
 #include "third_party/zlib/google/zip_reader.h"
 #include "url/gurl.h"
@@ -34,7 +33,7 @@
 namespace content_handler {
 
 using mojo::Application;
-using mojo::ApplicationDelegate;
+using mojo::ApplicationImplBase;
 using mojo::ContentHandlerFactory;
 using mojo::InterfaceRequest;
 using mojo::ScopedDataPipeConsumerHandle;
@@ -201,14 +200,14 @@
   DISALLOW_COPY_AND_ASSIGN(PythonContentHandler);
 };
 
-class PythonContentHandlerApp : public ApplicationDelegate {
+class PythonContentHandlerApp : public ApplicationImplBase {
  public:
   PythonContentHandlerApp()
       : content_handler_(false), debug_content_handler_(true) {}
 
  private:
-  // Overridden from ApplicationDelegate:
-  bool ConfigureIncomingConnection(
+  // Overridden from ApplicationImplBase:
+  bool OnAcceptConnection(
       mojo::ServiceProviderImpl* service_provider_impl) override {
     if (IsDebug(service_provider_impl->connection_context().connection_url)) {
       service_provider_impl->AddService<mojo::ContentHandler>(
@@ -243,7 +242,8 @@
 }  // namespace services
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(
-      new services::python::content_handler::PythonContentHandlerApp());
-  return runner.Run(application_request);
+  services::python::content_handler::PythonContentHandlerApp
+      python_content_handler_app;
+  return mojo::RunMainApplication(application_request,
+                                  &python_content_handler_app);
 }
diff --git a/services/tracing/main.cc b/services/tracing/main.cc
index 76506d7..2c9ca06 100644
--- a/services/tracing/main.cc
+++ b/services/tracing/main.cc
@@ -2,11 +2,11 @@
 // 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/public/c/system/main.h"
+#include "mojo/public/cpp/application/run_application.h"
 #include "services/tracing/tracing_app.h"
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(new tracing::TracingApp);
-  return runner.Run(application_request);
+  tracing::TracingApp tracing_app;
+  return mojo::RunMainApplication(application_request, &tracing_app);
 }
diff --git a/services/tracing/tracing_app.cc b/services/tracing/tracing_app.cc
index c1dead0..68c91b8 100644
--- a/services/tracing/tracing_app.cc
+++ b/services/tracing/tracing_app.cc
@@ -7,6 +7,7 @@
 #include "base/bind.h"
 #include "base/logging.h"
 #include "base/message_loop/message_loop.h"
+#include "mojo/public/cpp/application/service_provider_impl.h"
 #include "mojo/public/cpp/system/wait.h"
 
 namespace tracing {
@@ -15,7 +16,7 @@
 
 TracingApp::~TracingApp() {}
 
-bool TracingApp::ConfigureIncomingConnection(
+bool TracingApp::OnAcceptConnection(
     mojo::ServiceProviderImpl* service_provider_impl) {
   service_provider_impl->AddService<TraceCollector>(
       [this](const mojo::ConnectionContext& connection_context,
diff --git a/services/tracing/tracing_app.h b/services/tracing/tracing_app.h
index d6a2b3b..e60fb35 100644
--- a/services/tracing/tracing_app.h
+++ b/services/tracing/tracing_app.h
@@ -10,8 +10,7 @@
 #include "base/memory/scoped_vector.h"
 #include "mojo/common/binding_set.h"
 #include "mojo/common/interface_ptr_set.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/bindings/strong_binding.h"
 #include "mojo/services/tracing/interfaces/trace_provider_registry.mojom.h"
 #include "mojo/services/tracing/interfaces/tracing.mojom.h"
@@ -20,7 +19,7 @@
 
 namespace tracing {
 
-class TracingApp : public mojo::ApplicationDelegate,
+class TracingApp : public mojo::ApplicationImplBase,
                    public TraceCollector,
                    public TraceProviderRegistry {
  public:
@@ -28,8 +27,8 @@
   ~TracingApp() override;
 
  private:
-  // mojo::ApplicationDelegate implementation.
-  bool ConfigureIncomingConnection(
+  // mojo::ApplicationImplBase override.
+  bool OnAcceptConnection(
       mojo::ServiceProviderImpl* service_provider_impl) override;
 
   // TraceCollector implementation.