Do not consider url query when setting application arguments.

BUG= Fixes https://github.com/domokit/mojo/issues/552
R=ppi@chromium.org

Review URL: https://codereview.chromium.org/1471753002 .
diff --git a/shell/application_manager/application_manager.cc b/shell/application_manager/application_manager.cc
index 2dfdc3e..4f4af48 100644
--- a/shell/application_manager/application_manager.cc
+++ b/shell/application_manager/application_manager.cc
@@ -456,13 +456,17 @@
 
 void ApplicationManager::SetArgsForURL(const std::vector<std::string>& args,
                                        const GURL& url) {
-  url_to_args_[url].insert(url_to_args_[url].end(), args.begin(), args.end());
-  GURL mapped_url = delegate_->ResolveMappings(url);
+  GURL base_url = GetBaseURLAndQuery(url, nullptr);
+  url_to_args_[base_url].insert(url_to_args_[base_url].end(), args.begin(),
+                                args.end());
+  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());
   }
   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());
@@ -523,7 +527,8 @@
 }
 
 std::vector<std::string> ApplicationManager::GetArgsForURL(const GURL& url) {
-  const auto& args_it = url_to_args_.find(url);
+  GURL base_url = GetBaseURLAndQuery(url, nullptr);
+  const auto& args_it = url_to_args_.find(base_url);
   if (args_it != url_to_args_.end())
     return args_it->second;
   return std::vector<std::string>();
diff --git a/shell/application_manager/application_manager_unittest.cc b/shell/application_manager/application_manager_unittest.cc
index 4a94728..341aea1 100644
--- a/shell/application_manager/application_manager_unittest.cc
+++ b/shell/application_manager/application_manager_unittest.cc
@@ -527,6 +527,28 @@
   EXPECT_EQ(args[1], app_args[1]);
 }
 
+// Confirm that arguments are sent to an application in the presence of query
+// parameters.
+TEST_F(ApplicationManagerTest, ArgsWithQuery) {
+  ApplicationManager am(ApplicationManager::Options(), &test_delegate_);
+  GURL test_url("test:test");
+  GURL test_url_with_query("test:test?foo=bar");
+  std::vector<std::string> args;
+  args.push_back("test_arg1");
+  am.SetArgsForURL(args, 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_with_query, &test_service);
+  TestClient test_client(test_service.Pass());
+  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]);
+}
+
 // Confirm that arguments are aggregated through mappings.
 TEST_F(ApplicationManagerTest, ArgsAndMapping) {
   ApplicationManager am(ApplicationManager::Options(), &test_delegate_);