Make ApplicationTestBase not use ApplicationImpl.

It didn't have much reason to.

This allows us to make ApplicationImpl's Application implementation
private.

My plan:
* Factor out the guts of ApplicationImpl to a new class called
  ApplicationImplBase, which would have a bunch of (possibly pure)
  virtual methods meant to be overridden. (I'd mark methods not meant to
  be overridden as |final|.)
* ApplicationImpl would (temporarily?) remain, implementing these
  methods by calling out to ApplicationDelegate.
* Convert code to just subclassing/implementing ApplicationImplBase,
  instead of ApplicationDelegate (and instantiating that class, instead
  of ApplicationImpl + their delegate).
* Once no one uses ApplicationImpl/ApplicationDelegate anymore, we can
  remove them.

R=vardhan@google.com

Review URL: https://codereview.chromium.org/1990603002 .
diff --git a/examples/apptest/example_apptest.cc b/examples/apptest/example_apptest.cc
index 2de4515..30847b9 100644
--- a/examples/apptest/example_apptest.cc
+++ b/examples/apptest/example_apptest.cc
@@ -2,8 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include <algorithm>
+
 #include "examples/apptest/example_service.mojom.h"
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/application/application_test_base.h"
 #include "mojo/public/cpp/application/connect.h"
 #include "mojo/public/cpp/bindings/callback.h"
@@ -24,7 +25,7 @@
   void SetUp() override {
     ApplicationTestBase::SetUp();
 
-    ConnectToService(application_impl()->shell(), "mojo:example_service",
+    ConnectToService(shell(), "mojo:example_service",
                      GetProxy(&example_service_));
   }
 
@@ -45,7 +46,8 @@
 
 TEST_F(ExampleApplicationTest, CheckCommandLineArg) {
   // Ensure the test runner passes along this example command line argument.
-  ASSERT_TRUE(application_impl()->HasArg("--example_apptest_arg"));
+  ASSERT_TRUE(std::find(args().begin(), args().end(),
+                        "--example_apptest_arg") != args().end());
 }
 
 }  // namespace
diff --git a/mojo/file_utils/file_util_unittest.cc b/mojo/file_utils/file_util_unittest.cc
index d3f6cfc..89afc45 100644
--- a/mojo/file_utils/file_util_unittest.cc
+++ b/mojo/file_utils/file_util_unittest.cc
@@ -9,7 +9,6 @@
 #include <vector>
 
 #include "mojo/file_utils/file_util.h"
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/application/application_test_base.h"
 #include "mojo/public/cpp/application/connect.h"
 #include "mojo/public/cpp/bindings/synchronous_interface_ptr.h"
@@ -93,8 +92,7 @@
 
 TEST_F(FileUtilTest, BasicCreateTemporaryFile) {
   mojo::SynchronousInterfacePtr<mojo::files::Files> files;
-  mojo::ConnectToService(application_impl()->shell(), "mojo:files",
-                         GetSynchronousProxy(&files));
+  mojo::ConnectToService(shell(), "mojo:files", GetSynchronousProxy(&files));
 
   mojo::files::Error error = mojo::files::Error::INTERNAL;
   mojo::SynchronousInterfacePtr<mojo::files::Directory> directory;
diff --git a/mojo/public/cpp/application/application_impl.h b/mojo/public/cpp/application/application_impl.h
index 68dc565..2621daa 100644
--- a/mojo/public/cpp/application/application_impl.h
+++ b/mojo/public/cpp/application/application_impl.h
@@ -44,8 +44,7 @@
   static void Terminate();
 
   // The Mojo shell. This will return a valid pointer after Initialize() has
-  // been invoked. It will remain valid until UnbindConnections() is invoked or
-  // the ApplicationImpl is destroyed.
+  // been invoked. It will remain valid until this object is destroyed.
   Shell* shell() const { return shell_.get(); }
 
   const std::string& url() const { return url_; }
@@ -54,16 +53,7 @@
   const std::vector<std::string>& args() const { return args_; }
   bool HasArg(const std::string& arg) const;
 
-  // Blocks until the |Application| is initialized (i.e., |Initialize()| is
-  // received), if it is not already.
-  void WaitForInitialize();
-
-  // Unbinds the Shell and Application connections. Can be used to re-bind the
-  // handles to another implementation of ApplicationImpl, for instance when
-  // running apptests.
-  void UnbindConnections(InterfaceRequest<Application>* application_request,
-                         ShellPtr* shell);
-
+ private:
   // |Application| implementation.
   void Initialize(InterfaceHandle<Shell> shell,
                   Array<String> args,
@@ -74,7 +64,6 @@
                         const String& url) override;
   void RequestQuit() override;
 
- private:
   std::vector<std::unique_ptr<ServiceProviderImpl>> service_provider_impls_;
   ApplicationDelegate* delegate_;
   Binding<Application> application_binding_;
diff --git a/mojo/public/cpp/application/application_test_base.h b/mojo/public/cpp/application/application_test_base.h
index eb98b85..a81119e 100644
--- a/mojo/public/cpp/application/application_test_base.h
+++ b/mojo/public/cpp/application/application_test_base.h
@@ -5,22 +5,19 @@
 #ifndef MOJO_PUBLIC_CPP_APPLICATION_APPLICATION_TEST_BASE_H_
 #define MOJO_PUBLIC_CPP_APPLICATION_APPLICATION_TEST_BASE_H_
 
-#include "mojo/public/cpp/application/application_delegate.h"
+#include <string>
+#include <vector>
+
 #include "mojo/public/cpp/bindings/array.h"
 #include "mojo/public/cpp/bindings/string.h"
 #include "mojo/public/cpp/system/macros.h"
 #include "mojo/public/interfaces/application/application.mojom.h"
+#include "mojo/public/interfaces/application/shell.mojom.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace mojo {
-
-class ApplicationImpl;
-
 namespace test {
 
-// Access the command line arguments passed to the application test.
-const Array<String>& Args();
-
 // Run all application tests. This must be called after the environment is
 // initialized, to support construction of a default run loop.
 MojoResult RunAllTests(MojoHandle application_request_handle);
@@ -32,12 +29,8 @@
   ~ApplicationTestBase() override;
 
  protected:
-  // TODO(vtl): Probably should get rid of this. There's really not much reason
-  // to have an |ApplicationImpl|.
-  ApplicationImpl* application_impl() { return application_impl_; }
-
-  // Get the ApplicationDelegate for the application to be tested.
-  virtual ApplicationDelegate* GetApplicationDelegate();
+  Shell* shell() const { return shell_.get(); }
+  const std::vector<std::string>& args() const { return args_; }
 
   // testing::Test:
   void SetUp() override;
@@ -49,16 +42,13 @@
   virtual bool ShouldCreateDefaultRunLoop();
 
  private:
-  // The application implementation instance, reconstructed for each test.
-  ApplicationImpl* application_impl_;
-  // The application delegate used if GetApplicationDelegate is not overridden.
-  ApplicationDelegate default_application_delegate_;
+  ShellPtr shell_;
+  std::vector<std::string> args_;
 
   MOJO_DISALLOW_COPY_AND_ASSIGN(ApplicationTestBase);
 };
 
 }  // namespace test
-
 }  // namespace mojo
 
 #endif  // MOJO_PUBLIC_CPP_APPLICATION_APPLICATION_TEST_BASE_H_
diff --git a/mojo/public/cpp/application/lib/application_impl.cc b/mojo/public/cpp/application/lib/application_impl.cc
index 42ebb8c..6be42ff 100644
--- a/mojo/public/cpp/application/lib/application_impl.cc
+++ b/mojo/public/cpp/application/lib/application_impl.cc
@@ -25,18 +25,6 @@
   return std::find(args_.begin(), args_.end(), arg) != args_.end();
 }
 
-void ApplicationImpl::WaitForInitialize() {
-  if (!shell_)
-    application_binding_.WaitForIncomingMethodCall();
-}
-
-void ApplicationImpl::UnbindConnections(
-    InterfaceRequest<Application>* application_request,
-    ShellPtr* shell) {
-  *application_request = application_binding_.Unbind();
-  shell->Bind(shell_.PassInterfaceHandle());
-}
-
 void ApplicationImpl::Initialize(InterfaceHandle<Shell> shell,
                                  Array<String> args,
                                  const mojo::String& url) {
diff --git a/mojo/public/cpp/application/lib/application_test_base.cc b/mojo/public/cpp/application/lib/application_test_base.cc
index f316daa..26811c4 100644
--- a/mojo/public/cpp/application/lib/application_test_base.cc
+++ b/mojo/public/cpp/application/lib/application_test_base.cc
@@ -6,7 +6,6 @@
 
 #include <utility>
 
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/public/cpp/environment/environment.h"
 #include "mojo/public/cpp/system/message_pipe.h"
@@ -77,10 +76,6 @@
 
 }  // namespace
 
-const Array<String>& Args() {
-  return g_args;
-}
-
 MojoResult RunAllTests(MojoHandle application_request_handle) {
   {
     // This loop is used for init, and then destroyed before running tests.
@@ -124,15 +119,9 @@
   return (result == 0) ? MOJO_RESULT_OK : MOJO_RESULT_UNKNOWN;
 }
 
-ApplicationTestBase::ApplicationTestBase() : application_impl_(nullptr) {
-}
+ApplicationTestBase::ApplicationTestBase() {}
 
-ApplicationTestBase::~ApplicationTestBase() {
-}
-
-ApplicationDelegate* ApplicationTestBase::GetApplicationDelegate() {
-  return &default_application_delegate_;
-}
+ApplicationTestBase::~ApplicationTestBase() {}
 
 void ApplicationTestBase::SetUp() {
   // A run loop is recommended for ApplicationImpl initialization and
@@ -142,21 +131,22 @@
 
   MOJO_CHECK(g_application_request.is_pending());
   MOJO_CHECK(g_shell);
+  MOJO_CHECK(args_.empty());
 
-  // New applications are constructed for each test to avoid persisting state.
-  application_impl_ = new ApplicationImpl(GetApplicationDelegate(),
-                                          g_application_request.Pass());
-
-  // Fake application initialization with the given command line arguments.
-  application_impl_->Initialize(g_shell.Pass(), g_args.Clone(), g_url);
+  shell_ = g_shell.Pass();
+  for (size_t i = 0; i < g_args.size(); i++)
+    args_.push_back(g_args[i]);
 }
 
 void ApplicationTestBase::TearDown() {
-  MOJO_CHECK(!g_application_request.is_pending());
   MOJO_CHECK(!g_shell);
 
-  application_impl_->UnbindConnections(&g_application_request, &g_shell);
-  delete application_impl_;
+  // TODO(vtl): The straightforward |g_shell = shell_.Pass();| causes tests to
+  // hang. Presumably, it's because there are still requests to the shell
+  // pending. :-(
+  g_shell.Bind(shell_.PassInterfaceHandle());
+  args_.clear();
+
   if (ShouldCreateDefaultRunLoop())
     Environment::DestroyDefaultRunLoop();
 }
diff --git a/mojo/public/cpp/bindings/tests/versioning_apptest.cc b/mojo/public/cpp/bindings/tests/versioning_apptest.cc
index c0c38b5..2a74873 100644
--- a/mojo/public/cpp/bindings/tests/versioning_apptest.cc
+++ b/mojo/public/cpp/bindings/tests/versioning_apptest.cc
@@ -2,7 +2,6 @@
 // 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/application_impl.h"
 #include "mojo/public/cpp/application/application_test_base.h"
 #include "mojo/public/cpp/application/connect.h"
 #include "mojo/public/cpp/system/macros.h"
@@ -22,8 +21,8 @@
   void SetUp() override {
     ApplicationTestBase::SetUp();
 
-    ConnectToService(application_impl()->shell(),
-                     "mojo:versioning_test_service", GetProxy(&database_));
+    ConnectToService(shell(), "mojo:versioning_test_service",
+                     GetProxy(&database_));
   }
 
   HumanResourceDatabasePtr database_;
diff --git a/mojo/services/files/c/tests/mojio_impl_test_base.cc b/mojo/services/files/c/tests/mojio_impl_test_base.cc
index 96abd9f..3b345ee 100644
--- a/mojo/services/files/c/tests/mojio_impl_test_base.cc
+++ b/mojo/services/files/c/tests/mojio_impl_test_base.cc
@@ -6,7 +6,6 @@
 
 #include "files/interfaces/files.mojom-sync.h"
 #include "files/interfaces/files.mojom.h"
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/application/connect.h"
 #include "mojo/public/cpp/bindings/interface_request.h"
 #include "mojo/public/cpp/bindings/synchronous_interface_ptr.h"
@@ -27,8 +26,7 @@
   mojo::test::ApplicationTestBase::SetUp();
 
   SynchronousInterfacePtr<mojo::files::Files> files;
-  mojo::ConnectToService(application_impl()->shell(), "mojo:files",
-                         GetSynchronousProxy(&files));
+  mojo::ConnectToService(shell(), "mojo:files", GetSynchronousProxy(&files));
 
   mojo::files::Error error = mojo::files::Error::INTERNAL;
   MOJO_CHECK(
diff --git a/mojo/ui/gl_renderer_apptest.cc b/mojo/ui/gl_renderer_apptest.cc
index 03e799b..863b22f 100644
--- a/mojo/ui/gl_renderer_apptest.cc
+++ b/mojo/ui/gl_renderer_apptest.cc
@@ -6,7 +6,6 @@
 #include "base/message_loop/message_loop.h"
 #include "mojo/gpu/gl_context.h"
 #include "mojo/gpu/gl_texture.h"
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/application/application_test_base.h"
 #include "mojo/public/cpp/application/connect.h"
 #include "mojo/services/geometry/interfaces/geometry.mojom.h"
@@ -30,7 +29,7 @@
     mojo::test::ApplicationTestBase::SetUp();
     gl_context_ = mojo::GLContext::CreateOffscreen(
         mojo::ApplicationConnectorPtr::Create(
-            mojo::CreateApplicationConnector(application_impl()->shell()))
+            mojo::CreateApplicationConnector(shell()))
             .get());
     quit_message_loop_callback_ = base::Bind(
         &GLRendererTest::QuitMessageLoopCallback, weak_factory_.GetWeakPtr());
diff --git a/services/asset_bundle/asset_bundle_apptest.cc b/services/asset_bundle/asset_bundle_apptest.cc
index de2e58b..4a9cc51 100644
--- a/services/asset_bundle/asset_bundle_apptest.cc
+++ b/services/asset_bundle/asset_bundle_apptest.cc
@@ -8,7 +8,6 @@
 #include "base/files/scoped_temp_dir.h"
 #include "base/run_loop.h"
 #include "mojo/data_pipe_utils/data_pipe_utils.h"
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/application/application_test_base.h"
 #include "mojo/public/cpp/application/connect.h"
 #include "mojo/services/asset_bundle/interfaces/asset_bundle.mojom.h"
@@ -23,7 +22,7 @@
 
   void SetUp() override {
     mojo::test::ApplicationTestBase::SetUp();
-    mojo::ConnectToService(application_impl()->shell(), "mojo:asset_bundle",
+    mojo::ConnectToService(shell(), "mojo:asset_bundle",
                            GetProxy(&asset_unpacker_));
   }
 
diff --git a/services/authenticating_url_loader_interceptor/authenticating_url_loader_interceptor_apptest.cc b/services/authenticating_url_loader_interceptor/authenticating_url_loader_interceptor_apptest.cc
index b04cc90..2a30794 100644
--- a/services/authenticating_url_loader_interceptor/authenticating_url_loader_interceptor_apptest.cc
+++ b/services/authenticating_url_loader_interceptor/authenticating_url_loader_interceptor_apptest.cc
@@ -9,7 +9,6 @@
 #include "base/run_loop.h"
 #include "base/strings/string_split.h"
 #include "base/strings/stringprintf.h"
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/application/application_test_base.h"
 #include "mojo/public/cpp/application/connect.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
@@ -290,8 +289,7 @@
     ApplicationTestBase::SetUp();
 
     InitializeNetworkService();
-    ConnectToService(application_impl()->shell(),
-                     "mojo:authenticating_url_loader_interceptor",
+    ConnectToService(shell(), "mojo:authenticating_url_loader_interceptor",
                      GetProxy(&interceptor_meta_factory_));
   }
 
@@ -341,7 +339,7 @@
 
   void InitializeNetworkService() {
     network_service_.reset();
-    mojo::ConnectToService(application_impl()->shell(), "mojo:network_service",
+    mojo::ConnectToService(shell(), "mojo:network_service",
                            GetProxy(&network_service_));
   }
 
diff --git a/services/authentication/accounts_db_manager_unittest.cc b/services/authentication/accounts_db_manager_unittest.cc
index cb483e0..1d189bc 100644
--- a/services/authentication/accounts_db_manager_unittest.cc
+++ b/services/authentication/accounts_db_manager_unittest.cc
@@ -6,7 +6,6 @@
 
 #include "base/logging.h"
 #include "base/strings/string_tokenizer.h"
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/application/application_test_base.h"
 #include "mojo/public/cpp/application/connect.h"
 #include "mojo/services/files/interfaces/types.mojom.h"
@@ -25,8 +24,7 @@
   void SetUp() override {
     mojo::test::ApplicationTestBase::SetUp();
     mojo::files::FilesPtr files;
-    mojo::ConnectToService(application_impl()->shell(), "mojo:files",
-                           GetProxy(&files));
+    mojo::ConnectToService(shell(), "mojo:files", GetProxy(&files));
 
     mojo::files::Error error = mojo::files::Error::INTERNAL;
     mojo::files::DirectoryPtr directory;
diff --git a/services/clipboard/clipboard_apptest.cc b/services/clipboard/clipboard_apptest.cc
index 999f779..fbaf59f 100644
--- a/services/clipboard/clipboard_apptest.cc
+++ b/services/clipboard/clipboard_apptest.cc
@@ -5,7 +5,6 @@
 #include "base/bind.h"
 #include "base/run_loop.h"
 #include "mojo/converters/array_string/array_string_type_converters.h"
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/application/application_test_base.h"
 #include "mojo/public/cpp/application/connect.h"
 #include "mojo/services/clipboard/interfaces/clipboard.mojom.h"
@@ -55,8 +54,7 @@
 
   void SetUp() override {
     mojo::test::ApplicationTestBase::SetUp();
-    mojo::ConnectToService(application_impl()->shell(), "mojo:clipboard",
-                           GetProxy(&clipboard_));
+    mojo::ConnectToService(shell(), "mojo:clipboard", GetProxy(&clipboard_));
   }
 
   uint64_t GetSequenceNumber() {
diff --git a/services/contacts/contacts_apptest.cc b/services/contacts/contacts_apptest.cc
index 4a3cba2..477da47 100644
--- a/services/contacts/contacts_apptest.cc
+++ b/services/contacts/contacts_apptest.cc
@@ -3,7 +3,6 @@
 // found in the LICENSE file.
 
 #include "base/run_loop.h"
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/application/application_test_base.h"
 #include "mojo/public/cpp/application/connect.h"
 #include "mojo/services/contacts/interfaces/contacts.mojom.h"
@@ -17,7 +16,7 @@
 
   void SetUp() override {
     mojo::test::ApplicationTestBase::SetUp();
-    mojo::ConnectToService(application_impl()->shell(), "mojo:contacts",
+    mojo::ConnectToService(shell(), "mojo:contacts",
                            GetProxy(&contacts_service_));
   }
 
diff --git a/services/files/files_test_base.cc b/services/files/files_test_base.cc
index 87ac709..f4ff3ae 100644
--- a/services/files/files_test_base.cc
+++ b/services/files/files_test_base.cc
@@ -4,7 +4,6 @@
 
 #include "services/files/files_test_base.h"
 
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/application/connect.h"
 #include "mojo/services/files/interfaces/files.mojom.h"
 #include "mojo/services/files/interfaces/types.mojom.h"
@@ -18,8 +17,7 @@
 
 void FilesTestBase::SetUp() {
   test::ApplicationTestBase::SetUp();
-  ConnectToService(application_impl()->shell(), "mojo:files",
-                   GetSynchronousProxy(&files_));
+  ConnectToService(shell(), "mojo:files", GetSynchronousProxy(&files_));
 }
 
 void FilesTestBase::GetTemporaryRoot(
diff --git a/services/http_server/http_server_apptest.cc b/services/http_server/http_server_apptest.cc
index 80c3795..f527425 100644
--- a/services/http_server/http_server_apptest.cc
+++ b/services/http_server/http_server_apptest.cc
@@ -6,9 +6,9 @@
 #include "base/run_loop.h"
 #include "base/strings/stringprintf.h"
 #include "mojo/data_pipe_utils/data_pipe_utils.h"
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/application/application_test_base.h"
 #include "mojo/public/cpp/application/connect.h"
+#include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/public/cpp/bindings/synchronous_interface_ptr.h"
 #include "mojo/public/cpp/system/macros.h"
 #include "mojo/services/http_server/cpp/http_server_util.h"
@@ -101,9 +101,9 @@
   void SetUp() override {
     ApplicationTestBase::SetUp();
 
-    mojo::ConnectToService(application_impl()->shell(), "mojo:http_server",
+    mojo::ConnectToService(shell(), "mojo:http_server",
                            GetProxy(&http_server_factory_));
-    mojo::ConnectToService(application_impl()->shell(), "mojo:network_service",
+    mojo::ConnectToService(shell(), "mojo:network_service",
                            GetProxy(&network_service_));
   }
 
diff --git a/services/js/echo_apptest.cc b/services/js/echo_apptest.cc
index 9d7f343..17ae847 100644
--- a/services/js/echo_apptest.cc
+++ b/services/js/echo_apptest.cc
@@ -22,8 +22,7 @@
   void SetUp() override {
     ApplicationTestBase::SetUp();
     const std::string& url = JSAppURL("echo.js");
-    mojo::ConnectToService(application_impl()->shell(), url,
-                           GetSynchronousProxy(&echo_service_));
+    mojo::ConnectToService(shell(), url, GetSynchronousProxy(&echo_service_));
   }
 
   mojo::SynchronousInterfacePtr<mojo::EchoService> echo_service_;
@@ -42,8 +41,8 @@
   void SetUp() override {
     ApplicationTestBase::SetUp();
     const std::string& url = JSAppURL("echo.js");
-    application_impl()->shell()->ConnectToApplication(
-        url, GetProxy(&echo_service_provider_), nullptr);
+    shell()->ConnectToApplication(url, GetProxy(&echo_service_provider_),
+                                  nullptr);
   }
 
   mojo::ServiceProviderPtr echo_service_provider_;
diff --git a/services/js/network_apptest.cc b/services/js/network_apptest.cc
index 961a707..d6e0af1 100644
--- a/services/js/network_apptest.cc
+++ b/services/js/network_apptest.cc
@@ -20,8 +20,7 @@
   void SetUp() override {
     ApplicationTestBase::SetUp();
     const std::string& url = JSAppURL("network_test.js");
-    mojo::ConnectToService(application_impl()->shell(), url,
-                           GetProxy(&network_test_service_));
+    mojo::ConnectToService(shell(), url, GetProxy(&network_test_service_));
   }
 
   NetworkTestServicePtr network_test_service_;
diff --git a/services/js/pingpong_apptest.cc b/services/js/pingpong_apptest.cc
index f2fe971..d76e055 100644
--- a/services/js/pingpong_apptest.cc
+++ b/services/js/pingpong_apptest.cc
@@ -46,8 +46,7 @@
   void SetUp() override {
     ApplicationTestBase::SetUp();
     const std::string& url = JSAppURL("pingpong.js");
-    mojo::ConnectToService(application_impl()->shell(), url,
-                           GetProxy(&pingpong_service_));
+    mojo::ConnectToService(shell(), url, GetProxy(&pingpong_service_));
     PingPongClientPtr client_ptr;
     pingpong_client_.Bind(GetProxy(&client_ptr));
     pingpong_service_->SetClient(client_ptr.Pass());
@@ -94,8 +93,8 @@
 // pingpong-target.js URL, we provide a connection to its PingPongService.
 TEST_F(JSPingPongTest, PingTargetService) {
   PingPongServicePtr target;
-  mojo::ConnectToService(application_impl()->shell(),
-                         JSAppURL("pingpong_target.js"), GetProxy(&target));
+  mojo::ConnectToService(shell(), JSAppURL("pingpong_target.js"),
+                         GetProxy(&target));
   bool returned_value = false;
   PingTargetCallback callback(&returned_value);
   pingpong_service_->PingTargetService(target.Pass(), 9, callback);
diff --git a/services/native_support/process_test_base.cc b/services/native_support/process_test_base.cc
index 31d8d63..c39daed 100644
--- a/services/native_support/process_test_base.cc
+++ b/services/native_support/process_test_base.cc
@@ -4,7 +4,6 @@
 
 #include "services/native_support/process_test_base.h"
 
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/application/connect.h"
 #include "mojo/services/native_support/interfaces/process.mojom.h"
 
@@ -18,7 +17,7 @@
 
 void ProcessTestBase::SetUp() {
   mojo::test::ApplicationTestBase::SetUp();
-  mojo::ConnectToService(application_impl()->shell(), "mojo:native_support",
+  mojo::ConnectToService(shell(), "mojo:native_support",
                          GetSynchronousProxy(&process_));
 }
 
diff --git a/services/notifications/apptests/notifications_apptest.cc b/services/notifications/apptests/notifications_apptest.cc
index dc41dd1..d61fd63 100644
--- a/services/notifications/apptests/notifications_apptest.cc
+++ b/services/notifications/apptests/notifications_apptest.cc
@@ -4,7 +4,6 @@
 
 #include "base/bind.h"
 #include "base/message_loop/message_loop.h"
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/application/application_test_base.h"
 #include "mojo/public/cpp/application/connect.h"
 #include "mojo/public/cpp/bindings/callback.h"
@@ -31,7 +30,7 @@
   // ApplicationTestBase:
   void SetUp() override {
     ApplicationTestBase::SetUp();
-    ConnectToService(application_impl()->shell(), "mojo:notifications",
+    ConnectToService(shell(), "mojo:notifications",
                      GetProxy(&notification_service_));
   }
 
diff --git a/services/prediction/prediction_apptests.cc b/services/prediction/prediction_apptests.cc
index 8d1b7bc..e739d26 100644
--- a/services/prediction/prediction_apptests.cc
+++ b/services/prediction/prediction_apptests.cc
@@ -6,7 +6,6 @@
 
 #include "base/bind.h"
 #include "base/message_loop/message_loop.h"
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/application/application_test_base.h"
 #include "mojo/public/cpp/application/connect.h"
 #include "mojo/services/prediction/interfaces/prediction.mojom.h"
@@ -27,8 +26,8 @@
 
   void SetUp() override {
     mojo::test::ApplicationTestBase::SetUp();
-    mojo::ConnectToService(application_impl()->shell(),
-                           "mojo:prediction_service", GetProxy(&prediction_));
+    mojo::ConnectToService(shell(), "mojo:prediction_service",
+                           GetProxy(&prediction_));
   }
 
   std::vector<std::string> GetPredictionListClient(
diff --git a/services/python/mojo_url_redirector/mojo_url_redirector_apptest.cc b/services/python/mojo_url_redirector/mojo_url_redirector_apptest.cc
index 905464c..5e8e7b7 100644
--- a/services/python/mojo_url_redirector/mojo_url_redirector_apptest.cc
+++ b/services/python/mojo_url_redirector/mojo_url_redirector_apptest.cc
@@ -8,9 +8,9 @@
 #include "base/strings/string_split.h"
 #include "base/strings/stringprintf.h"
 #include "mojo/data_pipe_utils/data_pipe_utils.h"
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/application/application_test_base.h"
 #include "mojo/public/cpp/application/connect.h"
+#include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/public/cpp/bindings/interface_handle.h"
 #include "mojo/public/interfaces/application/service_provider.mojom.h"
 #include "mojo/services/http_server/cpp/http_server_util.h"
@@ -84,7 +84,7 @@
     // Obtain the port that the redirector is at and the port that we should
     // spin up the app location files server at.
     uint16_t app_location_files_port = 0;
-    for (const std::string& arg : application_impl()->args()) {
+    for (const std::string& arg : args()) {
       if (arg.find("--redirector_port") != std::string::npos) {
         sscanf(arg.c_str(), "--redirector_port=%hu", &redirector_port_);
       } else if (arg.find("--app_location_files_port") != std::string::npos) {
@@ -100,7 +100,7 @@
     binding_.Bind(GetProxy(&location_files_handler));
 
     http_server::HttpServerFactoryPtr http_server_factory;
-    mojo::ConnectToService(application_impl()->shell(), "mojo:http_server",
+    mojo::ConnectToService(shell(), "mojo:http_server",
                            GetProxy(&http_server_factory));
 
     mojo::NetAddressPtr location_files_server_addr(mojo::NetAddress::New());
@@ -125,9 +125,9 @@
 
     // Connect to the redirector and wait until it registers itself as a
     // handler with the server on |redirector_port_|.
-    application_impl()->shell()->ConnectToApplication(
-        "mojo:mojo_url_redirector", GetProxy(&url_redirector_sp_), nullptr);
-    mojo::ConnectToService(application_impl()->shell(), "mojo:network_service",
+    shell()->ConnectToApplication("mojo:mojo_url_redirector",
+                                  GetProxy(&url_redirector_sp_), nullptr);
+    mojo::ConnectToService(shell(), "mojo:network_service",
                            GetProxy(&network_service_));
     WaitForRedirectorRegistration();
   }
diff --git a/services/url_response_disk_cache/url_response_disk_cache_apptest.cc b/services/url_response_disk_cache/url_response_disk_cache_apptest.cc
index adf7763..05db159 100644
--- a/services/url_response_disk_cache/url_response_disk_cache_apptest.cc
+++ b/services/url_response_disk_cache/url_response_disk_cache_apptest.cc
@@ -6,7 +6,6 @@
 #include "base/rand_util.h"
 #include "base/run_loop.h"
 #include "base/strings/stringprintf.h"
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/application/application_test_base.h"
 #include "mojo/public/cpp/application/connect.h"
 #include "mojo/public/cpp/system/data_pipe.h"
@@ -25,8 +24,7 @@
 
   void SetUp() override {
     test::ApplicationTestBase::SetUp();
-    ConnectToService(application_impl()->shell(),
-                     "mojo:url_response_disk_cache",
+    ConnectToService(shell(), "mojo:url_response_disk_cache",
                      GetProxy(&url_response_disk_cache_));
   }
 
diff --git a/shell/android/nfc_apptest.cc b/shell/android/nfc_apptest.cc
index 797ae68..e4c6420 100644
--- a/shell/android/nfc_apptest.cc
+++ b/shell/android/nfc_apptest.cc
@@ -4,7 +4,6 @@
 
 #include "base/bind.h"
 #include "base/message_loop/message_loop.h"
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/application/application_test_base.h"
 #include "mojo/public/cpp/application/connect.h"
 #include "mojo/public/cpp/bindings/callback.h"
@@ -27,7 +26,7 @@
   // ApplicationTestBase:
   void SetUp() override {
     ApplicationTestBase::SetUp();
-    ConnectToService(application_impl()->shell(), "mojo:nfc", GetProxy(&nfc_));
+    ConnectToService(shell(), "mojo:nfc", GetProxy(&nfc_));
   }
 
   nfc::NfcPtr nfc_;
diff --git a/shell/shell_apptest.cc b/shell/shell_apptest.cc
index 42a5547..b35db42 100644
--- a/shell/shell_apptest.cc
+++ b/shell/shell_apptest.cc
@@ -12,9 +12,9 @@
 #include "base/strings/stringprintf.h"
 #include "mojo/converters/base/base_type_converters.h"
 #include "mojo/data_pipe_utils/data_pipe_utils.h"
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/application/application_test_base.h"
 #include "mojo/public/cpp/application/connect.h"
+#include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/public/cpp/bindings/synchronous_interface_ptr.h"
 #include "mojo/public/cpp/system/macros.h"
 #include "mojo/public/interfaces/application/application_connector.mojom.h"
@@ -81,7 +81,7 @@
   void SetUp() override {
     ShellAppTest::SetUp();
 
-    mojo::ConnectToService(application_impl()->shell(), "mojo:http_server",
+    mojo::ConnectToService(shell(), "mojo:http_server",
                            GetProxy(&http_server_factory_));
 
     mojo::NetAddressPtr local_address(mojo::NetAddress::New());
@@ -119,8 +119,7 @@
 // Test that we can load apps over http.
 TEST_F(ShellHTTPAppTest, Http) {
   PingablePtr pingable;
-  mojo::ConnectToService(application_impl()->shell(), GetURL("app"),
-                         GetProxy(&pingable));
+  mojo::ConnectToService(shell(), GetURL("app"), GetProxy(&pingable));
   pingable->Ping("hello",
                  [this](const String& app_url, const String& connection_url,
                         const String& message) {
@@ -136,8 +135,7 @@
 // TODO(aa): Test that apps receive the correct URL parameters.
 TEST_F(ShellHTTPAppTest, Redirect) {
   PingablePtr pingable;
-  mojo::ConnectToService(application_impl()->shell(), GetURL("redirect"),
-                         GetProxy(&pingable));
+  mojo::ConnectToService(shell(), GetURL("redirect"), GetProxy(&pingable));
   pingable->Ping("hello",
                  [this](const String& app_url, const String& connection_url,
                         const String& message) {
@@ -159,10 +157,8 @@
 TEST_F(ShellHTTPAppTest, MAYBE_QueryHandling) {
   PingablePtr pingable1;
   PingablePtr pingable2;
-  mojo::ConnectToService(application_impl()->shell(), GetURL("app?foo"),
-                         GetProxy(&pingable1));
-  mojo::ConnectToService(application_impl()->shell(), GetURL("app?bar"),
-                         GetProxy(&pingable2));
+  mojo::ConnectToService(shell(), GetURL("app?foo"), GetProxy(&pingable1));
+  mojo::ConnectToService(shell(), GetURL("app?bar"), GetProxy(&pingable2));
 
   int num_responses = 0;
   auto callbacks_builder = [this, &num_responses](int query_index) {
@@ -191,8 +187,7 @@
 // mojo: URLs can have querystrings too
 TEST_F(ShellAppTest, MojoURLQueryHandling) {
   PingablePtr pingable;
-  mojo::ConnectToService(application_impl()->shell(), "mojo:pingable_app?foo",
-                         GetProxy(&pingable));
+  mojo::ConnectToService(shell(), "mojo:pingable_app?foo", GetProxy(&pingable));
   auto callback = [](const String& app_url, const String& connection_url,
                      const String& message) {
     EXPECT_TRUE(base::EndsWith(app_url.To<base::StringPiece>(),
@@ -224,15 +219,13 @@
 
 TEST_F(ShellAppTest, ApplicationConnector) {
   mojo::ApplicationConnectorPtr app_connector;
-  app_connector.Bind(
-      mojo::CreateApplicationConnector(application_impl()->shell()));
+  app_connector.Bind(mojo::CreateApplicationConnector(shell()));
   TestApplicationConnector(app_connector.get());
 }
 
 TEST_F(ShellAppTest, ApplicationConnectorDuplicate) {
   mojo::ApplicationConnectorPtr app_connector1;
-  app_connector1.Bind(
-      mojo::CreateApplicationConnector(application_impl()->shell()));
+  app_connector1.Bind(mojo::CreateApplicationConnector(shell()));
   {
     SCOPED_TRACE("app_connector1");
     TestApplicationConnector(app_connector1.get());