Allow external applications to register for mojo: urls

BUG=
R=aa@chromium.org

Review URL: https://codereview.chromium.org/861293002
diff --git a/shell/application_manager/application_manager_unittest.cc b/shell/application_manager/application_manager_unittest.cc
index f3b0503..b8da53b 100644
--- a/shell/application_manager/application_manager_unittest.cc
+++ b/shell/application_manager/application_manager_unittest.cc
@@ -415,6 +415,34 @@
   std::map<GURL, GURL> mappings_;
 };
 
+class TestExternal : public ApplicationDelegate {
+ public:
+  TestExternal()
+      : initialize_called_(false),
+        configure_incoming_connection_called_(false) {}
+
+  virtual void Initialize(ApplicationImpl* app) override {
+    initialize_called_ = true;
+    base::MessageLoop::current()->Quit();
+  }
+
+  virtual bool ConfigureIncomingConnection(
+      ApplicationConnection* connection) override {
+    configure_incoming_connection_called_ = true;
+    base::MessageLoop::current()->Quit();
+    return true;
+  }
+
+  bool initialize_called() const { return initialize_called_; }
+  bool configure_incoming_connection_called() const {
+    return configure_incoming_connection_called_;
+  }
+
+ private:
+  bool initialize_called_;
+  bool configure_incoming_connection_called_;
+};
+
 }  // namespace
 
 class ApplicationManagerTest : public testing::Test {
@@ -696,4 +724,18 @@
   custom_loader->set_context(nullptr);
 }
 
+TEST_F(ApplicationManagerTest, ExternalApp) {
+  MessagePipe shell_pipe;
+  TestExternal external;
+  ApplicationImpl app(&external, shell_pipe.handle0.Pass());
+  application_manager_->RegisterExternalApplication(
+      GURL("mojo:test"), shell_pipe.handle1.Pass());
+  loop_.Run();
+  EXPECT_TRUE(external.initialize_called());
+  application_manager_->ConnectToServiceByName(
+      GURL("mojo:test"), std::string());
+  loop_.Run();
+  EXPECT_TRUE(external.configure_incoming_connection_called());
+};
+
 }  // namespace mojo