Replace ApplicationImpl::CreateApplicationConnector() with a standalone helper function.

I want to hollow out ApplicationImpl.

Admittedly, even the standalone helper function adds little value over
just doing shell->CreateApplicationConnector(GetProxy(&foo)), though
it's nice in certain places to have a return value. (On the other hand,
you'll always get an InterfaceHandle, whereas you may have wanted an
InterfacePtr or SynchronousInterfacePtr.)

R=vardhan@google.com

Review URL: https://codereview.chromium.org/1983263002 .
diff --git a/examples/ui/noodles/noodles_view.cc b/examples/ui/noodles/noodles_view.cc
index 161794e..6c790a6 100644
--- a/examples/ui/noodles/noodles_view.cc
+++ b/examples/ui/noodles/noodles_view.cc
@@ -14,6 +14,7 @@
 #include "base/message_loop/message_loop.h"
 #include "examples/ui/noodles/frame.h"
 #include "examples/ui/noodles/rasterizer.h"
+#include "mojo/public/cpp/application/connect.h"
 #include "third_party/skia/include/core/SkCanvas.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "third_party/skia/include/core/SkPath.h"
@@ -65,10 +66,11 @@
 
   rasterizer_task_runner_->PostTask(
       FROM_HERE,
-      base::Bind(&RasterizerDelegate::CreateRasterizer,
-                 base::Unretained(rasterizer_delegate_.get()),
-                 base::Passed(app_impl->CreateApplicationConnector()),
-                 base::Passed(TakeScene().PassInterfaceHandle())));
+      base::Bind(
+          &RasterizerDelegate::CreateRasterizer,
+          base::Unretained(rasterizer_delegate_.get()),
+          base::Passed(mojo::CreateApplicationConnector(app_impl->shell())),
+          base::Passed(TakeScene().PassInterfaceHandle())));
 }
 
 NoodlesView::~NoodlesView() {
diff --git a/mojo/public/cpp/application/BUILD.gn b/mojo/public/cpp/application/BUILD.gn
index b2d0620..543207f 100644
--- a/mojo/public/cpp/application/BUILD.gn
+++ b/mojo/public/cpp/application/BUILD.gn
@@ -13,6 +13,7 @@
     "connection_context.h",
     "lib/application_delegate.cc",
     "lib/application_impl.cc",
+    "lib/connect.cc",
     "lib/service_provider_impl.cc",
     "service_connector.h",
     "service_provider_impl.h",
diff --git a/mojo/public/cpp/application/application_impl.h b/mojo/public/cpp/application/application_impl.h
index dd613f1..68dc565 100644
--- a/mojo/public/cpp/application/application_impl.h
+++ b/mojo/public/cpp/application/application_impl.h
@@ -12,7 +12,6 @@
 #include "mojo/public/cpp/application/application_delegate.h"
 #include "mojo/public/cpp/system/macros.h"
 #include "mojo/public/interfaces/application/application.mojom.h"
-#include "mojo/public/interfaces/application/application_connector.mojom.h"
 #include "mojo/public/interfaces/application/shell.mojom.h"
 
 namespace mojo {
@@ -55,12 +54,6 @@
   const std::vector<std::string>& args() const { return args_; }
   bool HasArg(const std::string& arg) const;
 
-  // Creates a new |ApplicationConnector|. The result can be bound to an
-  // |ApplicationConnectorPtr| and used to connect to other applications. (It
-  // returns an |InterfaceHandle| instead of an |InterfacePtr| to facilitate
-  // passing it to another thread.)
-  InterfaceHandle<ApplicationConnector> CreateApplicationConnector();
-
   // Blocks until the |Application| is initialized (i.e., |Initialize()| is
   // received), if it is not already.
   void WaitForInitialize();
@@ -84,7 +77,7 @@
  private:
   std::vector<std::unique_ptr<ServiceProviderImpl>> service_provider_impls_;
   ApplicationDelegate* delegate_;
-  Binding<Application> binding_;
+  Binding<Application> application_binding_;
   ShellPtr shell_;
   std::string url_;
   std::vector<std::string> args_;
diff --git a/mojo/public/cpp/application/application_test_base.h b/mojo/public/cpp/application/application_test_base.h
index 10763be..eb98b85 100644
--- a/mojo/public/cpp/application/application_test_base.h
+++ b/mojo/public/cpp/application/application_test_base.h
@@ -32,6 +32,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.
diff --git a/mojo/public/cpp/application/connect.h b/mojo/public/cpp/application/connect.h
index e9c0793..946ca7d 100644
--- a/mojo/public/cpp/application/connect.h
+++ b/mojo/public/cpp/application/connect.h
@@ -7,6 +7,7 @@
 #ifndef MOJO_PUBLIC_CPP_APPLICATION_CONNECT_H_
 #define MOJO_PUBLIC_CPP_APPLICATION_CONNECT_H_
 
+#include "mojo/public/cpp/bindings/interface_handle.h"
 #include "mojo/public/cpp/bindings/interface_request.h"
 #include "mojo/public/interfaces/application/application_connector.mojom.h"
 #include "mojo/public/interfaces/application/service_provider.mojom.h"
@@ -58,6 +59,10 @@
   ConnectToService(service_provider.get(), request.Pass());
 }
 
+// Helper for getting an |InterfaceHandle<ApplicationConnector>| (which can be
+// passed to any thread) from the shell.
+InterfaceHandle<ApplicationConnector> CreateApplicationConnector(Shell* shell);
+
 }  // namespace mojo
 
 #endif  // MOJO_PUBLIC_CPP_APPLICATION_CONNECT_H_
diff --git a/mojo/public/cpp/application/lib/application_impl.cc b/mojo/public/cpp/application/lib/application_impl.cc
index c87344b..42ebb8c 100644
--- a/mojo/public/cpp/application/lib/application_impl.cc
+++ b/mojo/public/cpp/application/lib/application_impl.cc
@@ -12,13 +12,12 @@
 #include "mojo/public/cpp/bindings/interface_ptr.h"
 #include "mojo/public/cpp/bindings/interface_request.h"
 #include "mojo/public/cpp/environment/logging.h"
-#include "mojo/public/cpp/system/message_pipe.h"
 
 namespace mojo {
 
 ApplicationImpl::ApplicationImpl(ApplicationDelegate* delegate,
                                  InterfaceRequest<Application> request)
-    : delegate_(delegate), binding_(this, request.Pass()) {}
+    : delegate_(delegate), application_binding_(this, request.Pass()) {}
 
 ApplicationImpl::~ApplicationImpl() {}
 
@@ -26,23 +25,15 @@
   return std::find(args_.begin(), args_.end(), arg) != args_.end();
 }
 
-InterfaceHandle<ApplicationConnector>
-ApplicationImpl::CreateApplicationConnector() {
-  MOJO_CHECK(shell_);
-  InterfaceHandle<ApplicationConnector> application_connector;
-  shell_->CreateApplicationConnector(GetProxy(&application_connector));
-  return application_connector;
-}
-
 void ApplicationImpl::WaitForInitialize() {
   if (!shell_)
-    binding_.WaitForIncomingMethodCall();
+    application_binding_.WaitForIncomingMethodCall();
 }
 
 void ApplicationImpl::UnbindConnections(
     InterfaceRequest<Application>* application_request,
     ShellPtr* shell) {
-  *application_request = binding_.Unbind();
+  *application_request = application_binding_.Unbind();
   shell->Bind(shell_.PassInterfaceHandle());
 }
 
diff --git a/mojo/public/cpp/application/lib/application_test_base.cc b/mojo/public/cpp/application/lib/application_test_base.cc
index 42519a2..f316daa 100644
--- a/mojo/public/cpp/application/lib/application_test_base.cc
+++ b/mojo/public/cpp/application/lib/application_test_base.cc
@@ -16,6 +16,7 @@
 namespace test {
 
 namespace {
+
 // Share the application command-line arguments with multiple application tests.
 Array<String> g_args;
 
@@ -31,11 +32,11 @@
 // calls so we can (re-)initialize new ApplicationImpls.
 ShellPtr g_shell;
 
-void InitializeArgs(int argc, std::vector<const char*> argv) {
+void InitializeArgs(int argc, const char** argv) {
   MOJO_CHECK(g_args.is_null());
-  for (const char* arg : argv) {
-    if (arg)
-      g_args.push_back(arg);
+  for (int i = 0; i < argc; i++) {
+    MOJO_CHECK(argv[i]);
+    g_args.push_back(argv[i]);
   }
 }
 
@@ -107,8 +108,9 @@
       argv[i] = args[i].get().c_str();
     argv[argc] = nullptr;
 
-    testing::InitGoogleTest(&argc, const_cast<char**>(&(argv[0])));
-    InitializeArgs(argc, argv);
+    // Note: |InitGoogleTest()| will modify |argc| and |argv[...]|.
+    testing::InitGoogleTest(&argc, const_cast<char**>(&argv[0]));
+    InitializeArgs(argc, &argv[0]);
 
     Environment::DestroyDefaultRunLoop();
   }
diff --git a/mojo/public/cpp/application/lib/connect.cc b/mojo/public/cpp/application/lib/connect.cc
new file mode 100644
index 0000000..33130da
--- /dev/null
+++ b/mojo/public/cpp/application/lib/connect.cc
@@ -0,0 +1,17 @@
+// 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/connect.h"
+
+#include "mojo/public/interfaces/application/shell.mojom.h"
+
+namespace mojo {
+
+InterfaceHandle<ApplicationConnector> CreateApplicationConnector(Shell* shell) {
+  InterfaceHandle<ApplicationConnector> application_connector;
+  shell->CreateApplicationConnector(GetProxy(&application_connector));
+  return application_connector;
+}
+
+}  // namespace mojo
diff --git a/mojo/ui/ganesh_view.cc b/mojo/ui/ganesh_view.cc
index 7dc9c7d..95b1170 100644
--- a/mojo/ui/ganesh_view.cc
+++ b/mojo/ui/ganesh_view.cc
@@ -5,6 +5,7 @@
 #include "mojo/ui/ganesh_view.h"
 
 #include "base/logging.h"
+#include "mojo/public/cpp/application/connect.h"
 #include "mojo/skia/ganesh_texture_surface.h"
 #include "third_party/skia/include/core/SkCanvas.h"
 
@@ -19,7 +20,7 @@
       ganesh_renderer_(
           new mojo::skia::GaneshContext(mojo::GLContext::CreateOffscreen(
               mojo::ApplicationConnectorPtr::Create(
-                  app_impl->CreateApplicationConnector())
+                  mojo::CreateApplicationConnector(app_impl->shell()))
                   .get()))) {}
 
 GaneshView::~GaneshView() {}
diff --git a/mojo/ui/gl_renderer_apptest.cc b/mojo/ui/gl_renderer_apptest.cc
index 21b1d72..03e799b 100644
--- a/mojo/ui/gl_renderer_apptest.cc
+++ b/mojo/ui/gl_renderer_apptest.cc
@@ -8,6 +8,7 @@
 #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"
 #include "mojo/services/gfx/composition/interfaces/resources.mojom.h"
 #include "mojo/ui/gl_renderer.h"
@@ -29,7 +30,7 @@
     mojo::test::ApplicationTestBase::SetUp();
     gl_context_ = mojo::GLContext::CreateOffscreen(
         mojo::ApplicationConnectorPtr::Create(
-            application_impl()->CreateApplicationConnector())
+            mojo::CreateApplicationConnector(application_impl()->shell()))
             .get());
     quit_message_loop_callback_ = base::Bind(
         &GLRendererTest::QuitMessageLoopCallback, weak_factory_.GetWeakPtr());
diff --git a/mojo/ui/gl_view.cc b/mojo/ui/gl_view.cc
index 4ab635d..e3c80f5 100644
--- a/mojo/ui/gl_view.cc
+++ b/mojo/ui/gl_view.cc
@@ -5,6 +5,7 @@
 #include "mojo/ui/gl_view.h"
 
 #include "base/logging.h"
+#include "mojo/public/cpp/application/connect.h"
 
 namespace mojo {
 namespace ui {
@@ -15,7 +16,7 @@
     : BaseView(app_impl, view_owner_request.Pass(), label),
       gl_renderer_(mojo::GLContext::CreateOffscreen(
           ApplicationConnectorPtr::Create(
-              app_impl->CreateApplicationConnector())
+              mojo::CreateApplicationConnector(app_impl->shell()))
               .get())) {}
 
 GLView::~GLView() {}
diff --git a/shell/shell_apptest.cc b/shell/shell_apptest.cc
index 7f64883..42a5547 100644
--- a/shell/shell_apptest.cc
+++ b/shell/shell_apptest.cc
@@ -224,13 +224,15 @@
 
 TEST_F(ShellAppTest, ApplicationConnector) {
   mojo::ApplicationConnectorPtr app_connector;
-  app_connector.Bind(application_impl()->CreateApplicationConnector());
+  app_connector.Bind(
+      mojo::CreateApplicationConnector(application_impl()->shell()));
   TestApplicationConnector(app_connector.get());
 }
 
 TEST_F(ShellAppTest, ApplicationConnectorDuplicate) {
   mojo::ApplicationConnectorPtr app_connector1;
-  app_connector1.Bind(application_impl()->CreateApplicationConnector());
+  app_connector1.Bind(
+      mojo::CreateApplicationConnector(application_impl()->shell()));
   {
     SCOPED_TRACE("app_connector1");
     TestApplicationConnector(app_connector1.get());