blob: e04b7049279f8458850bdb7efb1b6cf545e38604 [file] [log] [blame]
[email protected]63f021882014-07-11 03:14:161// Copyright 2014 The Chromium Authors. All rights reserved.
[email protected]d82443b2009-01-15 19:54:562// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
avif57136c12015-12-25 23:27:455#include <stddef.h>
6
Robbie Gibson8532eaa2019-03-15 11:43:247#include "base/base64.h"
[email protected]12bd05872009-03-17 19:25:068#include "base/base_paths.h"
[email protected]56fa29592013-07-02 20:25:539#include "base/command_line.h"
a-v-y81695d0d2017-04-20 08:22:2210#include "base/i18n/case_conversion.h"
Avi Drissman2244c2d2018-12-25 23:08:0211#include "base/stl_util.h"
[email protected]2f3bc6512013-08-28 03:56:2712#include "base/strings/string_number_conversions.h"
[email protected]24a555b62013-06-10 22:01:1713#include "base/strings/string_util.h"
[email protected]e309f312013-06-07 21:50:0814#include "base/strings/utf_string_conversions.h"
John Abd-El-Malek9cf3d7f02018-07-27 02:40:3915#include "components/google/core/common/google_util.h"
[email protected]5c3c6e482014-06-23 09:47:1816#include "components/search_engines/search_engines_switches.h"
[email protected]798baa8e2014-06-20 05:42:4417#include "components/search_engines/search_terms_data.h"
[email protected]d550cb02014-06-25 06:48:1118#include "components/search_engines/template_url.h"
hashimoto3c831812014-08-25 07:40:2319#include "components/search_engines/testing_search_terms_data.h"
a-v-y02d3f50b2017-02-16 12:03:5520#include "net/base/url_util.h"
[email protected]d82443b2009-01-15 19:54:5621#include "testing/gtest/include/gtest/gtest.h"
Steven Holtef9d5ed62017-10-21 02:02:3022#include "third_party/metrics_proto/omnibox_event.pb.h"
23#include "third_party/metrics_proto/omnibox_input_type.pb.h"
[email protected]d82443b2009-01-15 19:54:5624
[email protected]f911df52013-12-24 23:24:2325using base::ASCIIToUTF16;
26
a-v-y81695d0d2017-04-20 08:22:2227namespace {
28bool IsLowerCase(const base::string16& str) {
29 return str == base::i18n::ToLower(str);
30}
31}
32
[email protected]583844c2011-08-27 00:38:3533class TemplateURLTest : public testing::Test {
[email protected]d82443b2009-01-15 19:54:5634 public:
[email protected]798baa8e2014-06-20 05:42:4435 TemplateURLTest() : search_terms_data_("http://www.google.com/") {}
[email protected]b37bdfe2012-03-16 20:53:2736 void CheckSuggestBaseURL(const std::string& base_url,
37 const std::string& base_suggest_url) const;
[email protected]ce7ee5f2014-06-16 23:41:1938
vitbardeb285392015-02-20 14:02:5539 static void ExpectPostParamIs(
40 const TemplateURLRef::PostParam& param,
41 const std::string& name,
42 const std::string& value,
43 const std::string& content_type = std::string());
44
hashimoto3c831812014-08-25 07:40:2345 TestingSearchTermsData search_terms_data_;
[email protected]d82443b2009-01-15 19:54:5646};
47
[email protected]b37bdfe2012-03-16 20:53:2748void TemplateURLTest::CheckSuggestBaseURL(
49 const std::string& base_url,
50 const std::string& base_suggest_url) const {
hashimoto3c831812014-08-25 07:40:2351 TestingSearchTermsData search_terms_data(base_url);
[email protected]b37bdfe2012-03-16 20:53:2752 EXPECT_EQ(base_suggest_url, search_terms_data.GoogleBaseSuggestURLValue());
53}
54
vitbardeb285392015-02-20 14:02:5555// static
56void TemplateURLTest::ExpectPostParamIs(const TemplateURLRef::PostParam& param,
57 const std::string& name,
58 const std::string& value,
59 const std::string& content_type) {
60 EXPECT_EQ(name, param.name);
61 EXPECT_EQ(value, param.value);
62 EXPECT_EQ(content_type, param.content_type);
63}
64
[email protected]d82443b2009-01-15 19:54:5665TEST_F(TemplateURLTest, Defaults) {
[email protected]573889f22012-04-07 01:31:5466 TemplateURLData data;
[email protected]573889f22012-04-07 01:31:5467 EXPECT_FALSE(data.safe_for_autoreplace);
68 EXPECT_EQ(0, data.prepopulate_id);
[email protected]d82443b2009-01-15 19:54:5669}
70
71TEST_F(TemplateURLTest, TestValidWithComplete) {
[email protected]573889f22012-04-07 01:31:5472 TemplateURLData data;
73 data.SetURL("{searchTerms}");
[email protected]168d08722014-06-18 07:13:2874 TemplateURL url(data);
[email protected]ce7ee5f2014-06-16 23:41:1975 EXPECT_TRUE(url.url_ref().IsValid(search_terms_data_));
[email protected]d82443b2009-01-15 19:54:5676}
77
78TEST_F(TemplateURLTest, URLRefTestSearchTerms) {
[email protected]0d2e6a62010-01-15 20:09:1979 struct SearchTermsCase {
[email protected]ddd231e2010-06-29 20:35:1980 const char* url;
[email protected]0085863a2013-12-06 21:19:0381 const base::string16 terms;
[email protected]34e24852012-01-31 18:43:5882 const std::string output;
[email protected]0d2e6a62010-01-15 20:09:1983 } search_term_cases[] = {
[email protected]400b133f2011-01-19 18:32:3084 { "http://foo{searchTerms}", ASCIIToUTF16("sea rch/bar"),
[email protected]c31a979c2012-05-31 23:57:1685 "http://foosea%20rch/bar" },
[email protected]400b133f2011-01-19 18:32:3086 { "http://foo{searchTerms}?boo=abc", ASCIIToUTF16("sea rch/bar"),
[email protected]c31a979c2012-05-31 23:57:1687 "http://foosea%20rch/bar?boo=abc" },
[email protected]400b133f2011-01-19 18:32:3088 { "http://foo/?boo={searchTerms}", ASCIIToUTF16("sea rch/bar"),
[email protected]c31a979c2012-05-31 23:57:1689 "http://foo/?boo=sea+rch%2Fbar" },
[email protected]400b133f2011-01-19 18:32:3090 { "http://en.wikipedia.org/{searchTerms}", ASCIIToUTF16("wiki/?"),
[email protected]c31a979c2012-05-31 23:57:1691 "http://en.wikipedia.org/wiki/%3F" }
[email protected]0d2e6a62010-01-15 20:09:1992 };
Avi Drissman2244c2d2018-12-25 23:08:0293 for (size_t i = 0; i < base::size(search_term_cases); ++i) {
[email protected]0d2e6a62010-01-15 20:09:1994 const SearchTermsCase& value = search_term_cases[i];
[email protected]573889f22012-04-07 01:31:5495 TemplateURLData data;
96 data.SetURL(value.url);
[email protected]168d08722014-06-18 07:13:2897 TemplateURL url(data);
[email protected]ce7ee5f2014-06-16 23:41:1998 EXPECT_TRUE(url.url_ref().IsValid(search_terms_data_));
99 ASSERT_TRUE(url.url_ref().SupportsReplacement(search_terms_data_));
[email protected]bca359b2012-06-24 07:53:04100 GURL result(url.url_ref().ReplaceSearchTerms(
[email protected]ce7ee5f2014-06-16 23:41:19101 TemplateURLRef::SearchTermsArgs(value.terms), search_terms_data_));
[email protected]c31a979c2012-05-31 23:57:16102 ASSERT_TRUE(result.is_valid());
103 EXPECT_EQ(value.output, result.spec());
[email protected]0d2e6a62010-01-15 20:09:19104 }
[email protected]d82443b2009-01-15 19:54:56105}
106
107TEST_F(TemplateURLTest, URLRefTestCount) {
[email protected]573889f22012-04-07 01:31:54108 TemplateURLData data;
109 data.SetURL("http://foo{searchTerms}{count?}");
[email protected]168d08722014-06-18 07:13:28110 TemplateURL url(data);
[email protected]ce7ee5f2014-06-16 23:41:19111 EXPECT_TRUE(url.url_ref().IsValid(search_terms_data_));
112 ASSERT_TRUE(url.url_ref().SupportsReplacement(search_terms_data_));
[email protected]bca359b2012-06-24 07:53:04113 GURL result(url.url_ref().ReplaceSearchTerms(
[email protected]ce7ee5f2014-06-16 23:41:19114 TemplateURLRef::SearchTermsArgs(ASCIIToUTF16("X")), search_terms_data_));
[email protected]d82443b2009-01-15 19:54:56115 ASSERT_TRUE(result.is_valid());
[email protected]b37bdfe2012-03-16 20:53:27116 EXPECT_EQ("http://foox/", result.spec());
[email protected]d82443b2009-01-15 19:54:56117}
118
119TEST_F(TemplateURLTest, URLRefTestCount2) {
[email protected]573889f22012-04-07 01:31:54120 TemplateURLData data;
121 data.SetURL("http://foo{searchTerms}{count}");
[email protected]168d08722014-06-18 07:13:28122 TemplateURL url(data);
[email protected]ce7ee5f2014-06-16 23:41:19123 EXPECT_TRUE(url.url_ref().IsValid(search_terms_data_));
124 ASSERT_TRUE(url.url_ref().SupportsReplacement(search_terms_data_));
[email protected]bca359b2012-06-24 07:53:04125 GURL result(url.url_ref().ReplaceSearchTerms(
[email protected]ce7ee5f2014-06-16 23:41:19126 TemplateURLRef::SearchTermsArgs(ASCIIToUTF16("X")), search_terms_data_));
[email protected]d82443b2009-01-15 19:54:56127 ASSERT_TRUE(result.is_valid());
[email protected]b37bdfe2012-03-16 20:53:27128 EXPECT_EQ("http://foox10/", result.spec());
[email protected]d82443b2009-01-15 19:54:56129}
130
131TEST_F(TemplateURLTest, URLRefTestIndices) {
[email protected]573889f22012-04-07 01:31:54132 TemplateURLData data;
133 data.SetURL("http://foo{searchTerms}x{startIndex?}y{startPage?}");
[email protected]168d08722014-06-18 07:13:28134 TemplateURL url(data);
[email protected]ce7ee5f2014-06-16 23:41:19135 EXPECT_TRUE(url.url_ref().IsValid(search_terms_data_));
136 ASSERT_TRUE(url.url_ref().SupportsReplacement(search_terms_data_));
[email protected]bca359b2012-06-24 07:53:04137 GURL result(url.url_ref().ReplaceSearchTerms(
[email protected]ce7ee5f2014-06-16 23:41:19138 TemplateURLRef::SearchTermsArgs(ASCIIToUTF16("X")), search_terms_data_));
[email protected]d82443b2009-01-15 19:54:56139 ASSERT_TRUE(result.is_valid());
[email protected]b37bdfe2012-03-16 20:53:27140 EXPECT_EQ("http://fooxxy/", result.spec());
[email protected]d82443b2009-01-15 19:54:56141}
142
143TEST_F(TemplateURLTest, URLRefTestIndices2) {
[email protected]573889f22012-04-07 01:31:54144 TemplateURLData data;
145 data.SetURL("http://foo{searchTerms}x{startIndex}y{startPage}");
[email protected]168d08722014-06-18 07:13:28146 TemplateURL url(data);
[email protected]ce7ee5f2014-06-16 23:41:19147 EXPECT_TRUE(url.url_ref().IsValid(search_terms_data_));
148 ASSERT_TRUE(url.url_ref().SupportsReplacement(search_terms_data_));
[email protected]bca359b2012-06-24 07:53:04149 GURL result(url.url_ref().ReplaceSearchTerms(
[email protected]ce7ee5f2014-06-16 23:41:19150 TemplateURLRef::SearchTermsArgs(ASCIIToUTF16("X")), search_terms_data_));
[email protected]d82443b2009-01-15 19:54:56151 ASSERT_TRUE(result.is_valid());
[email protected]405aae22012-03-29 20:36:13152 EXPECT_EQ("http://fooxx1y1/", result.spec());
[email protected]d82443b2009-01-15 19:54:56153}
154
155TEST_F(TemplateURLTest, URLRefTestEncoding) {
[email protected]573889f22012-04-07 01:31:54156 TemplateURLData data;
157 data.SetURL("http://foo{searchTerms}x{inputEncoding?}y{outputEncoding?}a");
[email protected]168d08722014-06-18 07:13:28158 TemplateURL url(data);
[email protected]ce7ee5f2014-06-16 23:41:19159 EXPECT_TRUE(url.url_ref().IsValid(search_terms_data_));
160 ASSERT_TRUE(url.url_ref().SupportsReplacement(search_terms_data_));
[email protected]bca359b2012-06-24 07:53:04161 GURL result(url.url_ref().ReplaceSearchTerms(
[email protected]ce7ee5f2014-06-16 23:41:19162 TemplateURLRef::SearchTermsArgs(ASCIIToUTF16("X")), search_terms_data_));
[email protected]d82443b2009-01-15 19:54:56163 ASSERT_TRUE(result.is_valid());
[email protected]b37bdfe2012-03-16 20:53:27164 EXPECT_EQ("http://fooxxutf-8ya/", result.spec());
[email protected]d82443b2009-01-15 19:54:56165}
166
[email protected]93b29062013-07-12 03:09:09167TEST_F(TemplateURLTest, URLRefTestImageURLWithPOST) {
168 const char kInvalidPostParamsString[] =
169 "unknown_template={UnknownTemplate},bad_value=bad{value},"
170 "{google:sbiSource}";
171 // List all accpectable parameter format in valid_post_params_string. it is
172 // expected like: "name0=,name1=value1,name2={template1}"
173 const char kValidPostParamsString[] =
174 "image_content={google:imageThumbnail},image_url={google:imageURL},"
175 "sbisrc={google:imageSearchSource},language={language},empty_param=,"
Robbie Gibson8532eaa2019-03-15 11:43:24176 "constant_param=constant,width={google:imageOriginalWidth},"
177 "base64_image_content={google:imageThumbnailBase64}";
[email protected]93b29062013-07-12 03:09:09178 const char KImageSearchURL[] = "http://foo.com/sbi";
179
180 TemplateURLData data;
181 data.image_url = KImageSearchURL;
182
183 // Try to parse invalid post parameters.
184 data.image_url_post_params = kInvalidPostParamsString;
[email protected]168d08722014-06-18 07:13:28185 TemplateURL url_bad(data);
[email protected]ce7ee5f2014-06-16 23:41:19186 ASSERT_FALSE(url_bad.image_url_ref().IsValid(search_terms_data_));
[email protected]93b29062013-07-12 03:09:09187 const TemplateURLRef::PostParams& bad_post_params =
188 url_bad.image_url_ref().post_params_;
189 ASSERT_EQ(2U, bad_post_params.size());
vitbardeb285392015-02-20 14:02:55190 ExpectPostParamIs(bad_post_params[0], "unknown_template",
191 "{UnknownTemplate}");
192 ExpectPostParamIs(bad_post_params[1], "bad_value", "bad{value}");
[email protected]93b29062013-07-12 03:09:09193
194 // Try to parse valid post parameters.
195 data.image_url_post_params = kValidPostParamsString;
[email protected]168d08722014-06-18 07:13:28196 TemplateURL url(data);
[email protected]ce7ee5f2014-06-16 23:41:19197 ASSERT_TRUE(url.image_url_ref().IsValid(search_terms_data_));
198 ASSERT_FALSE(url.image_url_ref().SupportsReplacement(search_terms_data_));
[email protected]93b29062013-07-12 03:09:09199
200 // Check term replacement.
201 TemplateURLRef::SearchTermsArgs search_args(ASCIIToUTF16("X"));
202 search_args.image_thumbnail_content = "dummy-image-thumbnail";
203 search_args.image_url = GURL("http://dummyimage.com/dummy.jpg");
[email protected]2f3bc6512013-08-28 03:56:27204 search_args.image_original_size = gfx::Size(10, 10);
[email protected]93b29062013-07-12 03:09:09205 // Replacement operation with no post_data buffer should still return
206 // the parsed URL.
hashimoto3c831812014-08-25 07:40:23207 TestingSearchTermsData search_terms_data("http://X");
[email protected]ce7ee5f2014-06-16 23:41:19208 GURL result(url.image_url_ref().ReplaceSearchTerms(
209 search_args, search_terms_data));
[email protected]93b29062013-07-12 03:09:09210 ASSERT_TRUE(result.is_valid());
211 EXPECT_EQ(KImageSearchURL, result.spec());
[email protected]7c2bcc42013-08-01 04:03:48212 TemplateURLRef::PostContent post_content;
[email protected]ce7ee5f2014-06-16 23:41:19213 result = GURL(url.image_url_ref().ReplaceSearchTerms(
[email protected]7c2bcc42013-08-01 04:03:48214 search_args, search_terms_data, &post_content));
[email protected]93b29062013-07-12 03:09:09215 ASSERT_TRUE(result.is_valid());
216 EXPECT_EQ(KImageSearchURL, result.spec());
[email protected]7c2bcc42013-08-01 04:03:48217 ASSERT_FALSE(post_content.first.empty());
218 ASSERT_FALSE(post_content.second.empty());
[email protected]93b29062013-07-12 03:09:09219
220 // Check parsed result of post parameters.
221 const TemplateURLRef::Replacements& replacements =
222 url.image_url_ref().replacements_;
223 const TemplateURLRef::PostParams& post_params =
224 url.image_url_ref().post_params_;
Robbie Gibson8532eaa2019-03-15 11:43:24225 EXPECT_EQ(8U, post_params.size());
jdoerrie3feb1852018-10-05 12:16:44226 for (auto i = post_params.begin(); i != post_params.end(); ++i) {
227 auto j = replacements.begin();
[email protected]93b29062013-07-12 03:09:09228 for (; j != replacements.end(); ++j) {
229 if (j->is_post_param && j->index ==
230 static_cast<size_t>(i - post_params.begin())) {
231 switch (j->type) {
[email protected]2f3bc6512013-08-28 03:56:27232 case TemplateURLRef::GOOGLE_IMAGE_ORIGINAL_WIDTH:
Raul Tambref88e5102019-02-06 10:54:03233 ExpectPostParamIs(
234 *i, "width",
235 base::NumberToString(search_args.image_original_size.width()));
[email protected]2f3bc6512013-08-28 03:56:27236 break;
[email protected]1020fead2014-06-20 13:40:28237 case TemplateURLRef::GOOGLE_IMAGE_SEARCH_SOURCE:
vitbardeb285392015-02-20 14:02:55238 ExpectPostParamIs(*i, "sbisrc",
239 search_terms_data.GoogleImageSearchSource());
[email protected]1020fead2014-06-20 13:40:28240 break;
[email protected]93b29062013-07-12 03:09:09241 case TemplateURLRef::GOOGLE_IMAGE_THUMBNAIL:
vitbardeb285392015-02-20 14:02:55242 ExpectPostParamIs(*i, "image_content",
243 search_args.image_thumbnail_content,
244 "image/jpeg");
[email protected]93b29062013-07-12 03:09:09245 break;
Robbie Gibson8532eaa2019-03-15 11:43:24246 case TemplateURLRef::GOOGLE_IMAGE_THUMBNAIL_BASE64: {
247 std::string base64_image_content;
248 base::Base64Encode(search_args.image_thumbnail_content,
249 &base64_image_content);
250 ExpectPostParamIs(*i, "base64_image_content", base64_image_content,
251 "image/jpeg");
252 break;
253 }
[email protected]93b29062013-07-12 03:09:09254 case TemplateURLRef::GOOGLE_IMAGE_URL:
vitbardeb285392015-02-20 14:02:55255 ExpectPostParamIs(*i, "image_url", search_args.image_url.spec());
[email protected]93b29062013-07-12 03:09:09256 break;
257 case TemplateURLRef::LANGUAGE:
vitbardeb285392015-02-20 14:02:55258 ExpectPostParamIs(*i, "language", "en");
[email protected]93b29062013-07-12 03:09:09259 break;
260 default:
261 ADD_FAILURE(); // Should never go here.
262 }
263 break;
264 }
265 }
266 if (j != replacements.end())
267 continue;
vitbardeb285392015-02-20 14:02:55268 if (i->name == "empty_param")
269 ExpectPostParamIs(*i, "empty_param", std::string());
270 else
271 ExpectPostParamIs(*i, "constant_param", "constant");
[email protected]93b29062013-07-12 03:09:09272 }
273}
274
Peter Kastinge59f0c32017-11-29 05:56:22275TEST_F(TemplateURLTest, ImageURLWithGetShouldNotCrash) {
276 TemplateURLData data;
277 data.SetURL("http://foo/?q={searchTerms}&t={google:imageThumbnail}");
278 TemplateURL url(data);
279 EXPECT_TRUE(url.url_ref().IsValid(search_terms_data_));
280 ASSERT_TRUE(url.url_ref().SupportsReplacement(search_terms_data_));
281
282 TemplateURLRef::SearchTermsArgs search_args(ASCIIToUTF16("X"));
283 search_args.image_thumbnail_content = "dummy-image-thumbnail";
284 GURL result(
285 url.url_ref().ReplaceSearchTerms(search_args, search_terms_data_));
286 ASSERT_TRUE(result.is_valid());
287 EXPECT_EQ("http://foo/?q=X&t=dummy-image-thumbnail", result.spec());
288}
289
[email protected]d88cb202011-08-17 20:03:01290// Test that setting the prepopulate ID from TemplateURL causes the stored
291// TemplateURLRef to handle parsing the URL parameters differently.
[email protected]1a257262011-06-28 22:15:44292TEST_F(TemplateURLTest, SetPrepopulatedAndParse) {
[email protected]573889f22012-04-07 01:31:54293 TemplateURLData data;
[email protected]243abf32012-05-15 18:28:20294 data.SetURL("http://foo{fhqwhgads}bar");
[email protected]168d08722014-06-18 07:13:28295 TemplateURL url(data);
[email protected]1a257262011-06-28 22:15:44296 TemplateURLRef::Replacements replacements;
297 bool valid = false;
Ivan Kotenkov75b1c3a2017-10-24 14:47:24298 EXPECT_EQ("http://foo{fhqwhgads}bar",
299 url.url_ref().ParseURL("http://foo{fhqwhgads}bar", &replacements,
300 nullptr, &valid));
[email protected]1a257262011-06-28 22:15:44301 EXPECT_TRUE(replacements.empty());
302 EXPECT_TRUE(valid);
303
[email protected]573889f22012-04-07 01:31:54304 data.prepopulate_id = 123;
[email protected]168d08722014-06-18 07:13:28305 TemplateURL url2(data);
Ivan Kotenkov75b1c3a2017-10-24 14:47:24306 EXPECT_EQ("http://foobar",
307 url2.url_ref().ParseURL("http://foo{fhqwhgads}bar", &replacements,
308 nullptr, &valid));
[email protected]1a257262011-06-28 22:15:44309 EXPECT_TRUE(replacements.empty());
310 EXPECT_TRUE(valid);
311}
312
vitbar90902c42016-05-11 06:16:55313// Test that setting the prepopulate ID from TemplateURL causes the stored
314// TemplateURLRef to handle parsing the URL parameters differently.
315TEST_F(TemplateURLTest, SetPrepopulatedAndReplace) {
316 TemplateURLData data;
317 data.SetURL("http://foo{fhqwhgads}search/?q={searchTerms}");
318 data.suggestions_url = "http://foo{fhqwhgads}suggest/?q={searchTerms}";
vitbar90902c42016-05-11 06:16:55319 data.image_url = "http://foo{fhqwhgads}image/";
320 data.new_tab_url = "http://foo{fhqwhgads}newtab/";
321 data.contextual_search_url = "http://foo{fhqwhgads}context/";
322 data.alternate_urls.push_back(
323 "http://foo{fhqwhgads}alternate/?q={searchTerms}");
324
325 TemplateURLRef::SearchTermsArgs args(base::ASCIIToUTF16("X"));
326 const SearchTermsData& stdata = search_terms_data_;
327
328 TemplateURL url(data);
329 EXPECT_EQ("http://foo%7Bfhqwhgads%7Dsearch/?q=X",
330 url.url_ref().ReplaceSearchTerms(args, stdata));
331 EXPECT_EQ("http://foo%7Bfhqwhgads%7Dalternate/?q=X",
332 url.url_refs()[0].ReplaceSearchTerms(args, stdata));
333 EXPECT_EQ("http://foo%7Bfhqwhgads%7Dsearch/?q=X",
334 url.url_refs()[1].ReplaceSearchTerms(args, stdata));
335 EXPECT_EQ("http://foo%7Bfhqwhgads%7Dsuggest/?q=X",
336 url.suggestions_url_ref().ReplaceSearchTerms(args, stdata));
vitbar90902c42016-05-11 06:16:55337 EXPECT_EQ("http://foo{fhqwhgads}image/",
338 url.image_url_ref().ReplaceSearchTerms(args, stdata));
339 EXPECT_EQ("http://foo{fhqwhgads}newtab/",
340 url.new_tab_url_ref().ReplaceSearchTerms(args, stdata));
341 EXPECT_EQ("http://foo{fhqwhgads}context/",
342 url.contextual_search_url_ref().ReplaceSearchTerms(args, stdata));
343
344 data.prepopulate_id = 123;
345 TemplateURL url2(data);
346 EXPECT_EQ("http://foosearch/?q=X",
347 url2.url_ref().ReplaceSearchTerms(args, stdata));
348 EXPECT_EQ("http://fooalternate/?q=X",
349 url2.url_refs()[0].ReplaceSearchTerms(args, stdata));
350 EXPECT_EQ("http://foosearch/?q=X",
351 url2.url_refs()[1].ReplaceSearchTerms(args, stdata));
352 EXPECT_EQ("http://foosuggest/?q=X",
353 url2.suggestions_url_ref().ReplaceSearchTerms(args, stdata));
vitbar90902c42016-05-11 06:16:55354 EXPECT_EQ("http://fooimage/",
355 url2.image_url_ref().ReplaceSearchTerms(args, stdata));
356 EXPECT_EQ("http://foonewtab/",
357 url2.new_tab_url_ref().ReplaceSearchTerms(args, stdata));
358 EXPECT_EQ("http://foocontext/",
359 url2.contextual_search_url_ref().ReplaceSearchTerms(args, stdata));
360}
361
[email protected]d82443b2009-01-15 19:54:56362TEST_F(TemplateURLTest, InputEncodingBeforeSearchTerm) {
[email protected]573889f22012-04-07 01:31:54363 TemplateURLData data;
364 data.SetURL("http://foox{inputEncoding?}a{searchTerms}y{outputEncoding?}b");
[email protected]168d08722014-06-18 07:13:28365 TemplateURL url(data);
[email protected]ce7ee5f2014-06-16 23:41:19366 EXPECT_TRUE(url.url_ref().IsValid(search_terms_data_));
367 ASSERT_TRUE(url.url_ref().SupportsReplacement(search_terms_data_));
[email protected]bca359b2012-06-24 07:53:04368 GURL result(url.url_ref().ReplaceSearchTerms(
[email protected]ce7ee5f2014-06-16 23:41:19369 TemplateURLRef::SearchTermsArgs(ASCIIToUTF16("X")), search_terms_data_));
[email protected]d82443b2009-01-15 19:54:56370 ASSERT_TRUE(result.is_valid());
[email protected]b37bdfe2012-03-16 20:53:27371 EXPECT_EQ("http://fooxutf-8axyb/", result.spec());
[email protected]d82443b2009-01-15 19:54:56372}
373
374TEST_F(TemplateURLTest, URLRefTestEncoding2) {
[email protected]573889f22012-04-07 01:31:54375 TemplateURLData data;
376 data.SetURL("http://foo{searchTerms}x{inputEncoding}y{outputEncoding}a");
[email protected]168d08722014-06-18 07:13:28377 TemplateURL url(data);
[email protected]ce7ee5f2014-06-16 23:41:19378 EXPECT_TRUE(url.url_ref().IsValid(search_terms_data_));
379 ASSERT_TRUE(url.url_ref().SupportsReplacement(search_terms_data_));
[email protected]bca359b2012-06-24 07:53:04380 GURL result(url.url_ref().ReplaceSearchTerms(
[email protected]ce7ee5f2014-06-16 23:41:19381 TemplateURLRef::SearchTermsArgs(ASCIIToUTF16("X")), search_terms_data_));
[email protected]d82443b2009-01-15 19:54:56382 ASSERT_TRUE(result.is_valid());
[email protected]b37bdfe2012-03-16 20:53:27383 EXPECT_EQ("http://fooxxutf-8yutf-8a/", result.spec());
[email protected]d82443b2009-01-15 19:54:56384}
385
[email protected]375bd7312010-08-30 22:18:13386TEST_F(TemplateURLTest, URLRefTestSearchTermsUsingTermsData) {
387 struct SearchTermsCase {
388 const char* url;
[email protected]0085863a2013-12-06 21:19:03389 const base::string16 terms;
[email protected]375bd7312010-08-30 22:18:13390 const char* output;
391 } search_term_cases[] = {
[email protected]0085863a2013-12-06 21:19:03392 { "{google:baseURL}{language}{searchTerms}", base::string16(),
[email protected]b37bdfe2012-03-16 20:53:27393 "http://example.com/e/en" },
[email protected]0085863a2013-12-06 21:19:03394 { "{google:baseSuggestURL}{searchTerms}", base::string16(),
[email protected]014010e2011-10-01 04:12:44395 "http://example.com/complete/" }
[email protected]375bd7312010-08-30 22:18:13396 };
397
hashimoto3c831812014-08-25 07:40:23398 TestingSearchTermsData search_terms_data("http://example.com/e/");
[email protected]573889f22012-04-07 01:31:54399 TemplateURLData data;
Avi Drissman2244c2d2018-12-25 23:08:02400 for (size_t i = 0; i < base::size(search_term_cases); ++i) {
[email protected]375bd7312010-08-30 22:18:13401 const SearchTermsCase& value = search_term_cases[i];
[email protected]573889f22012-04-07 01:31:54402 data.SetURL(value.url);
[email protected]168d08722014-06-18 07:13:28403 TemplateURL url(data);
[email protected]ce7ee5f2014-06-16 23:41:19404 EXPECT_TRUE(url.url_ref().IsValid(search_terms_data));
405 ASSERT_TRUE(url.url_ref().SupportsReplacement(search_terms_data));
406 GURL result(url.url_ref().ReplaceSearchTerms(
Ivan Kotenkov75b1c3a2017-10-24 14:47:24407 TemplateURLRef::SearchTermsArgs(value.terms), search_terms_data,
408 nullptr));
[email protected]375bd7312010-08-30 22:18:13409 ASSERT_TRUE(result.is_valid());
[email protected]b37bdfe2012-03-16 20:53:27410 EXPECT_EQ(value.output, result.spec());
[email protected]375bd7312010-08-30 22:18:13411 }
412}
413
[email protected]d82443b2009-01-15 19:54:56414TEST_F(TemplateURLTest, URLRefTermToWide) {
415 struct ToWideCase {
416 const char* encoded_search_term;
[email protected]0085863a2013-12-06 21:19:03417 const base::string16 expected_decoded_term;
[email protected]d82443b2009-01-15 19:54:56418 } to_wide_cases[] = {
[email protected]400b133f2011-01-19 18:32:30419 {"hello+world", ASCIIToUTF16("hello world")},
[email protected]d82443b2009-01-15 19:54:56420 // Test some big-5 input.
[email protected]f911df52013-12-24 23:24:23421 {"%a7A%A6%6e+to+you", base::WideToUTF16(L"\x4f60\x597d to you")},
[email protected]d82443b2009-01-15 19:54:56422 // Test some UTF-8 input. We should fall back to this when the encoding
423 // doesn't look like big-5. We have a '5' in the middle, which is an invalid
424 // Big-5 trailing byte.
[email protected]f911df52013-12-24 23:24:23425 {"%e4%bd%a05%e5%a5%bd+to+you",
426 base::WideToUTF16(L"\x4f60\x35\x597d to you")},
[email protected]d82443b2009-01-15 19:54:56427 // Undecodable input should stay escaped.
[email protected]f911df52013-12-24 23:24:23428 {"%91%01+abcd", base::WideToUTF16(L"%91%01 abcd")},
[email protected]7df43482009-07-31 19:37:44429 // Make sure we convert %2B to +.
[email protected]400b133f2011-01-19 18:32:30430 {"C%2B%2B", ASCIIToUTF16("C++")},
[email protected]7df43482009-07-31 19:37:44431 // C%2B is escaped as C%252B, make sure we unescape it properly.
[email protected]400b133f2011-01-19 18:32:30432 {"C%252B", ASCIIToUTF16("C%2B")},
[email protected]d82443b2009-01-15 19:54:56433 };
434
[email protected]d82443b2009-01-15 19:54:56435 // Set one input encoding: big-5. This is so we can test fallback to UTF-8.
[email protected]573889f22012-04-07 01:31:54436 TemplateURLData data;
437 data.SetURL("http://foo?q={searchTerms}");
438 data.input_encodings.push_back("big-5");
[email protected]168d08722014-06-18 07:13:28439 TemplateURL url(data);
[email protected]ce7ee5f2014-06-16 23:41:19440 EXPECT_TRUE(url.url_ref().IsValid(search_terms_data_));
441 ASSERT_TRUE(url.url_ref().SupportsReplacement(search_terms_data_));
Avi Drissman2244c2d2018-12-25 23:08:02442 for (size_t i = 0; i < base::size(to_wide_cases); i++) {
[email protected]9b74ab52012-03-30 16:08:07443 EXPECT_EQ(to_wide_cases[i].expected_decoded_term,
[email protected]360ba052012-04-04 17:26:13444 url.url_ref().SearchTermToString16(
445 to_wide_cases[i].encoded_search_term));
[email protected]d82443b2009-01-15 19:54:56446 }
447}
448
[email protected]d82443b2009-01-15 19:54:56449TEST_F(TemplateURLTest, DisplayURLToURLRef) {
450 struct TestData {
[email protected]ddd231e2010-06-29 20:35:19451 const std::string url;
[email protected]0085863a2013-12-06 21:19:03452 const base::string16 expected_result;
[email protected]b37bdfe2012-03-16 20:53:27453 } test_data[] = {
[email protected]ddd231e2010-06-29 20:35:19454 { "http://foo{searchTerms}x{inputEncoding}y{outputEncoding}a",
[email protected]400b133f2011-01-19 18:32:30455 ASCIIToUTF16("http://foo%sx{inputEncoding}y{outputEncoding}a") },
[email protected]ddd231e2010-06-29 20:35:19456 { "http://X",
[email protected]400b133f2011-01-19 18:32:30457 ASCIIToUTF16("http://X") },
[email protected]ddd231e2010-06-29 20:35:19458 { "http://foo{searchTerms",
[email protected]400b133f2011-01-19 18:32:30459 ASCIIToUTF16("http://foo{searchTerms") },
[email protected]ddd231e2010-06-29 20:35:19460 { "http://foo{searchTerms}{language}",
[email protected]400b133f2011-01-19 18:32:30461 ASCIIToUTF16("http://foo%s{language}") },
[email protected]d82443b2009-01-15 19:54:56462 };
[email protected]573889f22012-04-07 01:31:54463 TemplateURLData data;
Avi Drissman2244c2d2018-12-25 23:08:02464 for (size_t i = 0; i < base::size(test_data); ++i) {
[email protected]573889f22012-04-07 01:31:54465 data.SetURL(test_data[i].url);
[email protected]168d08722014-06-18 07:13:28466 TemplateURL url(data);
[email protected]ce7ee5f2014-06-16 23:41:19467 EXPECT_EQ(test_data[i].expected_result,
468 url.url_ref().DisplayURL(search_terms_data_));
[email protected]b37bdfe2012-03-16 20:53:27469 EXPECT_EQ(test_data[i].url,
[email protected]ce7ee5f2014-06-16 23:41:19470 TemplateURLRef::DisplayURLToURLRef(
471 url.url_ref().DisplayURL(search_terms_data_)));
[email protected]d82443b2009-01-15 19:54:56472 }
473}
474
475TEST_F(TemplateURLTest, ReplaceSearchTerms) {
476 struct TestData {
[email protected]ddd231e2010-06-29 20:35:19477 const std::string url;
[email protected]d82443b2009-01-15 19:54:56478 const std::string expected_result;
[email protected]b37bdfe2012-03-16 20:53:27479 } test_data[] = {
[email protected]ddd231e2010-06-29 20:35:19480 { "http://foo/{language}{searchTerms}{inputEncoding}",
[email protected]d82443b2009-01-15 19:54:56481 "http://foo/{language}XUTF-8" },
[email protected]ddd231e2010-06-29 20:35:19482 { "http://foo/{language}{inputEncoding}{searchTerms}",
[email protected]d82443b2009-01-15 19:54:56483 "http://foo/{language}UTF-8X" },
[email protected]ddd231e2010-06-29 20:35:19484 { "http://foo/{searchTerms}{language}{inputEncoding}",
[email protected]d82443b2009-01-15 19:54:56485 "http://foo/X{language}UTF-8" },
[email protected]ddd231e2010-06-29 20:35:19486 { "http://foo/{searchTerms}{inputEncoding}{language}",
[email protected]d82443b2009-01-15 19:54:56487 "http://foo/XUTF-8{language}" },
[email protected]ddd231e2010-06-29 20:35:19488 { "http://foo/{inputEncoding}{searchTerms}{language}",
[email protected]d82443b2009-01-15 19:54:56489 "http://foo/UTF-8X{language}" },
[email protected]ddd231e2010-06-29 20:35:19490 { "http://foo/{inputEncoding}{language}{searchTerms}",
[email protected]d82443b2009-01-15 19:54:56491 "http://foo/UTF-8{language}X" },
[email protected]ddd231e2010-06-29 20:35:19492 { "http://foo/{language}a{searchTerms}a{inputEncoding}a",
[email protected]d82443b2009-01-15 19:54:56493 "http://foo/{language}aXaUTF-8a" },
[email protected]ddd231e2010-06-29 20:35:19494 { "http://foo/{language}a{inputEncoding}a{searchTerms}a",
[email protected]d82443b2009-01-15 19:54:56495 "http://foo/{language}aUTF-8aXa" },
[email protected]ddd231e2010-06-29 20:35:19496 { "http://foo/{searchTerms}a{language}a{inputEncoding}a",
[email protected]d82443b2009-01-15 19:54:56497 "http://foo/Xa{language}aUTF-8a" },
[email protected]ddd231e2010-06-29 20:35:19498 { "http://foo/{searchTerms}a{inputEncoding}a{language}a",
[email protected]d82443b2009-01-15 19:54:56499 "http://foo/XaUTF-8a{language}a" },
[email protected]ddd231e2010-06-29 20:35:19500 { "http://foo/{inputEncoding}a{searchTerms}a{language}a",
[email protected]d82443b2009-01-15 19:54:56501 "http://foo/UTF-8aXa{language}a" },
[email protected]ddd231e2010-06-29 20:35:19502 { "http://foo/{inputEncoding}a{language}a{searchTerms}a",
[email protected]d82443b2009-01-15 19:54:56503 "http://foo/UTF-8a{language}aXa" },
504 };
[email protected]573889f22012-04-07 01:31:54505 TemplateURLData data;
506 data.input_encodings.push_back("UTF-8");
Avi Drissman2244c2d2018-12-25 23:08:02507 for (size_t i = 0; i < base::size(test_data); ++i) {
[email protected]573889f22012-04-07 01:31:54508 data.SetURL(test_data[i].url);
[email protected]168d08722014-06-18 07:13:28509 TemplateURL url(data);
[email protected]ce7ee5f2014-06-16 23:41:19510 EXPECT_TRUE(url.url_ref().IsValid(search_terms_data_));
511 ASSERT_TRUE(url.url_ref().SupportsReplacement(search_terms_data_));
[email protected]b37bdfe2012-03-16 20:53:27512 std::string expected_result = test_data[i].expected_result;
brettwe6dae462015-06-24 20:54:45513 base::ReplaceSubstringsAfterOffset(
514 &expected_result, 0, "{language}",
515 search_terms_data_.GetApplicationLocale());
[email protected]bca359b2012-06-24 07:53:04516 GURL result(url.url_ref().ReplaceSearchTerms(
[email protected]ce7ee5f2014-06-16 23:41:19517 TemplateURLRef::SearchTermsArgs(ASCIIToUTF16("X")),
518 search_terms_data_));
[email protected]b37bdfe2012-03-16 20:53:27519 ASSERT_TRUE(result.is_valid());
[email protected]d82443b2009-01-15 19:54:56520 EXPECT_EQ(expected_result, result.spec());
521 }
522}
523
524
525// Tests replacing search terms in various encodings and making sure the
526// generated URL matches the expected value.
527TEST_F(TemplateURLTest, ReplaceArbitrarySearchTerms) {
528 struct TestData {
529 const std::string encoding;
[email protected]0085863a2013-12-06 21:19:03530 const base::string16 search_term;
[email protected]ddd231e2010-06-29 20:35:19531 const std::string url;
[email protected]d82443b2009-01-15 19:54:56532 const std::string expected_result;
[email protected]b37bdfe2012-03-16 20:53:27533 } test_data[] = {
Alexander Yashkin874b919d2018-02-17 15:11:18534 {"BIG5", base::WideToUTF16(L"\x60BD"),
535 "http://foo/?{searchTerms}{inputEncoding}", "http://foo/?%B1~BIG5"},
536 {"UTF-8", ASCIIToUTF16("blah"),
537 "http://foo/?{searchTerms}{inputEncoding}", "http://foo/?blahUTF-8"},
538 {"Shift_JIS", base::UTF8ToUTF16("\xe3\x81\x82"),
539 "http://foo/{searchTerms}/bar", "http://foo/%82%A0/bar"},
540 {"Shift_JIS", base::UTF8ToUTF16("\xe3\x81\x82 \xe3\x81\x84"),
541 "http://foo/{searchTerms}/bar", "http://foo/%82%A0%20%82%A2/bar"},
[email protected]d82443b2009-01-15 19:54:56542 };
[email protected]573889f22012-04-07 01:31:54543 TemplateURLData data;
Avi Drissman2244c2d2018-12-25 23:08:02544 for (size_t i = 0; i < base::size(test_data); ++i) {
[email protected]573889f22012-04-07 01:31:54545 data.SetURL(test_data[i].url);
546 data.input_encodings.clear();
547 data.input_encodings.push_back(test_data[i].encoding);
[email protected]168d08722014-06-18 07:13:28548 TemplateURL url(data);
[email protected]ce7ee5f2014-06-16 23:41:19549 EXPECT_TRUE(url.url_ref().IsValid(search_terms_data_));
550 ASSERT_TRUE(url.url_ref().SupportsReplacement(search_terms_data_));
[email protected]bca359b2012-06-24 07:53:04551 GURL result(url.url_ref().ReplaceSearchTerms(
[email protected]ce7ee5f2014-06-16 23:41:19552 TemplateURLRef::SearchTermsArgs(test_data[i].search_term),
553 search_terms_data_));
[email protected]bca359b2012-06-24 07:53:04554 ASSERT_TRUE(result.is_valid());
555 EXPECT_EQ(test_data[i].expected_result, result.spec());
556 }
557}
558
Alexander Yashkin874b919d2018-02-17 15:11:18559// Test that encoding with several optional codepages works as intended.
560// Codepages are tried in order, fallback is UTF-8.
561TEST_F(TemplateURLTest, ReplaceSearchTermsMultipleEncodings) {
562 struct TestData {
563 const std::vector<std::string> encodings;
564 const base::string16 search_term;
565 const std::string url;
566 const std::string expected_result;
567 } test_data[] = {
568 // First and third encodings are valid. First is used.
569 {{"windows-1251", "cp-866", "UTF-8"},
570 base::UTF8ToUTF16("\xD1\x8F"),
571 "http://foo/?{searchTerms}{inputEncoding}",
572 "http://foo/?%FFwindows-1251"},
573 // Second and third encodings are valid, second is used.
574 {{"cp-866", "GB2312", "UTF-8"},
575 base::UTF8ToUTF16("\xE7\x8B\x97"),
576 "http://foo/?{searchTerms}{inputEncoding}",
577 "http://foo/?%B9%B7GB2312"},
578 // Second and third encodings are valid in another order, second is used.
579 {{"cp-866", "UTF-8", "GB2312"},
580 base::UTF8ToUTF16("\xE7\x8B\x97"),
581 "http://foo/?{searchTerms}{inputEncoding}",
582 "http://foo/?%E7%8B%97UTF-8"},
583 // Both encodings are invalid, fallback to UTF-8.
584 {{"cp-866", "windows-1251"},
585 base::UTF8ToUTF16("\xE7\x8B\x97"),
586 "http://foo/?{searchTerms}{inputEncoding}",
587 "http://foo/?%E7%8B%97UTF-8"},
588 // No encodings are given, fallback to UTF-8.
589 {{},
590 base::UTF8ToUTF16("\xE7\x8B\x97"),
591 "http://foo/?{searchTerms}{inputEncoding}",
592 "http://foo/?%E7%8B%97UTF-8"},
593 };
594
595 TemplateURLData data;
Avi Drissman2244c2d2018-12-25 23:08:02596 for (size_t i = 0; i < base::size(test_data); ++i) {
Alexander Yashkin874b919d2018-02-17 15:11:18597 data.SetURL(test_data[i].url);
598 data.input_encodings = test_data[i].encodings;
599 TemplateURL url(data);
600 EXPECT_TRUE(url.url_ref().IsValid(search_terms_data_));
601 ASSERT_TRUE(url.url_ref().SupportsReplacement(search_terms_data_));
602 GURL result(url.url_ref().ReplaceSearchTerms(
603 TemplateURLRef::SearchTermsArgs(test_data[i].search_term),
604 search_terms_data_));
605 ASSERT_TRUE(result.is_valid());
606 EXPECT_EQ(test_data[i].expected_result, result.spec());
607 }
608}
609
[email protected]bca359b2012-06-24 07:53:04610// Tests replacing assisted query stats (AQS) in various scenarios.
611TEST_F(TemplateURLTest, ReplaceAssistedQueryStats) {
612 struct TestData {
[email protected]0085863a2013-12-06 21:19:03613 const base::string16 search_term;
[email protected]bca359b2012-06-24 07:53:04614 const std::string aqs;
615 const std::string base_url;
616 const std::string url;
617 const std::string expected_result;
618 } test_data[] = {
619 // No HTTPS, no AQS.
620 { ASCIIToUTF16("foo"),
621 "chrome.0.0l6",
622 "http://foo/",
623 "{google:baseURL}?{searchTerms}{google:assistedQueryStats}",
624 "http://foo/?foo" },
625 // HTTPS available, AQS should be replaced.
626 { ASCIIToUTF16("foo"),
627 "chrome.0.0l6",
628 "https://foo/",
629 "{google:baseURL}?{searchTerms}{google:assistedQueryStats}",
630 "https://foo/?fooaqs=chrome.0.0l6&" },
631 // HTTPS available, however AQS is empty.
632 { ASCIIToUTF16("foo"),
633 "",
634 "https://foo/",
635 "{google:baseURL}?{searchTerms}{google:assistedQueryStats}",
636 "https://foo/?foo" },
637 // No {google:baseURL} and protocol is HTTP, we must not substitute AQS.
638 { ASCIIToUTF16("foo"),
639 "chrome.0.0l6",
[email protected]798baa8e2014-06-20 05:42:44640 "http://www.google.com",
[email protected]bca359b2012-06-24 07:53:04641 "http://foo?{searchTerms}{google:assistedQueryStats}",
642 "http://foo/?foo" },
643 // A non-Google search provider with HTTPS should allow AQS.
644 { ASCIIToUTF16("foo"),
645 "chrome.0.0l6",
[email protected]798baa8e2014-06-20 05:42:44646 "https://www.google.com",
[email protected]bca359b2012-06-24 07:53:04647 "https://foo?{searchTerms}{google:assistedQueryStats}",
648 "https://foo/?fooaqs=chrome.0.0l6&" },
649 };
650 TemplateURLData data;
651 data.input_encodings.push_back("UTF-8");
Avi Drissman2244c2d2018-12-25 23:08:02652 for (size_t i = 0; i < base::size(test_data); ++i) {
[email protected]bca359b2012-06-24 07:53:04653 data.SetURL(test_data[i].url);
[email protected]168d08722014-06-18 07:13:28654 TemplateURL url(data);
[email protected]ce7ee5f2014-06-16 23:41:19655 EXPECT_TRUE(url.url_ref().IsValid(search_terms_data_));
656 ASSERT_TRUE(url.url_ref().SupportsReplacement(search_terms_data_));
[email protected]bca359b2012-06-24 07:53:04657 TemplateURLRef::SearchTermsArgs search_terms_args(test_data[i].search_term);
658 search_terms_args.assisted_query_stats = test_data[i].aqs;
[email protected]798baa8e2014-06-20 05:42:44659 search_terms_data_.set_google_base_url(test_data[i].base_url);
[email protected]ce7ee5f2014-06-16 23:41:19660 GURL result(url.url_ref().ReplaceSearchTerms(search_terms_args,
661 search_terms_data_));
[email protected]b37bdfe2012-03-16 20:53:27662 ASSERT_TRUE(result.is_valid());
663 EXPECT_EQ(test_data[i].expected_result, result.spec());
[email protected]d82443b2009-01-15 19:54:56664 }
665}
666
[email protected]00790562012-12-14 09:57:16667// Tests replacing cursor position.
668TEST_F(TemplateURLTest, ReplaceCursorPosition) {
669 struct TestData {
[email protected]0085863a2013-12-06 21:19:03670 const base::string16 search_term;
[email protected]00790562012-12-14 09:57:16671 size_t cursor_position;
672 const std::string url;
673 const std::string expected_result;
674 } test_data[] = {
675 { ASCIIToUTF16("foo"),
[email protected]0085863a2013-12-06 21:19:03676 base::string16::npos,
[email protected]00790562012-12-14 09:57:16677 "{google:baseURL}?{searchTerms}&{google:cursorPosition}",
678 "http://www.google.com/?foo&" },
679 { ASCIIToUTF16("foo"),
680 2,
681 "{google:baseURL}?{searchTerms}&{google:cursorPosition}",
682 "http://www.google.com/?foo&cp=2&" },
683 { ASCIIToUTF16("foo"),
684 15,
685 "{google:baseURL}?{searchTerms}&{google:cursorPosition}",
686 "http://www.google.com/?foo&cp=15&" },
687 };
688 TemplateURLData data;
689 data.input_encodings.push_back("UTF-8");
Avi Drissman2244c2d2018-12-25 23:08:02690 for (size_t i = 0; i < base::size(test_data); ++i) {
[email protected]00790562012-12-14 09:57:16691 data.SetURL(test_data[i].url);
[email protected]168d08722014-06-18 07:13:28692 TemplateURL url(data);
[email protected]ce7ee5f2014-06-16 23:41:19693 EXPECT_TRUE(url.url_ref().IsValid(search_terms_data_));
694 ASSERT_TRUE(url.url_ref().SupportsReplacement(search_terms_data_));
[email protected]00790562012-12-14 09:57:16695 TemplateURLRef::SearchTermsArgs search_terms_args(test_data[i].search_term);
696 search_terms_args.cursor_position = test_data[i].cursor_position;
[email protected]ce7ee5f2014-06-16 23:41:19697 GURL result(url.url_ref().ReplaceSearchTerms(search_terms_args,
698 search_terms_data_));
[email protected]00790562012-12-14 09:57:16699 ASSERT_TRUE(result.is_valid());
700 EXPECT_EQ(test_data[i].expected_result, result.spec());
701 }
702}
703
[email protected]420472b22014-06-10 13:34:43704// Tests replacing input type (&oit=).
705TEST_F(TemplateURLTest, ReplaceInputType) {
706 struct TestData {
707 const base::string16 search_term;
Steven Holte3696c9412017-08-24 18:38:03708 metrics::OmniboxInputType input_type;
[email protected]420472b22014-06-10 13:34:43709 const std::string url;
710 const std::string expected_result;
711 } test_data[] = {
Steven Holte3696c9412017-08-24 18:38:03712 {ASCIIToUTF16("foo"), metrics::OmniboxInputType::UNKNOWN,
713 "{google:baseURL}?{searchTerms}&{google:inputType}",
714 "http://www.google.com/?foo&oit=1&"},
715 {ASCIIToUTF16("foo"), metrics::OmniboxInputType::URL,
716 "{google:baseURL}?{searchTerms}&{google:inputType}",
717 "http://www.google.com/?foo&oit=3&"},
[email protected]420472b22014-06-10 13:34:43718 };
[email protected]420472b22014-06-10 13:34:43719 TemplateURLData data;
720 data.input_encodings.push_back("UTF-8");
Avi Drissman2244c2d2018-12-25 23:08:02721 for (size_t i = 0; i < base::size(test_data); ++i) {
[email protected]420472b22014-06-10 13:34:43722 data.SetURL(test_data[i].url);
[email protected]168d08722014-06-18 07:13:28723 TemplateURL url(data);
[email protected]ce7ee5f2014-06-16 23:41:19724 EXPECT_TRUE(url.url_ref().IsValid(search_terms_data_));
725 ASSERT_TRUE(url.url_ref().SupportsReplacement(search_terms_data_));
[email protected]420472b22014-06-10 13:34:43726 TemplateURLRef::SearchTermsArgs search_terms_args(test_data[i].search_term);
727 search_terms_args.input_type = test_data[i].input_type;
[email protected]ce7ee5f2014-06-16 23:41:19728 GURL result(url.url_ref().ReplaceSearchTerms(search_terms_args,
729 search_terms_data_));
[email protected]420472b22014-06-10 13:34:43730 ASSERT_TRUE(result.is_valid());
731 EXPECT_EQ(test_data[i].expected_result, result.spec());
732 }
733}
734
Tommy C. Li9a180482019-06-27 20:49:00735// Tests replacing omnibox focus type (&oft=).
736TEST_F(TemplateURLTest, ReplaceOmniboxFocusType) {
737 struct TestData {
738 const base::string16 search_term;
739 TemplateURLRef::SearchTermsArgs::OmniboxFocusType omnibox_focus_type;
740 const std::string url;
741 const std::string expected_result;
742 } test_data[] = {
743 {ASCIIToUTF16("foo"),
744 TemplateURLRef::SearchTermsArgs::OmniboxFocusType::DEFAULT,
745 "{google:baseURL}?{searchTerms}&{google:omniboxFocusType}",
746 "http://www.google.com/?foo&"},
747 {ASCIIToUTF16("foo"),
748 TemplateURLRef::SearchTermsArgs::OmniboxFocusType::ON_FOCUS,
749 "{google:baseURL}?{searchTerms}&{google:omniboxFocusType}",
750 "http://www.google.com/?foo&oft=1&"},
751 };
752 TemplateURLData data;
753 data.input_encodings.push_back("UTF-8");
754 for (size_t i = 0; i < base::size(test_data); ++i) {
755 data.SetURL(test_data[i].url);
756 TemplateURL url(data);
757 EXPECT_TRUE(url.url_ref().IsValid(search_terms_data_));
758 ASSERT_TRUE(url.url_ref().SupportsReplacement(search_terms_data_));
759 TemplateURLRef::SearchTermsArgs search_terms_args(test_data[i].search_term);
760 search_terms_args.omnibox_focus_type = test_data[i].omnibox_focus_type;
761 GURL result(url.url_ref().ReplaceSearchTerms(search_terms_args,
762 search_terms_data_));
763 ASSERT_TRUE(result.is_valid());
764 EXPECT_EQ(test_data[i].expected_result, result.spec());
765 }
766}
767
[email protected]9b9fa672013-11-07 06:04:52768// Tests replacing currentPageUrl.
769TEST_F(TemplateURLTest, ReplaceCurrentPageUrl) {
[email protected]800569d2013-05-06 07:38:48770 struct TestData {
[email protected]0085863a2013-12-06 21:19:03771 const base::string16 search_term;
[email protected]9b9fa672013-11-07 06:04:52772 const std::string current_page_url;
[email protected]800569d2013-05-06 07:38:48773 const std::string url;
774 const std::string expected_result;
775 } test_data[] = {
776 { ASCIIToUTF16("foo"),
777 "http://www.google.com/",
[email protected]9b9fa672013-11-07 06:04:52778 "{google:baseURL}?{searchTerms}&{google:currentPageUrl}",
[email protected]800569d2013-05-06 07:38:48779 "http://www.google.com/?foo&url=https%3A%2F%2Fptop.only.wip.la%3A443%2Fhttp%2Fwww.google.com%2F&" },
780 { ASCIIToUTF16("foo"),
781 "",
[email protected]9b9fa672013-11-07 06:04:52782 "{google:baseURL}?{searchTerms}&{google:currentPageUrl}",
[email protected]800569d2013-05-06 07:38:48783 "http://www.google.com/?foo&" },
784 { ASCIIToUTF16("foo"),
785 "http://g.com/+-/*&=",
[email protected]9b9fa672013-11-07 06:04:52786 "{google:baseURL}?{searchTerms}&{google:currentPageUrl}",
[email protected]800569d2013-05-06 07:38:48787 "http://www.google.com/?foo&url=https%3A%2F%2Fptop.only.wip.la%3A443%2Fhttp%2Fg.com%2F%2B-%2F*%26%3D&" },
788 };
789 TemplateURLData data;
790 data.input_encodings.push_back("UTF-8");
Avi Drissman2244c2d2018-12-25 23:08:02791 for (size_t i = 0; i < base::size(test_data); ++i) {
[email protected]800569d2013-05-06 07:38:48792 data.SetURL(test_data[i].url);
[email protected]168d08722014-06-18 07:13:28793 TemplateURL url(data);
[email protected]ce7ee5f2014-06-16 23:41:19794 EXPECT_TRUE(url.url_ref().IsValid(search_terms_data_));
795 ASSERT_TRUE(url.url_ref().SupportsReplacement(search_terms_data_));
[email protected]800569d2013-05-06 07:38:48796 TemplateURLRef::SearchTermsArgs search_terms_args(test_data[i].search_term);
[email protected]9b9fa672013-11-07 06:04:52797 search_terms_args.current_page_url = test_data[i].current_page_url;
[email protected]ce7ee5f2014-06-16 23:41:19798 GURL result(url.url_ref().ReplaceSearchTerms(search_terms_args,
799 search_terms_data_));
[email protected]800569d2013-05-06 07:38:48800 ASSERT_TRUE(result.is_valid());
801 EXPECT_EQ(test_data[i].expected_result, result.spec());
802 }
803}
804
Pavel Yatsuk0d6a7b5c2019-10-09 20:33:44805// Tests appending attribution parameter to queries originating from Play API
806// search engine.
807TEST_F(TemplateURLTest, PlayAPIAttribution) {
808 const struct TestData {
809 const char* url;
810 base::string16 terms;
811 bool created_from_play_api;
812 const char* output;
813 } test_data[] = {{"http://foo/?q={searchTerms}", ASCIIToUTF16("bar"), false,
814 "http://foo/?q=bar"},
815 {"http://foo/?q={searchTerms}", ASCIIToUTF16("bar"), true,
816 "http://foo/?q=bar&chrome_dse_attribution=1"}};
817 TemplateURLData data;
818 for (size_t i = 0; i < base::size(test_data); ++i) {
819 data.SetURL(test_data[i].url);
820 data.created_from_play_api = test_data[i].created_from_play_api;
821 TemplateURL url(data);
822 EXPECT_TRUE(url.url_ref().IsValid(search_terms_data_));
823 ASSERT_TRUE(url.url_ref().SupportsReplacement(search_terms_data_));
824 GURL result(url.url_ref().ReplaceSearchTerms(
825 TemplateURLRef::SearchTermsArgs(test_data[i].terms),
826 search_terms_data_));
827 ASSERT_TRUE(result.is_valid());
828 EXPECT_EQ(test_data[i].output, result.spec());
829 }
830}
831
[email protected]d82443b2009-01-15 19:54:56832TEST_F(TemplateURLTest, Suggestions) {
833 struct TestData {
834 const int accepted_suggestion;
[email protected]0085863a2013-12-06 21:19:03835 const base::string16 original_query_for_suggestion;
[email protected]d82443b2009-01-15 19:54:56836 const std::string expected_result;
[email protected]b37bdfe2012-03-16 20:53:27837 } test_data[] = {
[email protected]0085863a2013-12-06 21:19:03838 { TemplateURLRef::NO_SUGGESTIONS_AVAILABLE, base::string16(),
[email protected]29653892013-03-02 19:25:37839 "http://bar/foo?q=foobar" },
[email protected]400b133f2011-01-19 18:32:30840 { TemplateURLRef::NO_SUGGESTIONS_AVAILABLE, ASCIIToUTF16("foo"),
[email protected]29653892013-03-02 19:25:37841 "http://bar/foo?q=foobar" },
[email protected]0085863a2013-12-06 21:19:03842 { TemplateURLRef::NO_SUGGESTION_CHOSEN, base::string16(),
[email protected]29653892013-03-02 19:25:37843 "http://bar/foo?q=foobar" },
[email protected]400b133f2011-01-19 18:32:30844 { TemplateURLRef::NO_SUGGESTION_CHOSEN, ASCIIToUTF16("foo"),
[email protected]29653892013-03-02 19:25:37845 "http://bar/foo?q=foobar" },
[email protected]0085863a2013-12-06 21:19:03846 { 0, base::string16(), "http://bar/foo?oq=&q=foobar" },
[email protected]29653892013-03-02 19:25:37847 { 1, ASCIIToUTF16("foo"), "http://bar/foo?oq=foo&q=foobar" },
[email protected]d82443b2009-01-15 19:54:56848 };
[email protected]573889f22012-04-07 01:31:54849 TemplateURLData data;
[email protected]29653892013-03-02 19:25:37850 data.SetURL("http://bar/foo?{google:originalQueryForSuggestion}"
851 "q={searchTerms}");
[email protected]573889f22012-04-07 01:31:54852 data.input_encodings.push_back("UTF-8");
[email protected]168d08722014-06-18 07:13:28853 TemplateURL url(data);
[email protected]ce7ee5f2014-06-16 23:41:19854 EXPECT_TRUE(url.url_ref().IsValid(search_terms_data_));
855 ASSERT_TRUE(url.url_ref().SupportsReplacement(search_terms_data_));
Avi Drissman2244c2d2018-12-25 23:08:02856 for (size_t i = 0; i < base::size(test_data); ++i) {
[email protected]bca359b2012-06-24 07:53:04857 TemplateURLRef::SearchTermsArgs search_terms_args(
858 ASCIIToUTF16("foobar"));
859 search_terms_args.accepted_suggestion = test_data[i].accepted_suggestion;
860 search_terms_args.original_query =
861 test_data[i].original_query_for_suggestion;
[email protected]ce7ee5f2014-06-16 23:41:19862 GURL result(url.url_ref().ReplaceSearchTerms(search_terms_args,
863 search_terms_data_));
[email protected]b37bdfe2012-03-16 20:53:27864 ASSERT_TRUE(result.is_valid());
865 EXPECT_EQ(test_data[i].expected_result, result.spec());
[email protected]d82443b2009-01-15 19:54:56866 }
867}
868
[email protected]81f808de2009-09-25 01:36:34869TEST_F(TemplateURLTest, RLZ) {
[email protected]798baa8e2014-06-20 05:42:44870 base::string16 rlz_string = search_terms_data_.GetRlzParameterValue(false);
[email protected]d82443b2009-01-15 19:54:56871
[email protected]573889f22012-04-07 01:31:54872 TemplateURLData data;
873 data.SetURL("http://bar/?{google:RLZ}{searchTerms}");
[email protected]168d08722014-06-18 07:13:28874 TemplateURL url(data);
[email protected]ce7ee5f2014-06-16 23:41:19875 EXPECT_TRUE(url.url_ref().IsValid(search_terms_data_));
876 ASSERT_TRUE(url.url_ref().SupportsReplacement(search_terms_data_));
[email protected]bca359b2012-06-24 07:53:04877 GURL result(url.url_ref().ReplaceSearchTerms(
[email protected]ce7ee5f2014-06-16 23:41:19878 TemplateURLRef::SearchTermsArgs(ASCIIToUTF16("x")), search_terms_data_));
[email protected]d82443b2009-01-15 19:54:56879 ASSERT_TRUE(result.is_valid());
[email protected]798baa8e2014-06-20 05:42:44880 EXPECT_EQ("http://bar/?rlz=" + base::UTF16ToUTF8(rlz_string) + "&x",
881 result.spec());
[email protected]d82443b2009-01-15 19:54:56882}
883
[email protected]c8ccc41d2014-04-10 04:42:12884TEST_F(TemplateURLTest, RLZFromAppList) {
[email protected]798baa8e2014-06-20 05:42:44885 base::string16 rlz_string = search_terms_data_.GetRlzParameterValue(true);
[email protected]c8ccc41d2014-04-10 04:42:12886
887 TemplateURLData data;
888 data.SetURL("http://bar/?{google:RLZ}{searchTerms}");
[email protected]168d08722014-06-18 07:13:28889 TemplateURL url(data);
[email protected]ce7ee5f2014-06-16 23:41:19890 EXPECT_TRUE(url.url_ref().IsValid(search_terms_data_));
891 ASSERT_TRUE(url.url_ref().SupportsReplacement(search_terms_data_));
[email protected]c8ccc41d2014-04-10 04:42:12892 TemplateURLRef::SearchTermsArgs args(ASCIIToUTF16("x"));
893 args.from_app_list = true;
[email protected]ce7ee5f2014-06-16 23:41:19894 GURL result(url.url_ref().ReplaceSearchTerms(args, search_terms_data_));
[email protected]c8ccc41d2014-04-10 04:42:12895 ASSERT_TRUE(result.is_valid());
[email protected]798baa8e2014-06-20 05:42:44896 EXPECT_EQ("http://bar/?rlz=" + base::UTF16ToUTF8(rlz_string) + "&x",
897 result.spec());
[email protected]c8ccc41d2014-04-10 04:42:12898}
[email protected]c8ccc41d2014-04-10 04:42:12899
[email protected]d82443b2009-01-15 19:54:56900TEST_F(TemplateURLTest, HostAndSearchTermKey) {
901 struct TestData {
[email protected]ddd231e2010-06-29 20:35:19902 const std::string url;
[email protected]d82443b2009-01-15 19:54:56903 const std::string host;
904 const std::string path;
905 const std::string search_term_key;
[email protected]573889f22012-04-07 01:31:54906 } test_data[] = {
vitbarf2a11562017-05-15 14:09:50907 {"http://blah/?foo=bar&q={searchTerms}&b=x", "blah", "/", "q"},
908 {"http://blah/{searchTerms}", "blah", "", ""},
[email protected]d82443b2009-01-15 19:54:56909
vitbarf2a11562017-05-15 14:09:50910 // No term should result in empty values.
911 {"http://blah/", "", "", ""},
[email protected]d82443b2009-01-15 19:54:56912
vitbarf2a11562017-05-15 14:09:50913 // Multiple terms should result in empty values.
914 {"http://blah/?q={searchTerms}&x={searchTerms}", "", "", ""},
[email protected]d82443b2009-01-15 19:54:56915
vitbarf2a11562017-05-15 14:09:50916 // Term in the host shouldn't match.
917 {"http://{searchTerms}", "", "", ""},
[email protected]d82443b2009-01-15 19:54:56918
vitbarf2a11562017-05-15 14:09:50919 {"http://blah/?q={searchTerms}", "blah", "/", "q"},
920 {"https://blah/?q={searchTerms}", "blah", "/", "q"},
[email protected]d82443b2009-01-15 19:54:56921
vitbarf2a11562017-05-15 14:09:50922 // Single term with extra chars in value should match.
923 {"http://blah/?q=stock:{searchTerms}", "blah", "/", "q"},
[email protected]d82443b2009-01-15 19:54:56924 };
925
Avi Drissman2244c2d2018-12-25 23:08:02926 for (size_t i = 0; i < base::size(test_data); ++i) {
[email protected]573889f22012-04-07 01:31:54927 TemplateURLData data;
928 data.SetURL(test_data[i].url);
[email protected]168d08722014-06-18 07:13:28929 TemplateURL url(data);
[email protected]ce7ee5f2014-06-16 23:41:19930 EXPECT_EQ(test_data[i].host, url.url_ref().GetHost(search_terms_data_));
931 EXPECT_EQ(test_data[i].path, url.url_ref().GetPath(search_terms_data_));
932 EXPECT_EQ(test_data[i].search_term_key,
933 url.url_ref().GetSearchTermKey(search_terms_data_));
[email protected]d82443b2009-01-15 19:54:56934 }
935}
936
alexmos294849f2015-03-14 00:55:06937TEST_F(TemplateURLTest, SearchTermKeyLocation) {
938 struct TestData {
939 const std::string url;
940 const url::Parsed::ComponentType location;
941 const std::string path;
vitbarf2a11562017-05-15 14:09:50942 const std::string key;
943 const std::string value_prefix;
944 const std::string value_suffix;
alexmos294849f2015-03-14 00:55:06945 } test_data[] = {
vitbarf2a11562017-05-15 14:09:50946 {"http://blah/{searchTerms}/", url::Parsed::PATH, "", "", "/", "/"},
947 {"http://blah/{searchTerms}", url::Parsed::PATH, "", "", "/", ""},
948 {"http://blah/begin/{searchTerms}/end", url::Parsed::PATH, "", "",
949 "/begin/", "/end"},
950 {"http://blah/?foo=bar&q={searchTerms}&b=x", url::Parsed::QUERY, "/", "q",
951 "", ""},
952 {"http://blah/?foo=bar#x={searchTerms}&b=x", url::Parsed::REF, "/", "x",
953 "", ""},
954 {"http://www.example.com/?q=chromium-{searchTerms}@chromium.org/info",
955 url::Parsed::QUERY, "/", "q", "chromium-", "@chromium.org/info"},
alexmos294849f2015-03-14 00:55:06956
vitbarf2a11562017-05-15 14:09:50957 // searchTerms is a key, not a value, so this should result in an empty
958 // value.
959 {"http://blah/?foo=bar#x=012345678901234&a=b&{searchTerms}=x",
960 url::Parsed::QUERY, "", "", "", ""},
alexmos294849f2015-03-14 00:55:06961
vitbarf2a11562017-05-15 14:09:50962 // Multiple search terms should result in empty values.
963 {"http://blah/{searchTerms}?q={searchTerms}", url::Parsed::QUERY, "", "",
964 "", ""},
965 {"http://blah/{searchTerms}#x={searchTerms}", url::Parsed::QUERY, "", "",
966 "", ""},
967 {"http://blah/?q={searchTerms}#x={searchTerms}", url::Parsed::QUERY, "",
968 "", "", ""},
alexmos294849f2015-03-14 00:55:06969 };
970
Avi Drissman2244c2d2018-12-25 23:08:02971 for (size_t i = 0; i < base::size(test_data); ++i) {
alexmos294849f2015-03-14 00:55:06972 TemplateURLData data;
973 data.SetURL(test_data[i].url);
974 TemplateURL url(data);
975 EXPECT_EQ(test_data[i].location,
976 url.url_ref().GetSearchTermKeyLocation(search_terms_data_));
977 EXPECT_EQ(test_data[i].path,
978 url.url_ref().GetPath(search_terms_data_));
vitbarf2a11562017-05-15 14:09:50979 EXPECT_EQ(test_data[i].key,
980 url.url_ref().GetSearchTermKey(search_terms_data_));
981 EXPECT_EQ(test_data[i].value_prefix,
982 url.url_ref().GetSearchTermValuePrefix(search_terms_data_));
983 EXPECT_EQ(test_data[i].value_suffix,
984 url.url_ref().GetSearchTermValueSuffix(search_terms_data_));
alexmos294849f2015-03-14 00:55:06985 }
986}
987
[email protected]d82443b2009-01-15 19:54:56988TEST_F(TemplateURLTest, GoogleBaseSuggestURL) {
989 static const struct {
[email protected]ddd231e2010-06-29 20:35:19990 const char* const base_url;
991 const char* const base_suggest_url;
[email protected]d82443b2009-01-15 19:54:56992 } data[] = {
[email protected]014010e2011-10-01 04:12:44993 { "http://google.com/", "http://google.com/complete/", },
994 { "http://www.google.com/", "http://www.google.com/complete/", },
995 { "http://www.google.co.uk/", "http://www.google.co.uk/complete/", },
996 { "http://www.google.com.by/", "http://www.google.com.by/complete/", },
997 { "http://google.com/intl/xx/", "http://google.com/complete/", },
[email protected]d82443b2009-01-15 19:54:56998 };
999
Avi Drissman2244c2d2018-12-25 23:08:021000 for (size_t i = 0; i < base::size(data); ++i)
[email protected]d82443b2009-01-15 19:54:561001 CheckSuggestBaseURL(data[i].base_url, data[i].base_suggest_url);
1002}
1003
[email protected]81c6ef62010-01-21 09:58:471004TEST_F(TemplateURLTest, ParseParameterKnown) {
[email protected]ddd231e2010-06-29 20:35:191005 std::string parsed_url("{searchTerms}");
[email protected]573889f22012-04-07 01:31:541006 TemplateURLData data;
1007 data.SetURL(parsed_url);
[email protected]168d08722014-06-18 07:13:281008 TemplateURL url(data);
[email protected]81c6ef62010-01-21 09:58:471009 TemplateURLRef::Replacements replacements;
[email protected]360ba052012-04-04 17:26:131010 EXPECT_TRUE(url.url_ref().ParseParameter(0, 12, &parsed_url, &replacements));
[email protected]ddd231e2010-06-29 20:35:191011 EXPECT_EQ(std::string(), parsed_url);
[email protected]81c6ef62010-01-21 09:58:471012 ASSERT_EQ(1U, replacements.size());
[email protected]b37bdfe2012-03-16 20:53:271013 EXPECT_EQ(0U, replacements[0].index);
[email protected]81c6ef62010-01-21 09:58:471014 EXPECT_EQ(TemplateURLRef::SEARCH_TERMS, replacements[0].type);
1015}
1016
1017TEST_F(TemplateURLTest, ParseParameterUnknown) {
[email protected]243abf32012-05-15 18:28:201018 std::string parsed_url("{fhqwhgads}abc");
[email protected]573889f22012-04-07 01:31:541019 TemplateURLData data;
1020 data.SetURL(parsed_url);
[email protected]168d08722014-06-18 07:13:281021 TemplateURL url(data);
[email protected]81c6ef62010-01-21 09:58:471022 TemplateURLRef::Replacements replacements;
[email protected]1a257262011-06-28 22:15:441023
1024 // By default, TemplateURLRef should not consider itself prepopulated.
1025 // Therefore we should not replace the unknown parameter.
[email protected]360ba052012-04-04 17:26:131026 EXPECT_FALSE(url.url_ref().ParseParameter(0, 10, &parsed_url, &replacements));
[email protected]243abf32012-05-15 18:28:201027 EXPECT_EQ("{fhqwhgads}abc", parsed_url);
[email protected]1a257262011-06-28 22:15:441028 EXPECT_TRUE(replacements.empty());
1029
1030 // If the TemplateURLRef is prepopulated, we should remove unknown parameters.
[email protected]243abf32012-05-15 18:28:201031 parsed_url = "{fhqwhgads}abc";
[email protected]573889f22012-04-07 01:31:541032 data.prepopulate_id = 1;
[email protected]168d08722014-06-18 07:13:281033 TemplateURL url2(data);
[email protected]495c30b2012-05-15 18:48:151034 EXPECT_TRUE(url2.url_ref().ParseParameter(0, 10, &parsed_url, &replacements));
[email protected]243abf32012-05-15 18:28:201035 EXPECT_EQ("abc", parsed_url);
[email protected]81c6ef62010-01-21 09:58:471036 EXPECT_TRUE(replacements.empty());
1037}
1038
1039TEST_F(TemplateURLTest, ParseURLEmpty) {
[email protected]168d08722014-06-18 07:13:281040 TemplateURL url((TemplateURLData()));
[email protected]81c6ef62010-01-21 09:58:471041 TemplateURLRef::Replacements replacements;
1042 bool valid = false;
Ivan Kotenkov75b1c3a2017-10-24 14:47:241043 EXPECT_EQ(std::string(), url.url_ref().ParseURL(std::string(), &replacements,
1044 nullptr, &valid));
[email protected]81c6ef62010-01-21 09:58:471045 EXPECT_TRUE(replacements.empty());
1046 EXPECT_TRUE(valid);
1047}
1048
1049TEST_F(TemplateURLTest, ParseURLNoTemplateEnd) {
[email protected]573889f22012-04-07 01:31:541050 TemplateURLData data;
1051 data.SetURL("{");
[email protected]168d08722014-06-18 07:13:281052 TemplateURL url(data);
[email protected]81c6ef62010-01-21 09:58:471053 TemplateURLRef::Replacements replacements;
1054 bool valid = false;
Ivan Kotenkov75b1c3a2017-10-24 14:47:241055 EXPECT_EQ(std::string(),
1056 url.url_ref().ParseURL("{", &replacements, nullptr, &valid));
[email protected]81c6ef62010-01-21 09:58:471057 EXPECT_TRUE(replacements.empty());
1058 EXPECT_FALSE(valid);
1059}
1060
1061TEST_F(TemplateURLTest, ParseURLNoKnownParameters) {
[email protected]573889f22012-04-07 01:31:541062 TemplateURLData data;
1063 data.SetURL("{}");
[email protected]168d08722014-06-18 07:13:281064 TemplateURL url(data);
[email protected]81c6ef62010-01-21 09:58:471065 TemplateURLRef::Replacements replacements;
1066 bool valid = false;
Ivan Kotenkov75b1c3a2017-10-24 14:47:241067 EXPECT_EQ("{}", url.url_ref().ParseURL("{}", &replacements, nullptr, &valid));
[email protected]81c6ef62010-01-21 09:58:471068 EXPECT_TRUE(replacements.empty());
1069 EXPECT_TRUE(valid);
1070}
1071
1072TEST_F(TemplateURLTest, ParseURLTwoParameters) {
[email protected]573889f22012-04-07 01:31:541073 TemplateURLData data;
1074 data.SetURL("{}{{%s}}");
[email protected]168d08722014-06-18 07:13:281075 TemplateURL url(data);
[email protected]81c6ef62010-01-21 09:58:471076 TemplateURLRef::Replacements replacements;
1077 bool valid = false;
Ivan Kotenkov75b1c3a2017-10-24 14:47:241078 EXPECT_EQ("{}{}", url.url_ref().ParseURL("{}{{searchTerms}}", &replacements,
1079 nullptr, &valid));
[email protected]81c6ef62010-01-21 09:58:471080 ASSERT_EQ(1U, replacements.size());
[email protected]b37bdfe2012-03-16 20:53:271081 EXPECT_EQ(3U, replacements[0].index);
[email protected]81c6ef62010-01-21 09:58:471082 EXPECT_EQ(TemplateURLRef::SEARCH_TERMS, replacements[0].type);
1083 EXPECT_TRUE(valid);
1084}
1085
1086TEST_F(TemplateURLTest, ParseURLNestedParameter) {
[email protected]573889f22012-04-07 01:31:541087 TemplateURLData data;
1088 data.SetURL("{%s");
[email protected]168d08722014-06-18 07:13:281089 TemplateURL url(data);
[email protected]81c6ef62010-01-21 09:58:471090 TemplateURLRef::Replacements replacements;
1091 bool valid = false;
Ivan Kotenkov75b1c3a2017-10-24 14:47:241092 EXPECT_EQ("{", url.url_ref().ParseURL("{{searchTerms}", &replacements,
1093 nullptr, &valid));
[email protected]81c6ef62010-01-21 09:58:471094 ASSERT_EQ(1U, replacements.size());
[email protected]b37bdfe2012-03-16 20:53:271095 EXPECT_EQ(1U, replacements[0].index);
[email protected]81c6ef62010-01-21 09:58:471096 EXPECT_EQ(TemplateURLRef::SEARCH_TERMS, replacements[0].type);
1097 EXPECT_TRUE(valid);
1098}
[email protected]5b3078752012-10-09 18:54:161099
[email protected]fd6d8822012-12-08 06:56:111100TEST_F(TemplateURLTest, SearchClient) {
1101 const std::string base_url_str("http://google.com/?");
1102 const std::string terms_str("{searchTerms}&{google:searchClient}");
1103 const std::string full_url_str = base_url_str + terms_str;
[email protected]0085863a2013-12-06 21:19:031104 const base::string16 terms(ASCIIToUTF16(terms_str));
[email protected]798baa8e2014-06-20 05:42:441105 search_terms_data_.set_google_base_url(base_url_str);
[email protected]fd6d8822012-12-08 06:56:111106
1107 TemplateURLData data;
1108 data.SetURL(full_url_str);
[email protected]168d08722014-06-18 07:13:281109 TemplateURL url(data);
[email protected]ce7ee5f2014-06-16 23:41:191110 EXPECT_TRUE(url.url_ref().IsValid(search_terms_data_));
1111 ASSERT_TRUE(url.url_ref().SupportsReplacement(search_terms_data_));
[email protected]fd6d8822012-12-08 06:56:111112 TemplateURLRef::SearchTermsArgs search_terms_args(ASCIIToUTF16("foobar"));
1113
1114 // Check that the URL is correct when a client is not present.
[email protected]ce7ee5f2014-06-16 23:41:191115 GURL result(url.url_ref().ReplaceSearchTerms(search_terms_args,
1116 search_terms_data_));
[email protected]fd6d8822012-12-08 06:56:111117 ASSERT_TRUE(result.is_valid());
1118 EXPECT_EQ("http://google.com/?foobar&", result.spec());
1119
1120 // Check that the URL is correct when a client is present.
[email protected]798baa8e2014-06-20 05:42:441121 search_terms_data_.set_search_client("search_client");
[email protected]ce7ee5f2014-06-16 23:41:191122 GURL result_2(url.url_ref().ReplaceSearchTerms(search_terms_args,
1123 search_terms_data_));
[email protected]fd6d8822012-12-08 06:56:111124 ASSERT_TRUE(result_2.is_valid());
[email protected]798baa8e2014-06-20 05:42:441125 EXPECT_EQ("http://google.com/?foobar&client=search_client&", result_2.spec());
[email protected]fd6d8822012-12-08 06:56:111126}
[email protected]fd6d8822012-12-08 06:56:111127
[email protected]5b3078752012-10-09 18:54:161128TEST_F(TemplateURLTest, GetURLNoSuggestionsURL) {
1129 TemplateURLData data;
1130 data.SetURL("http://google.com/?q={searchTerms}");
[email protected]5b3078752012-10-09 18:54:161131 data.alternate_urls.push_back("http://google.com/alt?q={searchTerms}");
1132 data.alternate_urls.push_back("{google:baseURL}/alt/#q={searchTerms}");
[email protected]168d08722014-06-18 07:13:281133 TemplateURL url(data);
vitbar5bd8c252016-01-29 18:44:511134 const std::vector<TemplateURLRef>& url_refs = url.url_refs();
1135 ASSERT_EQ(3U, url_refs.size());
1136 EXPECT_EQ("http://google.com/alt?q={searchTerms}", url_refs[0].GetURL());
1137 EXPECT_EQ("{google:baseURL}/alt/#q={searchTerms}", url_refs[1].GetURL());
1138 EXPECT_EQ("http://google.com/?q={searchTerms}", url_refs[2].GetURL());
[email protected]5b3078752012-10-09 18:54:161139}
1140
1141TEST_F(TemplateURLTest, GetURLOnlyOneURL) {
1142 TemplateURLData data;
1143 data.SetURL("http://www.google.co.uk/");
[email protected]168d08722014-06-18 07:13:281144 TemplateURL url(data);
vitbar5bd8c252016-01-29 18:44:511145 const std::vector<TemplateURLRef>& url_refs = url.url_refs();
1146 ASSERT_EQ(1U, url_refs.size());
1147 EXPECT_EQ("http://www.google.co.uk/", url_refs[0].GetURL());
[email protected]5b3078752012-10-09 18:54:161148}
1149
1150TEST_F(TemplateURLTest, ExtractSearchTermsFromURL) {
1151 TemplateURLData data;
1152 data.SetURL("http://google.com/?q={searchTerms}");
[email protected]5b3078752012-10-09 18:54:161153 data.alternate_urls.push_back("http://google.com/alt/#q={searchTerms}");
1154 data.alternate_urls.push_back(
1155 "http://google.com/alt/?ext=foo&q={searchTerms}#ref=bar");
[email protected]168d08722014-06-18 07:13:281156 TemplateURL url(data);
[email protected]0085863a2013-12-06 21:19:031157 base::string16 result;
[email protected]5b3078752012-10-09 18:54:161158
1159 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
[email protected]ce7ee5f2014-06-16 23:41:191160 GURL("http://google.com/?q=something"), search_terms_data_, &result));
[email protected]4076ea62013-01-09 01:47:191161 EXPECT_EQ(ASCIIToUTF16("something"), result);
1162
1163 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
Marc Treibf0f6afc92017-10-04 09:05:471164 GURL("http://google.com/?q=something"), search_terms_data_, &result));
[email protected]4076ea62013-01-09 01:47:191165 EXPECT_EQ(ASCIIToUTF16("something"), result);
1166
1167 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
Marc Treibf0f6afc92017-10-04 09:05:471168 GURL("http://google.com/?q=something"), search_terms_data_, &result));
[email protected]4076ea62013-01-09 01:47:191169 EXPECT_EQ(ASCIIToUTF16("something"), result);
1170
1171 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
Marc Treibf0f6afc92017-10-04 09:05:471172 GURL("http://google.com/?q=something"), search_terms_data_, &result));
[email protected]4076ea62013-01-09 01:47:191173 EXPECT_EQ(ASCIIToUTF16("something"), result);
1174
1175 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
[email protected]ce7ee5f2014-06-16 23:41:191176 GURL("http://google.com/alt/#q=something"),
1177 search_terms_data_, &result));
[email protected]4076ea62013-01-09 01:47:191178 EXPECT_EQ(ASCIIToUTF16("something"), result);
1179
1180 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
Marc Treibf0f6afc92017-10-04 09:05:471181 GURL("http://google.com/alt/#q=something"), search_terms_data_, &result));
[email protected]4076ea62013-01-09 01:47:191182 EXPECT_EQ(ASCIIToUTF16("something"), result);
1183
1184 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
Marc Treibf0f6afc92017-10-04 09:05:471185 GURL("http://google.com/alt/#q=something"), search_terms_data_, &result));
[email protected]4076ea62013-01-09 01:47:191186 EXPECT_EQ(ASCIIToUTF16("something"), result);
1187
1188 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
Marc Treibf0f6afc92017-10-04 09:05:471189 GURL("http://google.com/alt/#q=something"), search_terms_data_, &result));
[email protected]5b3078752012-10-09 18:54:161190 EXPECT_EQ(ASCIIToUTF16("something"), result);
1191
1192 EXPECT_FALSE(url.ExtractSearchTermsFromURL(
[email protected]ce7ee5f2014-06-16 23:41:191193 GURL("http://google.ca/?q=something"), search_terms_data_, &result));
[email protected]b959d7d42013-12-13 17:26:371194 EXPECT_EQ(base::string16(), result);
[email protected]5b3078752012-10-09 18:54:161195
1196 EXPECT_FALSE(url.ExtractSearchTermsFromURL(
[email protected]ce7ee5f2014-06-16 23:41:191197 GURL("http://google.ca/?q=something&q=anything"),
1198 search_terms_data_, &result));
[email protected]b959d7d42013-12-13 17:26:371199 EXPECT_EQ(base::string16(), result);
[email protected]67d8b752013-04-03 17:33:271200
1201 EXPECT_FALSE(url.ExtractSearchTermsFromURL(
[email protected]ce7ee5f2014-06-16 23:41:191202 GURL("http://google.com/foo/?q=foo"), search_terms_data_, &result));
[email protected]b959d7d42013-12-13 17:26:371203 EXPECT_EQ(base::string16(), result);
[email protected]5b3078752012-10-09 18:54:161204
[email protected]32e2d81b2012-10-16 19:03:251205 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
[email protected]ce7ee5f2014-06-16 23:41:191206 GURL("https://google.com/?q=foo"), search_terms_data_, &result));
[email protected]32e2d81b2012-10-16 19:03:251207 EXPECT_EQ(ASCIIToUTF16("foo"), result);
[email protected]5b3078752012-10-09 18:54:161208
1209 EXPECT_FALSE(url.ExtractSearchTermsFromURL(
[email protected]ce7ee5f2014-06-16 23:41:191210 GURL("http://google.com:8080/?q=foo"), search_terms_data_, &result));
[email protected]b959d7d42013-12-13 17:26:371211 EXPECT_EQ(base::string16(), result);
[email protected]5b3078752012-10-09 18:54:161212
1213 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
[email protected]ce7ee5f2014-06-16 23:41:191214 GURL("http://google.com/?q=1+2+3&b=456"), search_terms_data_, &result));
[email protected]5b3078752012-10-09 18:54:161215 EXPECT_EQ(ASCIIToUTF16("1 2 3"), result);
1216
1217 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
[email protected]ce7ee5f2014-06-16 23:41:191218 GURL("http://google.com/alt/?q=123#q=456"),
1219 search_terms_data_, &result));
[email protected]5b3078752012-10-09 18:54:161220 EXPECT_EQ(ASCIIToUTF16("456"), result);
1221
1222 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
[email protected]ce7ee5f2014-06-16 23:41:191223 GURL("http://google.com/alt/?a=012&q=123&b=456#f=789"),
1224 search_terms_data_, &result));
[email protected]5b3078752012-10-09 18:54:161225 EXPECT_EQ(ASCIIToUTF16("123"), result);
1226
1227 EXPECT_TRUE(url.ExtractSearchTermsFromURL(GURL(
[email protected]ce7ee5f2014-06-16 23:41:191228 "http://google.com/alt/?a=012&q=123&b=456#j=abc&q=789&h=def9"),
1229 search_terms_data_, &result));
[email protected]5b3078752012-10-09 18:54:161230 EXPECT_EQ(ASCIIToUTF16("789"), result);
1231
1232 EXPECT_FALSE(url.ExtractSearchTermsFromURL(
[email protected]ce7ee5f2014-06-16 23:41:191233 GURL("http://google.com/alt/?q="), search_terms_data_, &result));
[email protected]b959d7d42013-12-13 17:26:371234 EXPECT_EQ(base::string16(), result);
[email protected]5b3078752012-10-09 18:54:161235
1236 EXPECT_FALSE(url.ExtractSearchTermsFromURL(
[email protected]ce7ee5f2014-06-16 23:41:191237 GURL("http://google.com/alt/?#q="), search_terms_data_, &result));
[email protected]b959d7d42013-12-13 17:26:371238 EXPECT_EQ(base::string16(), result);
[email protected]5b3078752012-10-09 18:54:161239
1240 EXPECT_FALSE(url.ExtractSearchTermsFromURL(
[email protected]ce7ee5f2014-06-16 23:41:191241 GURL("http://google.com/alt/?q=#q="), search_terms_data_, &result));
[email protected]b959d7d42013-12-13 17:26:371242 EXPECT_EQ(base::string16(), result);
[email protected]5b3078752012-10-09 18:54:161243
1244 EXPECT_FALSE(url.ExtractSearchTermsFromURL(
[email protected]ce7ee5f2014-06-16 23:41:191245 GURL("http://google.com/alt/?q=123#q="), search_terms_data_, &result));
[email protected]b959d7d42013-12-13 17:26:371246 EXPECT_EQ(base::string16(), result);
[email protected]5b3078752012-10-09 18:54:161247
1248 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
[email protected]ce7ee5f2014-06-16 23:41:191249 GURL("http://google.com/alt/?q=#q=123"), search_terms_data_, &result));
[email protected]5b3078752012-10-09 18:54:161250 EXPECT_EQ(ASCIIToUTF16("123"), result);
1251}
[email protected]4076ea62013-01-09 01:47:191252
alexmos294849f2015-03-14 00:55:061253TEST_F(TemplateURLTest, ExtractSearchTermsFromURLPath) {
1254 TemplateURLData data;
1255 data.SetURL("http://term-in-path.com/begin/{searchTerms}/end");
1256 TemplateURL url(data);
1257 base::string16 result;
1258
1259 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
1260 GURL("http://term-in-path.com/begin/something/end"),
1261 search_terms_data_, &result));
1262 EXPECT_EQ(ASCIIToUTF16("something"), result);
1263
1264 // "%20" must be converted to space.
1265 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
1266 GURL("http://term-in-path.com/begin/a%20b%20c/end"),
1267 search_terms_data_, &result));
1268 EXPECT_EQ(ASCIIToUTF16("a b c"), result);
1269
1270 // Plus must not be converted to space.
1271 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
1272 GURL("http://term-in-path.com/begin/1+2+3/end"),
1273 search_terms_data_, &result));
1274 EXPECT_EQ(ASCIIToUTF16("1+2+3"), result);
1275
1276 EXPECT_FALSE(url.ExtractSearchTermsFromURL(
1277 GURL("http://term-in-path.com/about"), search_terms_data_, &result));
1278 EXPECT_EQ(base::string16(), result);
1279
1280 EXPECT_FALSE(url.ExtractSearchTermsFromURL(
1281 GURL("http://term-in-path.com/begin"), search_terms_data_, &result));
1282 EXPECT_EQ(base::string16(), result);
1283
1284 EXPECT_FALSE(url.ExtractSearchTermsFromURL(
1285 GURL("http://term-in-path.com/end"), search_terms_data_, &result));
1286 EXPECT_EQ(base::string16(), result);
1287}
1288
vitbar27804d102015-04-15 10:54:411289// Checks that the ExtractSearchTermsFromURL function works correctly
1290// for urls containing non-latin characters in UTF8 encoding.
1291TEST_F(TemplateURLTest, ExtractSearchTermsFromUTF8URL) {
1292 TemplateURLData data;
1293 data.SetURL("http://utf-8.ru/?q={searchTerms}");
1294 data.alternate_urls.push_back("http://utf-8.ru/#q={searchTerms}");
1295 data.alternate_urls.push_back("http://utf-8.ru/path/{searchTerms}");
1296 TemplateURL url(data);
1297 base::string16 result;
1298
1299 // Russian text encoded with UTF-8.
1300 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
vitbar7060e23c2015-04-22 13:19:551301 GURL("http://utf-8.ru/?q=%D0%97%D0%B4%D1%80%D0%B0%D0%B2%D1%81%D1%82"
1302 "%D0%B2%D1%83%D0%B9,+%D0%BC%D0%B8%D1%80!"),
vitbar27804d102015-04-15 10:54:411303 search_terms_data_, &result));
1304 EXPECT_EQ(
1305 base::WideToUTF16(
1306 L"\x0417\x0434\x0440\x0430\x0432\x0441\x0442\x0432\x0443\x0439, "
1307 L"\x043C\x0438\x0440!"),
1308 result);
1309
1310 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
vitbar7060e23c2015-04-22 13:19:551311 GURL("http://utf-8.ru/#q=%D0%B4%D0%B2%D0%B0+%D1%81%D0%BB%D0%BE%D0%B2"
1312 "%D0%B0"),
vitbar27804d102015-04-15 10:54:411313 search_terms_data_, &result));
1314 EXPECT_EQ(
1315 base::WideToUTF16(L"\x0434\x0432\x0430 \x0441\x043B\x043E\x0432\x0430"),
1316 result);
1317
1318 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
vitbar7060e23c2015-04-22 13:19:551319 GURL("http://utf-8.ru/path/%D0%B1%D1%83%D0%BA%D0%B2%D1%8B%20%D0%90%20"
1320 "%D0%B8%20A"),
vitbar27804d102015-04-15 10:54:411321 search_terms_data_, &result));
1322 EXPECT_EQ(
1323 base::WideToUTF16(L"\x0431\x0443\x043A\x0432\x044B \x0410 \x0438 A"),
1324 result);
1325}
1326
1327// Checks that the ExtractSearchTermsFromURL function works correctly
1328// for urls containing non-latin characters in non-UTF8 encoding.
1329TEST_F(TemplateURLTest, ExtractSearchTermsFromNonUTF8URL) {
1330 TemplateURLData data;
1331 data.SetURL("http://windows-1251.ru/?q={searchTerms}");
1332 data.alternate_urls.push_back("http://windows-1251.ru/#q={searchTerms}");
1333 data.alternate_urls.push_back("http://windows-1251.ru/path/{searchTerms}");
1334 data.input_encodings.push_back("windows-1251");
1335 TemplateURL url(data);
1336 base::string16 result;
1337
1338 // Russian text encoded with Windows-1251.
1339 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
1340 GURL("http://windows-1251.ru/?q=%C7%E4%F0%E0%E2%F1%F2%E2%F3%E9%2C+"
1341 "%EC%E8%F0!"),
1342 search_terms_data_, &result));
1343 EXPECT_EQ(
1344 base::WideToUTF16(
1345 L"\x0417\x0434\x0440\x0430\x0432\x0441\x0442\x0432\x0443\x0439, "
1346 L"\x043C\x0438\x0440!"),
1347 result);
1348
1349 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
1350 GURL("http://windows-1251.ru/#q=%E4%E2%E0+%F1%EB%EE%E2%E0"),
1351 search_terms_data_, &result));
1352 EXPECT_EQ(
1353 base::WideToUTF16(L"\x0434\x0432\x0430 \x0441\x043B\x043E\x0432\x0430"),
1354 result);
1355
1356 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
1357 GURL("http://windows-1251.ru/path/%E1%F3%EA%E2%FB%20%C0%20%E8%20A"),
1358 search_terms_data_, &result));
1359 EXPECT_EQ(
1360 base::WideToUTF16(L"\x0431\x0443\x043A\x0432\x044B \x0410 \x0438 A"),
1361 result);
1362}
1363
jbroman50832022016-04-21 23:53:001364// Checks that the ExtractSearchTermsFromURL function strips constant
1365// prefix/suffix strings from the search terms param.
1366TEST_F(TemplateURLTest, ExtractSearchTermsWithPrefixAndSuffix) {
1367 TemplateURLData data;
1368 data.alternate_urls.push_back(
1369 "http://www.example.com/?q=chromium-{searchTerms}@chromium.org");
1370 data.alternate_urls.push_back(
1371 "http://www.example.com/chromium-{searchTerms}@chromium.org/info");
1372 TemplateURL url(data);
1373 base::string16 result;
1374
1375 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
1376 GURL("http://www.example.com/[email protected]"),
1377 search_terms_data_, &result));
1378 EXPECT_EQ(ASCIIToUTF16("dev"), result);
1379
1380 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
1381 GURL("http://www.example.com/[email protected]/info"),
1382 search_terms_data_, &result));
1383 EXPECT_EQ(ASCIIToUTF16("dev"), result);
1384
1385 // Don't match if the prefix and suffix aren't there.
1386 EXPECT_FALSE(url.ExtractSearchTermsFromURL(
1387 GURL("http://www.example.com/?q=invalid"), search_terms_data_, &result));
jbromane8b8728d2017-04-12 17:29:391388
1389 // Don't match if the prefix and suffix overlap.
1390 TemplateURLData data_with_overlap;
1391 data.alternate_urls.push_back(
1392 "http://www.example.com/?q=goo{searchTerms}oogle");
1393 TemplateURL url_with_overlap(data);
1394 EXPECT_FALSE(url_with_overlap.ExtractSearchTermsFromURL(
1395 GURL("http://www.example.com/?q=google"), search_terms_data_, &result));
jbroman50832022016-04-21 23:53:001396}
1397
[email protected]f62e30f52013-03-23 03:45:151398TEST_F(TemplateURLTest, ReplaceSearchTermsInURL) {
1399 TemplateURLData data;
1400 data.SetURL("http://google.com/?q={searchTerms}");
[email protected]f62e30f52013-03-23 03:45:151401 data.alternate_urls.push_back("http://google.com/alt/#q={searchTerms}");
1402 data.alternate_urls.push_back(
1403 "http://google.com/alt/?ext=foo&q={searchTerms}#ref=bar");
[email protected]168d08722014-06-18 07:13:281404 TemplateURL url(data);
[email protected]f62e30f52013-03-23 03:45:151405 TemplateURLRef::SearchTermsArgs search_terms(ASCIIToUTF16("Bob Morane"));
1406 GURL result;
1407
1408 EXPECT_TRUE(url.ReplaceSearchTermsInURL(
[email protected]ce7ee5f2014-06-16 23:41:191409 GURL("http://google.com/?q=something"), search_terms,
1410 search_terms_data_, &result));
vitbarf298455d2015-04-21 12:58:101411 EXPECT_EQ(GURL("http://google.com/?q=Bob+Morane"), result);
[email protected]f62e30f52013-03-23 03:45:151412
1413 result = GURL("http://should.not.change.com");
1414 EXPECT_FALSE(url.ReplaceSearchTermsInURL(
[email protected]ce7ee5f2014-06-16 23:41:191415 GURL("http://google.ca/?q=something"), search_terms,
1416 search_terms_data_, &result));
[email protected]f62e30f52013-03-23 03:45:151417 EXPECT_EQ(GURL("http://should.not.change.com"), result);
1418
1419 EXPECT_FALSE(url.ReplaceSearchTermsInURL(
[email protected]ce7ee5f2014-06-16 23:41:191420 GURL("http://google.com/foo/?q=foo"), search_terms,
1421 search_terms_data_, &result));
[email protected]f62e30f52013-03-23 03:45:151422
1423 EXPECT_TRUE(url.ReplaceSearchTermsInURL(
[email protected]ce7ee5f2014-06-16 23:41:191424 GURL("https://google.com/?q=foo"), search_terms,
1425 search_terms_data_, &result));
vitbarf298455d2015-04-21 12:58:101426 EXPECT_EQ(GURL("https://google.com/?q=Bob+Morane"), result);
[email protected]f62e30f52013-03-23 03:45:151427
1428 EXPECT_FALSE(url.ReplaceSearchTermsInURL(
[email protected]ce7ee5f2014-06-16 23:41:191429 GURL("http://google.com:8080/?q=foo"), search_terms,
1430 search_terms_data_, &result));
[email protected]f62e30f52013-03-23 03:45:151431
1432 EXPECT_TRUE(url.ReplaceSearchTermsInURL(
[email protected]ce7ee5f2014-06-16 23:41:191433 GURL("http://google.com/?q=1+2+3&b=456"), search_terms,
1434 search_terms_data_, &result));
vitbarf298455d2015-04-21 12:58:101435 EXPECT_EQ(GURL("http://google.com/?q=Bob+Morane&b=456"), result);
[email protected]f62e30f52013-03-23 03:45:151436
1437 // Note: Spaces in REF parameters are not escaped. See TryEncoding() in
1438 // template_url.cc for details.
1439 EXPECT_TRUE(url.ReplaceSearchTermsInURL(
[email protected]ce7ee5f2014-06-16 23:41:191440 GURL("http://google.com/alt/?q=123#q=456"), search_terms,
1441 search_terms_data_, &result));
vitbarf298455d2015-04-21 12:58:101442 EXPECT_EQ(GURL("http://google.com/alt/?q=123#q=Bob+Morane"), result);
[email protected]f62e30f52013-03-23 03:45:151443
1444 EXPECT_TRUE(url.ReplaceSearchTermsInURL(
1445 GURL("http://google.com/alt/?a=012&q=123&b=456#f=789"), search_terms,
[email protected]ce7ee5f2014-06-16 23:41:191446 search_terms_data_, &result));
vitbarf298455d2015-04-21 12:58:101447 EXPECT_EQ(GURL("http://google.com/alt/?a=012&q=Bob+Morane&b=456#f=789"),
[email protected]f62e30f52013-03-23 03:45:151448 result);
1449
1450 EXPECT_TRUE(url.ReplaceSearchTermsInURL(
1451 GURL("http://google.com/alt/?a=012&q=123&b=456#j=abc&q=789&h=def9"),
[email protected]ce7ee5f2014-06-16 23:41:191452 search_terms, search_terms_data_, &result));
[email protected]f62e30f52013-03-23 03:45:151453 EXPECT_EQ(GURL("http://google.com/alt/?a=012&q=123&b=456"
vitbarf298455d2015-04-21 12:58:101454 "#j=abc&q=Bob+Morane&h=def9"), result);
[email protected]f62e30f52013-03-23 03:45:151455
1456 EXPECT_FALSE(url.ReplaceSearchTermsInURL(
[email protected]ce7ee5f2014-06-16 23:41:191457 GURL("http://google.com/alt/?q="), search_terms,
1458 search_terms_data_, &result));
[email protected]f62e30f52013-03-23 03:45:151459
1460 EXPECT_FALSE(url.ReplaceSearchTermsInURL(
[email protected]ce7ee5f2014-06-16 23:41:191461 GURL("http://google.com/alt/?#q="), search_terms,
1462 search_terms_data_, &result));
[email protected]f62e30f52013-03-23 03:45:151463
1464 EXPECT_FALSE(url.ReplaceSearchTermsInURL(
[email protected]ce7ee5f2014-06-16 23:41:191465 GURL("http://google.com/alt/?q=#q="), search_terms,
1466 search_terms_data_, &result));
[email protected]f62e30f52013-03-23 03:45:151467
1468 EXPECT_FALSE(url.ReplaceSearchTermsInURL(
[email protected]ce7ee5f2014-06-16 23:41:191469 GURL("http://google.com/alt/?q=123#q="), search_terms,
1470 search_terms_data_, &result));
[email protected]f62e30f52013-03-23 03:45:151471
1472 EXPECT_TRUE(url.ReplaceSearchTermsInURL(
[email protected]ce7ee5f2014-06-16 23:41:191473 GURL("http://google.com/alt/?q=#q=123"), search_terms,
1474 search_terms_data_, &result));
vitbarf298455d2015-04-21 12:58:101475 EXPECT_EQ(GURL("http://google.com/alt/?q=#q=Bob+Morane"), result);
[email protected]f62e30f52013-03-23 03:45:151476}
[email protected]56fa29592013-07-02 20:25:531477
alexmos294849f2015-03-14 00:55:061478TEST_F(TemplateURLTest, ReplaceSearchTermsInURLPath) {
1479 TemplateURLData data;
1480 data.SetURL("http://term-in-path.com/begin/{searchTerms}/end");
1481 TemplateURL url(data);
1482 TemplateURLRef::SearchTermsArgs search_terms(ASCIIToUTF16("Bob Morane"));
1483 GURL result;
1484
1485 EXPECT_TRUE(url.ReplaceSearchTermsInURL(
1486 GURL("http://term-in-path.com/begin/something/end"), search_terms,
1487 search_terms_data_, &result));
1488 EXPECT_EQ(GURL("http://term-in-path.com/begin/Bob%20Morane/end"), result);
1489
1490 EXPECT_TRUE(url.ReplaceSearchTermsInURL(
1491 GURL("http://term-in-path.com/begin/1%202%203/end"), search_terms,
1492 search_terms_data_, &result));
1493 EXPECT_EQ(GURL("http://term-in-path.com/begin/Bob%20Morane/end"), result);
1494
1495 result = GURL("http://should.not.change.com");
1496 EXPECT_FALSE(url.ReplaceSearchTermsInURL(
1497 GURL("http://term-in-path.com/about"), search_terms,
1498 search_terms_data_, &result));
1499 EXPECT_EQ(GURL("http://should.not.change.com"), result);
1500}
1501
vitbarf298455d2015-04-21 12:58:101502// Checks that the ReplaceSearchTermsInURL function works correctly
1503// for search terms containing non-latin characters for a search engine
1504// using UTF-8 input encoding.
1505TEST_F(TemplateURLTest, ReplaceSearchTermsInUTF8URL) {
1506 TemplateURLData data;
1507 data.SetURL("http://utf-8.ru/?q={searchTerms}");
1508 data.alternate_urls.push_back("http://utf-8.ru/#q={searchTerms}");
1509 data.alternate_urls.push_back("http://utf-8.ru/path/{searchTerms}");
1510 TemplateURL url(data);
1511
1512 // Russian text which will be encoded with UTF-8.
1513 TemplateURLRef::SearchTermsArgs search_terms(base::WideToUTF16(
1514 L"\x0442\x0435\x043A\x0441\x0442"));
1515 GURL result;
1516
1517 EXPECT_TRUE(url.ReplaceSearchTermsInURL(
1518 GURL("http://utf-8.ru/?q=a+b"), search_terms, search_terms_data_,
1519 &result));
1520 EXPECT_EQ(GURL("http://utf-8.ru/?q=%D1%82%D0%B5%D0%BA%D1%81%D1%82"),
1521 result);
1522
1523 EXPECT_TRUE(url.ReplaceSearchTermsInURL(
1524 GURL("http://utf-8.ru/#q=a+b"), search_terms, search_terms_data_,
1525 &result));
1526 EXPECT_EQ(GURL("http://utf-8.ru/#q=%D1%82%D0%B5%D0%BA%D1%81%D1%82"),
1527 result);
1528
1529 EXPECT_TRUE(url.ReplaceSearchTermsInURL(
1530 GURL("http://utf-8.ru/path/a%20b"), search_terms, search_terms_data_,
1531 &result));
1532 EXPECT_EQ(GURL("http://utf-8.ru/path/%D1%82%D0%B5%D0%BA%D1%81%D1%82"),
1533 result);
1534}
1535
1536// Checks that the ReplaceSearchTermsInURL function works correctly
1537// for search terms containing non-latin characters for a search engine
1538// using non UTF-8 input encoding.
1539TEST_F(TemplateURLTest, ReplaceSearchTermsInNonUTF8URL) {
1540 TemplateURLData data;
1541 data.SetURL("http://windows-1251.ru/?q={searchTerms}");
1542 data.alternate_urls.push_back("http://windows-1251.ru/#q={searchTerms}");
1543 data.alternate_urls.push_back("http://windows-1251.ru/path/{searchTerms}");
1544 data.input_encodings.push_back("windows-1251");
1545 TemplateURL url(data);
1546
1547 // Russian text which will be encoded with Windows-1251.
1548 TemplateURLRef::SearchTermsArgs search_terms(base::WideToUTF16(
1549 L"\x0442\x0435\x043A\x0441\x0442"));
1550 GURL result;
1551
1552 EXPECT_TRUE(url.ReplaceSearchTermsInURL(
1553 GURL("http://windows-1251.ru/?q=a+b"), search_terms, search_terms_data_,
1554 &result));
1555 EXPECT_EQ(GURL("http://windows-1251.ru/?q=%F2%E5%EA%F1%F2"),
1556 result);
1557
1558 EXPECT_TRUE(url.ReplaceSearchTermsInURL(
1559 GURL("http://windows-1251.ru/#q=a+b"), search_terms, search_terms_data_,
1560 &result));
1561 EXPECT_EQ(GURL("http://windows-1251.ru/#q=%F2%E5%EA%F1%F2"),
1562 result);
1563
1564 EXPECT_TRUE(url.ReplaceSearchTermsInURL(
1565 GURL("http://windows-1251.ru/path/a%20b"), search_terms,
1566 search_terms_data_, &result));
1567 EXPECT_EQ(GURL("http://windows-1251.ru/path/%F2%E5%EA%F1%F2"),
1568 result);
1569}
1570
Mark Pearson247fb8a2018-08-30 05:12:261571// Test the |additional_query_params| field of SearchTermsArgs.
[email protected]621ade062013-10-28 06:27:431572TEST_F(TemplateURLTest, SuggestQueryParams) {
[email protected]621ade062013-10-28 06:27:431573 TemplateURLData data;
1574 // Pick a URL with replacements before, during, and after the query, to ensure
1575 // we don't goof up any of them.
1576 data.SetURL("{google:baseURL}search?q={searchTerms}"
1577 "#{google:originalQueryForSuggestion}x");
[email protected]168d08722014-06-18 07:13:281578 TemplateURL url(data);
[email protected]621ade062013-10-28 06:27:431579
Mark Pearson247fb8a2018-08-30 05:12:261580 // Baseline: no |additional_query_params| field.
[email protected]621ade062013-10-28 06:27:431581 TemplateURLRef::SearchTermsArgs search_terms(ASCIIToUTF16("abc"));
1582 search_terms.original_query = ASCIIToUTF16("def");
1583 search_terms.accepted_suggestion = 0;
1584 EXPECT_EQ("http://www.google.com/search?q=abc#oq=def&x",
[email protected]ce7ee5f2014-06-16 23:41:191585 url.url_ref().ReplaceSearchTerms(search_terms, search_terms_data_));
[email protected]621ade062013-10-28 06:27:431586
Mark Pearson247fb8a2018-08-30 05:12:261587 // Set the |additional_query_params|.
1588 search_terms.additional_query_params = "pq=xyz";
[email protected]621ade062013-10-28 06:27:431589 EXPECT_EQ("http://www.google.com/search?pq=xyz&q=abc#oq=def&x",
[email protected]ce7ee5f2014-06-16 23:41:191590 url.url_ref().ReplaceSearchTerms(search_terms, search_terms_data_));
[email protected]621ade062013-10-28 06:27:431591
Mark Pearson247fb8a2018-08-30 05:12:261592 // Add |append_extra_query_params_from_command_line| into the mix, and ensure
1593 // it works.
1594 search_terms.append_extra_query_params_from_command_line = true;
avi1772c1a2014-12-22 22:42:331595 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
[email protected]621ade062013-10-28 06:27:431596 switches::kExtraSearchQueryParams, "a=b");
1597 EXPECT_EQ("http://www.google.com/search?a=b&pq=xyz&q=abc#oq=def&x",
[email protected]ce7ee5f2014-06-16 23:41:191598 url.url_ref().ReplaceSearchTerms(search_terms, search_terms_data_));
[email protected]621ade062013-10-28 06:27:431599}
1600
Mark Pearson247fb8a2018-08-30 05:12:261601// Test the |search_terms.append_extra_query_params_from_command_line| field of
1602// SearchTermsArgs.
[email protected]56fa29592013-07-02 20:25:531603TEST_F(TemplateURLTest, ExtraQueryParams) {
[email protected]56fa29592013-07-02 20:25:531604 TemplateURLData data;
1605 // Pick a URL with replacements before, during, and after the query, to ensure
1606 // we don't goof up any of them.
1607 data.SetURL("{google:baseURL}search?q={searchTerms}"
1608 "#{google:originalQueryForSuggestion}x");
[email protected]168d08722014-06-18 07:13:281609 TemplateURL url(data);
[email protected]56fa29592013-07-02 20:25:531610
Mark Pearson247fb8a2018-08-30 05:12:261611 // Baseline: no command-line args, no
1612 // |search_terms.append_extra_query_params_from_command_line| flag.
[email protected]56fa29592013-07-02 20:25:531613 TemplateURLRef::SearchTermsArgs search_terms(ASCIIToUTF16("abc"));
1614 search_terms.original_query = ASCIIToUTF16("def");
1615 search_terms.accepted_suggestion = 0;
1616 EXPECT_EQ("http://www.google.com/search?q=abc#oq=def&x",
[email protected]ce7ee5f2014-06-16 23:41:191617 url.url_ref().ReplaceSearchTerms(search_terms, search_terms_data_));
[email protected]56fa29592013-07-02 20:25:531618
1619 // Set the flag. Since there are no command-line args, this should have no
1620 // effect.
Mark Pearson247fb8a2018-08-30 05:12:261621 search_terms.append_extra_query_params_from_command_line = true;
[email protected]56fa29592013-07-02 20:25:531622 EXPECT_EQ("http://www.google.com/search?q=abc#oq=def&x",
[email protected]ce7ee5f2014-06-16 23:41:191623 url.url_ref().ReplaceSearchTerms(search_terms, search_terms_data_));
[email protected]56fa29592013-07-02 20:25:531624
1625 // Now append the command-line arg. This should be inserted into the query.
avi1772c1a2014-12-22 22:42:331626 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
[email protected]56fa29592013-07-02 20:25:531627 switches::kExtraSearchQueryParams, "a=b");
1628 EXPECT_EQ("http://www.google.com/search?a=b&q=abc#oq=def&x",
[email protected]ce7ee5f2014-06-16 23:41:191629 url.url_ref().ReplaceSearchTerms(search_terms, search_terms_data_));
[email protected]56fa29592013-07-02 20:25:531630
1631 // Turn off the flag. Now the command-line arg should be ignored again.
Mark Pearson247fb8a2018-08-30 05:12:261632 search_terms.append_extra_query_params_from_command_line = false;
[email protected]56fa29592013-07-02 20:25:531633 EXPECT_EQ("http://www.google.com/search?q=abc#oq=def&x",
[email protected]ce7ee5f2014-06-16 23:41:191634 url.url_ref().ReplaceSearchTerms(search_terms, search_terms_data_));
[email protected]56fa29592013-07-02 20:25:531635}
[email protected]d5015ca2013-08-08 22:04:181636
1637// Tests replacing pageClassification.
[email protected]57ac99b92013-11-13 01:30:171638TEST_F(TemplateURLTest, ReplacePageClassification) {
[email protected]d5015ca2013-08-08 22:04:181639 TemplateURLData data;
1640 data.input_encodings.push_back("UTF-8");
1641 data.SetURL("{google:baseURL}?{google:pageClassification}q={searchTerms}");
[email protected]168d08722014-06-18 07:13:281642 TemplateURL url(data);
[email protected]ce7ee5f2014-06-16 23:41:191643 EXPECT_TRUE(url.url_ref().IsValid(search_terms_data_));
1644 ASSERT_TRUE(url.url_ref().SupportsReplacement(search_terms_data_));
[email protected]d5015ca2013-08-08 22:04:181645 TemplateURLRef::SearchTermsArgs search_terms_args(ASCIIToUTF16("foo"));
1646
[email protected]ce7ee5f2014-06-16 23:41:191647 std::string result = url.url_ref().ReplaceSearchTerms(search_terms_args,
1648 search_terms_data_);
[email protected]d5015ca2013-08-08 22:04:181649 EXPECT_EQ("http://www.google.com/?q=foo", result);
1650
[email protected]332d17d22014-06-20 16:56:031651 search_terms_args.page_classification = metrics::OmniboxEventProto::NTP;
[email protected]ce7ee5f2014-06-16 23:41:191652 result = url.url_ref().ReplaceSearchTerms(search_terms_args,
1653 search_terms_data_);
[email protected]d5015ca2013-08-08 22:04:181654 EXPECT_EQ("http://www.google.com/?pgcl=1&q=foo", result);
1655
1656 search_terms_args.page_classification =
[email protected]332d17d22014-06-20 16:56:031657 metrics::OmniboxEventProto::HOME_PAGE;
[email protected]ce7ee5f2014-06-16 23:41:191658 result = url.url_ref().ReplaceSearchTerms(search_terms_args,
1659 search_terms_data_);
[email protected]d5015ca2013-08-08 22:04:181660 EXPECT_EQ("http://www.google.com/?pgcl=3&q=foo", result);
1661}
[email protected]2328ee22013-08-08 23:00:191662
1663// Test the IsSearchResults function.
1664TEST_F(TemplateURLTest, IsSearchResults) {
1665 TemplateURLData data;
1666 data.SetURL("http://bar/search?q={searchTerms}");
[email protected]2767c0fd2013-08-16 17:44:161667 data.new_tab_url = "http://bar/newtab";
[email protected]2328ee22013-08-08 23:00:191668 data.alternate_urls.push_back("http://bar/?q={searchTerms}");
1669 data.alternate_urls.push_back("http://bar/#q={searchTerms}");
1670 data.alternate_urls.push_back("http://bar/search#q{searchTerms}");
1671 data.alternate_urls.push_back("http://bar/webhp#q={searchTerms}");
[email protected]168d08722014-06-18 07:13:281672 TemplateURL search_provider(data);
[email protected]2328ee22013-08-08 23:00:191673
1674 const struct {
1675 const char* const url;
1676 bool result;
1677 } url_data[] = {
1678 { "http://bar/search?q=foo&oq=foo", true, },
1679 { "http://bar/?q=foo&oq=foo", true, },
1680 { "http://bar/#output=search&q=foo&oq=foo", true, },
1681 { "http://bar/webhp#q=foo&oq=foo", true, },
1682 { "http://bar/#q=foo&oq=foo", true, },
1683 { "http://bar/?ext=foo&q=foo#ref=bar", true, },
1684 { "http://bar/url?url=http://www.foo.com/&q=foo#ref=bar", false, },
1685 { "http://bar/", false, },
1686 { "http://foo/", false, },
[email protected]2767c0fd2013-08-16 17:44:161687 { "http://bar/newtab", false, },
[email protected]2328ee22013-08-08 23:00:191688 };
1689
Avi Drissman2244c2d2018-12-25 23:08:021690 for (size_t i = 0; i < base::size(url_data); ++i) {
[email protected]2328ee22013-08-08 23:00:191691 EXPECT_EQ(url_data[i].result,
[email protected]ce7ee5f2014-06-16 23:41:191692 search_provider.IsSearchURL(GURL(url_data[i].url),
1693 search_terms_data_));
[email protected]2328ee22013-08-08 23:00:191694 }
1695}
[email protected]a048de8a2013-10-02 18:30:061696
jdonnelly41c5b46a2015-07-10 21:24:381697TEST_F(TemplateURLTest, SearchboxVersionIncludedForAnswers) {
[email protected]9d70de12014-05-10 02:15:311698 TemplateURLData data;
[email protected]798baa8e2014-06-20 05:42:441699 search_terms_data_.set_google_base_url("http://bar/");
[email protected]9d70de12014-05-10 02:15:311700 data.SetURL("http://bar/search?q={searchTerms}&{google:searchVersion}xssi=t");
1701
[email protected]168d08722014-06-18 07:13:281702 TemplateURL url(data);
[email protected]9d70de12014-05-10 02:15:311703 TemplateURLRef::SearchTermsArgs search_terms_args(ASCIIToUTF16("foo"));
[email protected]ce7ee5f2014-06-16 23:41:191704 std::string result = url.url_ref().ReplaceSearchTerms(search_terms_args,
1705 search_terms_data_);
[email protected]9d70de12014-05-10 02:15:311706 EXPECT_EQ("http://bar/search?q=foo&gs_rn=42&xssi=t", result);
1707}
[email protected]20184242014-05-14 02:57:421708
1709TEST_F(TemplateURLTest, SessionToken) {
1710 TemplateURLData data;
[email protected]798baa8e2014-06-20 05:42:441711 search_terms_data_.set_google_base_url("http://bar/");
[email protected]20184242014-05-14 02:57:421712 data.SetURL("http://bar/search?q={searchTerms}&{google:sessionToken}xssi=t");
1713
[email protected]168d08722014-06-18 07:13:281714 TemplateURL url(data);
[email protected]20184242014-05-14 02:57:421715 TemplateURLRef::SearchTermsArgs search_terms_args(ASCIIToUTF16("foo"));
1716 search_terms_args.session_token = "SESSIONTOKENGOESHERE";
[email protected]ce7ee5f2014-06-16 23:41:191717 std::string result = url.url_ref().ReplaceSearchTerms(search_terms_args,
1718 search_terms_data_);
[email protected]20184242014-05-14 02:57:421719 EXPECT_EQ("http://bar/search?q=foo&psi=SESSIONTOKENGOESHERE&xssi=t", result);
1720
[email protected]168d08722014-06-18 07:13:281721 TemplateURL url2(data);
[email protected]20184242014-05-14 02:57:421722 search_terms_args.session_token = "";
[email protected]ce7ee5f2014-06-16 23:41:191723 result = url.url_ref().ReplaceSearchTerms(search_terms_args,
1724 search_terms_data_);
[email protected]20184242014-05-14 02:57:421725 EXPECT_EQ("http://bar/search?q=foo&xssi=t", result);
1726}
[email protected]448b17f52014-06-13 01:08:031727
1728TEST_F(TemplateURLTest, ContextualSearchParameters) {
1729 TemplateURLData data;
[email protected]798baa8e2014-06-20 05:42:441730 search_terms_data_.set_google_base_url("http://bar/");
[email protected]448b17f52014-06-13 01:08:031731 data.SetURL("http://bar/_/contextualsearch?"
1732 "{google:contextualSearchVersion}"
1733 "{google:contextualSearchContextData}");
1734
[email protected]168d08722014-06-18 07:13:281735 TemplateURL url(data);
[email protected]448b17f52014-06-13 01:08:031736 TemplateURLRef::SearchTermsArgs search_terms_args(ASCIIToUTF16("foo"));
[email protected]ce7ee5f2014-06-16 23:41:191737 std::string result = url.url_ref().ReplaceSearchTerms(search_terms_args,
1738 search_terms_data_);
donndbb98274e2016-11-01 21:04:401739 EXPECT_EQ("http://bar/_/contextualsearch?", result);
[email protected]448b17f52014-06-13 01:08:031740
Donn Denman01b1bf72018-08-14 16:25:201741 // Test the current common case, which uses no home country or previous
1742 // event.
1743 TemplateURLRef::SearchTermsArgs::ContextualSearchParams params(
Donn Denman97be51df2020-06-24 01:23:191744 2, 1, std::string(), 0, 0, false, std::string(), std::string(),
1745 std::string());
[email protected]448b17f52014-06-13 01:08:031746 search_terms_args.contextual_search_params = params;
[email protected]ce7ee5f2014-06-16 23:41:191747 result = url.url_ref().ReplaceSearchTerms(search_terms_args,
1748 search_terms_data_);
donndd9fc4d92016-09-16 00:30:491749 EXPECT_EQ(
1750 "http://bar/_/contextualsearch?"
donnd0bc73292017-01-17 22:07:561751 "ctxs=2&"
donndd9fc4d92016-09-16 00:30:491752 "ctxsl_coca=1",
1753 result);
donndbb98274e2016-11-01 21:04:401754
Donn Denman01b1bf72018-08-14 16:25:201755 // Test the home country and non-zero event data case.
donndbb98274e2016-11-01 21:04:401756 search_terms_args.contextual_search_params =
Donn Denmandf4ede0f2020-01-17 23:11:221757 TemplateURLRef::SearchTermsArgs::ContextualSearchParams(
Donn Denman97be51df2020-06-24 01:23:191758 2, 2, "CH", 1657713458, 5, false, std::string(), std::string(),
1759 std::string());
donndbb98274e2016-11-01 21:04:401760 result =
1761 url.url_ref().ReplaceSearchTerms(search_terms_args, search_terms_data_);
1762
1763 EXPECT_EQ(
1764 "http://bar/_/contextualsearch?"
1765 "ctxs=2&"
donnd0bc73292017-01-17 22:07:561766 "ctxsl_coca=2&"
Donn Denman01b1bf72018-08-14 16:25:201767 "ctxs_hc=CH&"
1768 "ctxsl_pid=1657713458&"
1769 "ctxsl_per=5",
donndbb98274e2016-11-01 21:04:401770 result);
Donn Denmandf4ede0f2020-01-17 23:11:221771
1772 // Test exact-search.
1773 search_terms_args.contextual_search_params =
1774 TemplateURLRef::SearchTermsArgs::ContextualSearchParams(
Donn Denman97be51df2020-06-24 01:23:191775 2, 1, std::string(), 0, 0, true, std::string(), std::string(),
1776 std::string());
Donn Denmandf4ede0f2020-01-17 23:11:221777 result =
1778 url.url_ref().ReplaceSearchTerms(search_terms_args, search_terms_data_);
Donn Denmandf4ede0f2020-01-17 23:11:221779 // Find our param.
1780 size_t found_pos = result.find("ctxsl_exact=1");
1781 EXPECT_NE(found_pos, std::string::npos);
Donn Denman7a241012020-01-31 18:33:131782
1783 // Test source and target languages.
1784 search_terms_args.contextual_search_params =
1785 TemplateURLRef::SearchTermsArgs::ContextualSearchParams(
Donn Denman97be51df2020-06-24 01:23:191786 2, 1, std::string(), 0, 0, true, "es", "de", std::string());
Donn Denman7a241012020-01-31 18:33:131787 result =
1788 url.url_ref().ReplaceSearchTerms(search_terms_args, search_terms_data_);
1789 // Find our params.
1790 size_t source_pos = result.find("tlitesl=es");
1791 EXPECT_NE(source_pos, std::string::npos);
1792 size_t target_pos = result.find("tlitetl=de");
1793 EXPECT_NE(target_pos, std::string::npos);
Donn Denman97be51df2020-06-24 01:23:191794
1795 // Test fluent languages.
1796 search_terms_args.contextual_search_params =
1797 TemplateURLRef::SearchTermsArgs::ContextualSearchParams(
1798 2, 1, std::string(), 0, 0, true, std::string(), std::string(),
1799 "es,de");
1800 result =
1801 url.url_ref().ReplaceSearchTerms(search_terms_args, search_terms_data_);
1802 // Find our param. These may actually be URL encoded.
1803 size_t fluent_pos = result.find("&ctxs_fls=es,de");
1804 EXPECT_NE(fluent_pos, std::string::npos);
[email protected]448b17f52014-06-13 01:08:031805}
[email protected]44ccc9f2014-06-20 17:36:211806
1807TEST_F(TemplateURLTest, GenerateKeyword) {
1808 ASSERT_EQ(ASCIIToUTF16("foo"),
jshin1fb76462016-04-05 22:13:031809 TemplateURL::GenerateKeyword(GURL("http://foo")));
Emily Stark0fb634f82020-07-14 18:00:391810 ASSERT_EQ(ASCIIToUTF16("foo."),
1811 TemplateURL::GenerateKeyword(GURL("http://foo.")));
1812 // www. should be stripped for a public hostname but not a private/intranet
1813 // hostname.
1814 ASSERT_EQ(ASCIIToUTF16("google.com"),
1815 TemplateURL::GenerateKeyword(GURL("http://www.google.com")));
1816 ASSERT_EQ(ASCIIToUTF16("www.foo"),
jshin1fb76462016-04-05 22:13:031817 TemplateURL::GenerateKeyword(GURL("http://www.foo")));
[email protected]44ccc9f2014-06-20 17:36:211818 // Make sure we don't get a trailing '/'.
jshin1fb76462016-04-05 22:13:031819 ASSERT_EQ(ASCIIToUTF16("blah"),
1820 TemplateURL::GenerateKeyword(GURL("http://blah/")));
[email protected]44ccc9f2014-06-20 17:36:211821 // Don't generate the empty string.
Emily Stark0fb634f82020-07-14 18:00:391822 ASSERT_EQ(ASCIIToUTF16("www."),
jshin1fb76462016-04-05 22:13:031823 TemplateURL::GenerateKeyword(GURL("http://www.")));
alshabaline6212ac2015-07-23 08:03:001824 ASSERT_EQ(
1825 base::UTF8ToUTF16("\xd0\xb0\xd0\xb1\xd0\xb2"),
jshin1fb76462016-04-05 22:13:031826 TemplateURL::GenerateKeyword(GURL("http://xn--80acd")));
a-v-y81695d0d2017-04-20 08:22:221827
1828 // Generated keywords must always be in lowercase, because TemplateURLs always
1829 // converts keywords to lowercase in its constructor and TemplateURLService
1830 // stores TemplateURLs in maps using keyword as key.
1831 EXPECT_TRUE(IsLowerCase(TemplateURL::GenerateKeyword(GURL("http://BLAH/"))));
1832 EXPECT_TRUE(IsLowerCase(
1833 TemplateURL::GenerateKeyword(GURL("http://embeddedhtml.<head>/"))));
[email protected]44ccc9f2014-06-20 17:36:211834}
1835
1836TEST_F(TemplateURLTest, GenerateSearchURL) {
1837 struct GenerateSearchURLCase {
1838 const char* test_name;
1839 const char* url;
1840 const char* expected;
1841 } generate_url_cases[] = {
1842 { "invalid URL", "foo{searchTerms}", "" },
1843 { "URL with no replacements", "http://foo/", "http://foo/" },
1844 { "basic functionality", "http://foo/{searchTerms}",
1845 "http://foo/blah.blah.blah.blah.blah" }
1846 };
1847
Avi Drissman2244c2d2018-12-25 23:08:021848 for (size_t i = 0; i < base::size(generate_url_cases); ++i) {
[email protected]44ccc9f2014-06-20 17:36:211849 TemplateURLData data;
1850 data.SetURL(generate_url_cases[i].url);
1851 TemplateURL t_url(data);
1852 EXPECT_EQ(t_url.GenerateSearchURL(search_terms_data_).spec(),
1853 generate_url_cases[i].expected)
1854 << generate_url_cases[i].test_name << " failed.";
1855 }
1856}
[email protected]9e9130ce2014-06-23 23:20:511857
1858TEST_F(TemplateURLTest, PrefetchQueryParameters) {
1859 TemplateURLData data;
1860 search_terms_data_.set_google_base_url("http://bar/");
1861 data.SetURL("http://bar/search?q={searchTerms}&{google:prefetchQuery}xssi=t");
1862
1863 TemplateURL url(data);
1864 TemplateURLRef::SearchTermsArgs search_terms_args(ASCIIToUTF16("foo"));
1865 search_terms_args.prefetch_query = "full query text";
1866 search_terms_args.prefetch_query_type = "2338";
1867 std::string result =
1868 url.url_ref().ReplaceSearchTerms(search_terms_args, search_terms_data_);
1869 EXPECT_EQ("http://bar/search?q=foo&pfq=full%20query%20text&qha=2338&xssi=t",
1870 result);
1871
1872 TemplateURL url2(data);
1873 search_terms_args.prefetch_query.clear();
1874 search_terms_args.prefetch_query_type.clear();
1875 result =
1876 url2.url_ref().ReplaceSearchTerms(search_terms_args, search_terms_data_);
1877 EXPECT_EQ("http://bar/search?q=foo&xssi=t", result);
1878}
vitbar5bd8c252016-01-29 18:44:511879
1880// Tests that TemplateURL works correctly after changing the Google base URL
1881// and invalidating cached values.
1882TEST_F(TemplateURLTest, InvalidateCachedValues) {
1883 TemplateURLData data;
1884 data.SetURL("{google:baseURL}search?q={searchTerms}");
1885 data.suggestions_url = "{google:baseSuggestURL}search?q={searchTerms}";
vitbar5bd8c252016-01-29 18:44:511886 data.image_url = "{google:baseURL}searchbyimage/upload";
1887 data.new_tab_url = "{google:baseURL}_/chrome/newtab";
1888 data.contextual_search_url = "{google:baseURL}_/contextualsearch";
1889 data.alternate_urls.push_back("{google:baseURL}s#q={searchTerms}");
1890 TemplateURL url(data);
1891 TemplateURLRef::SearchTermsArgs search_terms_args(ASCIIToUTF16("X"));
1892 base::string16 search_terms;
1893
1894 EXPECT_TRUE(url.HasGoogleBaseURLs(search_terms_data_));
1895 EXPECT_EQ("http://www.google.com/search?q=X",
1896 url.url_ref().ReplaceSearchTerms(search_terms_args,
1897 search_terms_data_));
1898 EXPECT_EQ("http://www.google.com/s#q=X",
1899 url.url_refs()[0].ReplaceSearchTerms(search_terms_args,
1900 search_terms_data_));
1901 EXPECT_EQ("http://www.google.com/search?q=X",
1902 url.url_refs()[1].ReplaceSearchTerms(search_terms_args,
1903 search_terms_data_));
1904 EXPECT_EQ("http://www.google.com/complete/search?q=X",
1905 url.suggestions_url_ref().ReplaceSearchTerms(search_terms_args,
1906 search_terms_data_));
vitbar5bd8c252016-01-29 18:44:511907 EXPECT_EQ("http://www.google.com/searchbyimage/upload",
1908 url.image_url_ref().ReplaceSearchTerms(search_terms_args,
1909 search_terms_data_));
1910 EXPECT_EQ("http://www.google.com/_/chrome/newtab",
1911 url.new_tab_url_ref().ReplaceSearchTerms(search_terms_args,
1912 search_terms_data_));
1913 EXPECT_EQ("http://www.google.com/_/contextualsearch",
1914 url.contextual_search_url_ref().ReplaceSearchTerms(
1915 search_terms_args, search_terms_data_));
1916
1917 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
1918 GURL("http://www.google.com/search?q=Y+Z"),
1919 search_terms_data_, &search_terms));
1920 EXPECT_EQ(base::ASCIIToUTF16("Y Z"), search_terms);
1921 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
1922 GURL("http://www.google.com/s#q=123"),
1923 search_terms_data_, &search_terms));
1924 EXPECT_EQ(base::ASCIIToUTF16("123"), search_terms);
1925
1926 search_terms_data_.set_google_base_url("https://www.foo.org/");
1927 url.InvalidateCachedValues();
1928
1929 EXPECT_TRUE(url.HasGoogleBaseURLs(search_terms_data_));
1930 EXPECT_EQ("https://www.foo.org/search?q=X",
1931 url.url_ref().ReplaceSearchTerms(search_terms_args,
1932 search_terms_data_));
1933 EXPECT_EQ("https://www.foo.org/s#q=X",
1934 url.url_refs()[0].ReplaceSearchTerms(search_terms_args,
1935 search_terms_data_));
1936 EXPECT_EQ("https://www.foo.org/search?q=X",
1937 url.url_refs()[1].ReplaceSearchTerms(search_terms_args,
1938 search_terms_data_));
1939 EXPECT_EQ("https://www.foo.org/complete/search?q=X",
1940 url.suggestions_url_ref().ReplaceSearchTerms(search_terms_args,
1941 search_terms_data_));
vitbar5bd8c252016-01-29 18:44:511942 EXPECT_EQ("https://www.foo.org/searchbyimage/upload",
1943 url.image_url_ref().ReplaceSearchTerms(search_terms_args,
1944 search_terms_data_));
1945 EXPECT_EQ("https://www.foo.org/_/chrome/newtab",
1946 url.new_tab_url_ref().ReplaceSearchTerms(search_terms_args,
1947 search_terms_data_));
1948 EXPECT_EQ("https://www.foo.org/_/contextualsearch",
1949 url.contextual_search_url_ref().ReplaceSearchTerms(
1950 search_terms_args, search_terms_data_));
1951
1952 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
1953 GURL("https://www.foo.org/search?q=Y+Z"),
1954 search_terms_data_, &search_terms));
1955 EXPECT_EQ(base::ASCIIToUTF16("Y Z"), search_terms);
1956 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
1957 GURL("https://www.foo.org/s#q=123"),
1958 search_terms_data_, &search_terms));
1959 EXPECT_EQ(base::ASCIIToUTF16("123"), search_terms);
1960
1961 search_terms_data_.set_google_base_url("http://www.google.com/");
1962}
Troy Hildebrandt47ac4d8b2018-05-10 22:40:001963
1964// Tests the use of wildcards in the path to ensure both extracting search terms
1965// and generating a search URL work correctly.
1966TEST_F(TemplateURLTest, PathWildcard) {
1967 TemplateURLData data;
1968 data.SetURL(
1969 "https://www.google.com/search{google:pathWildcard}?q={searchTerms}");
1970 TemplateURL url(data);
1971
1972 // Test extracting search terms from a URL.
1973 base::string16 search_terms;
1974 url.ExtractSearchTermsFromURL(GURL("https://www.google.com/search?q=testing"),
1975 search_terms_data_, &search_terms);
1976 EXPECT_EQ(base::ASCIIToUTF16("testing"), search_terms);
1977 url.ExtractSearchTermsFromURL(
1978 GURL("https://www.google.com/search;_this_is_a_test;_?q=testing"),
1979 search_terms_data_, &search_terms);
1980 EXPECT_EQ(base::ASCIIToUTF16("testing"), search_terms);
1981
1982 // Tests overlapping prefix/suffix.
1983 data.SetURL(
1984 "https://www.google.com/search{google:pathWildcard}rch?q={searchTerms}");
1985 TemplateURL overlap_url(data);
1986 overlap_url.ExtractSearchTermsFromURL(
1987 GURL("https://www.google.com/search?q=testing"), search_terms_data_,
1988 &search_terms);
1989 EXPECT_TRUE(search_terms.empty());
1990
1991 // Tests wildcard at beginning of path so we only have a suffix.
1992 data.SetURL(
1993 "https://www.google.com/{google:pathWildcard}rch?q={searchTerms}");
1994 TemplateURL suffix_url(data);
1995 suffix_url.ExtractSearchTermsFromURL(
1996 GURL("https://www.google.com/search?q=testing"), search_terms_data_,
1997 &search_terms);
1998 EXPECT_EQ(base::ASCIIToUTF16("testing"), search_terms);
1999
2000 // Tests wildcard between prefix/suffix.
2001 overlap_url.ExtractSearchTermsFromURL(
2002 GURL("https://www.google.com/search_testing_rch?q=testing"),
2003 search_terms_data_, &search_terms);
2004 EXPECT_EQ(base::ASCIIToUTF16("testing"), search_terms);
2005
2006 // Test generating a URL.
2007 TemplateURLRef::SearchTermsArgs search_terms_args(ASCIIToUTF16("foo"));
2008 GURL generated_url;
2009 url.ReplaceSearchTermsInURL(url.GenerateSearchURL(search_terms_data_),
2010 search_terms_args, search_terms_data_,
2011 &generated_url);
2012 EXPECT_EQ("https://www.google.com/search?q=foo", generated_url.spec());
2013}