Fix URL duplication when SetArgsForURL is called mutliple times.

R=ppi@chromium.org

Review URL: https://codereview.chromium.org/1467263002 .
diff --git a/shell/application_manager/application_manager.cc b/shell/application_manager/application_manager.cc
index 4f4af48..8453f1c 100644
--- a/shell/application_manager/application_manager.cc
+++ b/shell/application_manager/application_manager.cc
@@ -45,6 +45,14 @@
   return result;
 }
 
+void AppendArgsForURL(const GURL& url,
+                      const std::vector<std::string>& args,
+                      std::vector<std::string>* target) {
+  if (target->empty())
+    target->push_back(url.spec());
+  target->insert(target->end(), args.begin(), args.end());
+}
+
 }  // namespace
 
 class ApplicationManager::ContentHandlerConnection {
@@ -457,20 +465,15 @@
 void ApplicationManager::SetArgsForURL(const std::vector<std::string>& args,
                                        const GURL& url) {
   GURL base_url = GetBaseURLAndQuery(url, nullptr);
-  url_to_args_[base_url].insert(url_to_args_[base_url].end(), args.begin(),
-                                args.end());
+  AppendArgsForURL(base_url, args, &url_to_args_[base_url]);
   GURL mapped_url = delegate_->ResolveMappings(base_url);
   DCHECK(!mapped_url.has_query());
-  if (mapped_url != url) {
-    url_to_args_[mapped_url].insert(url_to_args_[mapped_url].end(),
-                                    args.begin(), args.end());
-  }
+  if (mapped_url != base_url)
+    AppendArgsForURL(mapped_url, args, &url_to_args_[mapped_url]);
   GURL resolved_url = delegate_->ResolveMojoURL(mapped_url);
   DCHECK(!resolved_url.has_query());
-  if (resolved_url != mapped_url) {
-    url_to_args_[resolved_url].insert(url_to_args_[resolved_url].end(),
-                                      args.begin(), args.end());
-  }
+  if (resolved_url != mapped_url)
+    AppendArgsForURL(resolved_url, args, &url_to_args_[resolved_url]);
 }
 
 NativeApplicationOptions* ApplicationManager::GetNativeApplicationOptionsForURL(
diff --git a/shell/application_manager/application_manager_unittest.cc b/shell/application_manager/application_manager_unittest.cc
index 341aea1..de6fdc5 100644
--- a/shell/application_manager/application_manager_unittest.cc
+++ b/shell/application_manager/application_manager_unittest.cc
@@ -522,9 +522,9 @@
   test_client.Test("test");
   loop_.Run();
   std::vector<std::string> app_args = loader->GetArgs();
-  ASSERT_EQ(args.size(), app_args.size());
-  EXPECT_EQ(args[0], app_args[0]);
-  EXPECT_EQ(args[1], app_args[1]);
+  ASSERT_EQ(args.size() + 1, app_args.size());
+  EXPECT_EQ(args[0], app_args[1]);
+  EXPECT_EQ(args[1], app_args[2]);
 }
 
 // Confirm that arguments are sent to an application in the presence of query
@@ -545,8 +545,33 @@
   test_client.Test("test");
   loop_.Run();
   std::vector<std::string> app_args = loader->GetArgs();
-  ASSERT_EQ(args.size(), app_args.size());
-  EXPECT_EQ(args[0], app_args[0]);
+  ASSERT_EQ(args.size() + 1, app_args.size());
+  EXPECT_EQ(args[0], app_args[1]);
+}
+
+// Confirm that the URL is not duplicated when arguments are added in multiple
+// phases.
+TEST_F(ApplicationManagerTest, ArgsMultipleCalls) {
+  ApplicationManager am(ApplicationManager::Options(), &test_delegate_);
+  GURL test_url("test:test");
+  std::vector<std::string> args1;
+  args1.push_back("test_arg1");
+  am.SetArgsForURL(args1, test_url);
+  std::vector<std::string> args2;
+  args2.push_back("test_arg2");
+  am.SetArgsForURL(args2, test_url);
+  TestApplicationLoader* loader = new TestApplicationLoader;
+  loader->set_context(&context_);
+  am.SetLoaderForURL(scoped_ptr<ApplicationLoader>(loader), test_url);
+  TestServicePtr test_service;
+  am.ConnectToService(test_url, &test_service);
+  TestClient test_client(test_service.Pass());
+  test_client.Test("test");
+  loop_.Run();
+  std::vector<std::string> app_args = loader->GetArgs();
+  ASSERT_EQ(args1.size() + args2.size() + 1, app_args.size());
+  EXPECT_EQ(args1[0], app_args[1]);
+  EXPECT_EQ(args2[0], app_args[2]);
 }
 
 // Confirm that arguments are aggregated through mappings.
@@ -574,11 +599,11 @@
     test_client.Test("test");
     loop_.Run();
     std::vector<std::string> app_args = loader->GetArgs();
-    ASSERT_EQ(args.size() + args2.size(), app_args.size());
-    EXPECT_EQ(args[0], app_args[0]);
-    EXPECT_EQ(args[1], app_args[1]);
-    EXPECT_EQ(args2[0], app_args[2]);
-    EXPECT_EQ(args2[1], app_args[3]);
+    ASSERT_EQ(args.size() + args2.size() + 1, app_args.size());
+    EXPECT_EQ(args[0], app_args[1]);
+    EXPECT_EQ(args[1], app_args[2]);
+    EXPECT_EQ(args2[0], app_args[3]);
+    EXPECT_EQ(args2[1], app_args[4]);
   }
   {
     // Connext to the target url
@@ -588,11 +613,11 @@
     test_client.Test("test");
     loop_.Run();
     std::vector<std::string> app_args = loader->GetArgs();
-    ASSERT_EQ(args.size() + args2.size(), app_args.size());
-    EXPECT_EQ(args[0], app_args[0]);
-    EXPECT_EQ(args[1], app_args[1]);
-    EXPECT_EQ(args2[0], app_args[2]);
-    EXPECT_EQ(args2[1], app_args[3]);
+    ASSERT_EQ(args.size() + args2.size() + 1, app_args.size());
+    EXPECT_EQ(args[0], app_args[1]);
+    EXPECT_EQ(args[1], app_args[2]);
+    EXPECT_EQ(args2[0], app_args[3]);
+    EXPECT_EQ(args2[1], app_args[4]);
   }
 }
 
diff --git a/shell/command_line_util.cc b/shell/command_line_util.cc
index 10d7a1e..dfa2986 100644
--- a/shell/command_line_util.cc
+++ b/shell/command_line_util.cc
@@ -21,7 +21,7 @@
   std::vector<std::string> args;
   GURL app_url = GetAppURLAndArgs(context, app_url_and_args, &args);
 
-  if (args.size() > 1)
+  if (!args.empty())
     context->application_manager()->SetArgsForURL(args, app_url);
   return app_url;
 }
@@ -58,8 +58,7 @@
     LOG(ERROR) << "Error: invalid URL: " << (*args)[0];
     return app_url;
   }
-  if (args->size() == 1)
-    args->clear();
+  args->erase(args->begin());
   return app_url;
 }
 
diff --git a/shell/command_line_util_unittest.cc b/shell/command_line_util_unittest.cc
index d676155..58d7649 100644
--- a/shell/command_line_util_unittest.cc
+++ b/shell/command_line_util_unittest.cc
@@ -67,8 +67,6 @@
       EXPECT_EQ(GURL(expectation.url), result);
       std::vector<std::string> expected_args;
       if (expectation.values) {
-        if (*expectation.values)
-          expected_args.push_back(expectation.url);
         for (const char** value = expectation.values; *value; ++value)
           expected_args.push_back(*value);
       }