Allow ApplicationTestBase clients to avoid a default MessageLoop.

Provides a means for overriding the creation of a default message
loop.  Such a loop is unnecessary for many tests and causes issues
with the bevy of existing chrome tests which expect to be able to
create their own message loop.

BUG=none
TEST=https://codereview.chromium.org/806443002/
R=msw@chromium.org, sky@chromium.org

Review URL: https://codereview.chromium.org/792463007
diff --git a/mojo/public/cpp/application/application_test_base.h b/mojo/public/cpp/application/application_test_base.h
index 04580c7..70ef9d6 100644
--- a/mojo/public/cpp/application/application_test_base.h
+++ b/mojo/public/cpp/application/application_test_base.h
@@ -45,6 +45,11 @@
   void SetUp() override;
   void TearDown() override;
 
+  // True by default, which indicates a MessageLoop will automatically be
+  // created for the application.  Tests may override this function to prevent
+  // a default loop from being created.
+  virtual bool ShouldCreateDefaultRunLoop();
+
  private:
   // The application implementation instance, reconstructed for each test.
   ApplicationImpl* application_impl_;
diff --git a/mojo/public/cpp/application/lib/application_test_base.cc b/mojo/public/cpp/application/lib/application_test_base.cc
index 93eb3d0..864289e 100644
--- a/mojo/public/cpp/application/lib/application_test_base.cc
+++ b/mojo/public/cpp/application/lib/application_test_base.cc
@@ -57,8 +57,10 @@
 }
 
 void ApplicationTestBase::SetUpWithArgs(const Array<String>& args) {
-  // A run loop is needed for ApplicationImpl initialization and communication.
-  Environment::InstantiateDefaultRunLoop();
+  // A run loop is recommended for ApplicationImpl initialization and
+  // communication.
+  if (ShouldCreateDefaultRunLoop())
+    Environment::InstantiateDefaultRunLoop();
 
   // New applications are constructed for each test to avoid persisting state.
   application_impl_ = new ApplicationImpl(GetApplicationDelegate(),
@@ -75,7 +77,12 @@
 void ApplicationTestBase::TearDown() {
   SetShellHandle(application_impl_->UnbindShell());
   delete application_impl_;
-  Environment::DestroyDefaultRunLoop();
+  if (ShouldCreateDefaultRunLoop())
+    Environment::DestroyDefaultRunLoop();
+}
+
+bool ApplicationTestBase::ShouldCreateDefaultRunLoop() {
+  return true;
 }
 
 }  // namespace test