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_);