blob: a19a834af10ab9871aa5ba1ec44d747798706ff0 [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
[email protected]d82443b2009-01-15 19:54:56805TEST_F(TemplateURLTest, Suggestions) {
806 struct TestData {
807 const int accepted_suggestion;
[email protected]0085863a2013-12-06 21:19:03808 const base::string16 original_query_for_suggestion;
[email protected]d82443b2009-01-15 19:54:56809 const std::string expected_result;
[email protected]b37bdfe2012-03-16 20:53:27810 } test_data[] = {
[email protected]0085863a2013-12-06 21:19:03811 { TemplateURLRef::NO_SUGGESTIONS_AVAILABLE, base::string16(),
[email protected]29653892013-03-02 19:25:37812 "http://bar/foo?q=foobar" },
[email protected]400b133f2011-01-19 18:32:30813 { TemplateURLRef::NO_SUGGESTIONS_AVAILABLE, ASCIIToUTF16("foo"),
[email protected]29653892013-03-02 19:25:37814 "http://bar/foo?q=foobar" },
[email protected]0085863a2013-12-06 21:19:03815 { TemplateURLRef::NO_SUGGESTION_CHOSEN, base::string16(),
[email protected]29653892013-03-02 19:25:37816 "http://bar/foo?q=foobar" },
[email protected]400b133f2011-01-19 18:32:30817 { TemplateURLRef::NO_SUGGESTION_CHOSEN, ASCIIToUTF16("foo"),
[email protected]29653892013-03-02 19:25:37818 "http://bar/foo?q=foobar" },
[email protected]0085863a2013-12-06 21:19:03819 { 0, base::string16(), "http://bar/foo?oq=&q=foobar" },
[email protected]29653892013-03-02 19:25:37820 { 1, ASCIIToUTF16("foo"), "http://bar/foo?oq=foo&q=foobar" },
[email protected]d82443b2009-01-15 19:54:56821 };
[email protected]573889f22012-04-07 01:31:54822 TemplateURLData data;
[email protected]29653892013-03-02 19:25:37823 data.SetURL("http://bar/foo?{google:originalQueryForSuggestion}"
824 "q={searchTerms}");
[email protected]573889f22012-04-07 01:31:54825 data.input_encodings.push_back("UTF-8");
[email protected]168d08722014-06-18 07:13:28826 TemplateURL url(data);
[email protected]ce7ee5f2014-06-16 23:41:19827 EXPECT_TRUE(url.url_ref().IsValid(search_terms_data_));
828 ASSERT_TRUE(url.url_ref().SupportsReplacement(search_terms_data_));
Avi Drissman2244c2d2018-12-25 23:08:02829 for (size_t i = 0; i < base::size(test_data); ++i) {
[email protected]bca359b2012-06-24 07:53:04830 TemplateURLRef::SearchTermsArgs search_terms_args(
831 ASCIIToUTF16("foobar"));
832 search_terms_args.accepted_suggestion = test_data[i].accepted_suggestion;
833 search_terms_args.original_query =
834 test_data[i].original_query_for_suggestion;
[email protected]ce7ee5f2014-06-16 23:41:19835 GURL result(url.url_ref().ReplaceSearchTerms(search_terms_args,
836 search_terms_data_));
[email protected]b37bdfe2012-03-16 20:53:27837 ASSERT_TRUE(result.is_valid());
838 EXPECT_EQ(test_data[i].expected_result, result.spec());
[email protected]d82443b2009-01-15 19:54:56839 }
840}
841
[email protected]81f808de2009-09-25 01:36:34842TEST_F(TemplateURLTest, RLZ) {
[email protected]798baa8e2014-06-20 05:42:44843 base::string16 rlz_string = search_terms_data_.GetRlzParameterValue(false);
[email protected]d82443b2009-01-15 19:54:56844
[email protected]573889f22012-04-07 01:31:54845 TemplateURLData data;
846 data.SetURL("http://bar/?{google:RLZ}{searchTerms}");
[email protected]168d08722014-06-18 07:13:28847 TemplateURL url(data);
[email protected]ce7ee5f2014-06-16 23:41:19848 EXPECT_TRUE(url.url_ref().IsValid(search_terms_data_));
849 ASSERT_TRUE(url.url_ref().SupportsReplacement(search_terms_data_));
[email protected]bca359b2012-06-24 07:53:04850 GURL result(url.url_ref().ReplaceSearchTerms(
[email protected]ce7ee5f2014-06-16 23:41:19851 TemplateURLRef::SearchTermsArgs(ASCIIToUTF16("x")), search_terms_data_));
[email protected]d82443b2009-01-15 19:54:56852 ASSERT_TRUE(result.is_valid());
[email protected]798baa8e2014-06-20 05:42:44853 EXPECT_EQ("http://bar/?rlz=" + base::UTF16ToUTF8(rlz_string) + "&x",
854 result.spec());
[email protected]d82443b2009-01-15 19:54:56855}
856
[email protected]c8ccc41d2014-04-10 04:42:12857TEST_F(TemplateURLTest, RLZFromAppList) {
[email protected]798baa8e2014-06-20 05:42:44858 base::string16 rlz_string = search_terms_data_.GetRlzParameterValue(true);
[email protected]c8ccc41d2014-04-10 04:42:12859
860 TemplateURLData data;
861 data.SetURL("http://bar/?{google:RLZ}{searchTerms}");
[email protected]168d08722014-06-18 07:13:28862 TemplateURL url(data);
[email protected]ce7ee5f2014-06-16 23:41:19863 EXPECT_TRUE(url.url_ref().IsValid(search_terms_data_));
864 ASSERT_TRUE(url.url_ref().SupportsReplacement(search_terms_data_));
[email protected]c8ccc41d2014-04-10 04:42:12865 TemplateURLRef::SearchTermsArgs args(ASCIIToUTF16("x"));
866 args.from_app_list = true;
[email protected]ce7ee5f2014-06-16 23:41:19867 GURL result(url.url_ref().ReplaceSearchTerms(args, search_terms_data_));
[email protected]c8ccc41d2014-04-10 04:42:12868 ASSERT_TRUE(result.is_valid());
[email protected]798baa8e2014-06-20 05:42:44869 EXPECT_EQ("http://bar/?rlz=" + base::UTF16ToUTF8(rlz_string) + "&x",
870 result.spec());
[email protected]c8ccc41d2014-04-10 04:42:12871}
[email protected]c8ccc41d2014-04-10 04:42:12872
[email protected]d82443b2009-01-15 19:54:56873TEST_F(TemplateURLTest, HostAndSearchTermKey) {
874 struct TestData {
[email protected]ddd231e2010-06-29 20:35:19875 const std::string url;
[email protected]d82443b2009-01-15 19:54:56876 const std::string host;
877 const std::string path;
878 const std::string search_term_key;
[email protected]573889f22012-04-07 01:31:54879 } test_data[] = {
vitbarf2a11562017-05-15 14:09:50880 {"http://blah/?foo=bar&q={searchTerms}&b=x", "blah", "/", "q"},
881 {"http://blah/{searchTerms}", "blah", "", ""},
[email protected]d82443b2009-01-15 19:54:56882
vitbarf2a11562017-05-15 14:09:50883 // No term should result in empty values.
884 {"http://blah/", "", "", ""},
[email protected]d82443b2009-01-15 19:54:56885
vitbarf2a11562017-05-15 14:09:50886 // Multiple terms should result in empty values.
887 {"http://blah/?q={searchTerms}&x={searchTerms}", "", "", ""},
[email protected]d82443b2009-01-15 19:54:56888
vitbarf2a11562017-05-15 14:09:50889 // Term in the host shouldn't match.
890 {"http://{searchTerms}", "", "", ""},
[email protected]d82443b2009-01-15 19:54:56891
vitbarf2a11562017-05-15 14:09:50892 {"http://blah/?q={searchTerms}", "blah", "/", "q"},
893 {"https://blah/?q={searchTerms}", "blah", "/", "q"},
[email protected]d82443b2009-01-15 19:54:56894
vitbarf2a11562017-05-15 14:09:50895 // Single term with extra chars in value should match.
896 {"http://blah/?q=stock:{searchTerms}", "blah", "/", "q"},
[email protected]d82443b2009-01-15 19:54:56897 };
898
Avi Drissman2244c2d2018-12-25 23:08:02899 for (size_t i = 0; i < base::size(test_data); ++i) {
[email protected]573889f22012-04-07 01:31:54900 TemplateURLData data;
901 data.SetURL(test_data[i].url);
[email protected]168d08722014-06-18 07:13:28902 TemplateURL url(data);
[email protected]ce7ee5f2014-06-16 23:41:19903 EXPECT_EQ(test_data[i].host, url.url_ref().GetHost(search_terms_data_));
904 EXPECT_EQ(test_data[i].path, url.url_ref().GetPath(search_terms_data_));
905 EXPECT_EQ(test_data[i].search_term_key,
906 url.url_ref().GetSearchTermKey(search_terms_data_));
[email protected]d82443b2009-01-15 19:54:56907 }
908}
909
alexmos294849f2015-03-14 00:55:06910TEST_F(TemplateURLTest, SearchTermKeyLocation) {
911 struct TestData {
912 const std::string url;
913 const url::Parsed::ComponentType location;
914 const std::string path;
vitbarf2a11562017-05-15 14:09:50915 const std::string key;
916 const std::string value_prefix;
917 const std::string value_suffix;
alexmos294849f2015-03-14 00:55:06918 } test_data[] = {
vitbarf2a11562017-05-15 14:09:50919 {"http://blah/{searchTerms}/", url::Parsed::PATH, "", "", "/", "/"},
920 {"http://blah/{searchTerms}", url::Parsed::PATH, "", "", "/", ""},
921 {"http://blah/begin/{searchTerms}/end", url::Parsed::PATH, "", "",
922 "/begin/", "/end"},
923 {"http://blah/?foo=bar&q={searchTerms}&b=x", url::Parsed::QUERY, "/", "q",
924 "", ""},
925 {"http://blah/?foo=bar#x={searchTerms}&b=x", url::Parsed::REF, "/", "x",
926 "", ""},
927 {"http://www.example.com/?q=chromium-{searchTerms}@chromium.org/info",
928 url::Parsed::QUERY, "/", "q", "chromium-", "@chromium.org/info"},
alexmos294849f2015-03-14 00:55:06929
vitbarf2a11562017-05-15 14:09:50930 // searchTerms is a key, not a value, so this should result in an empty
931 // value.
932 {"http://blah/?foo=bar#x=012345678901234&a=b&{searchTerms}=x",
933 url::Parsed::QUERY, "", "", "", ""},
alexmos294849f2015-03-14 00:55:06934
vitbarf2a11562017-05-15 14:09:50935 // Multiple search terms should result in empty values.
936 {"http://blah/{searchTerms}?q={searchTerms}", url::Parsed::QUERY, "", "",
937 "", ""},
938 {"http://blah/{searchTerms}#x={searchTerms}", url::Parsed::QUERY, "", "",
939 "", ""},
940 {"http://blah/?q={searchTerms}#x={searchTerms}", url::Parsed::QUERY, "",
941 "", "", ""},
alexmos294849f2015-03-14 00:55:06942 };
943
Avi Drissman2244c2d2018-12-25 23:08:02944 for (size_t i = 0; i < base::size(test_data); ++i) {
alexmos294849f2015-03-14 00:55:06945 TemplateURLData data;
946 data.SetURL(test_data[i].url);
947 TemplateURL url(data);
948 EXPECT_EQ(test_data[i].location,
949 url.url_ref().GetSearchTermKeyLocation(search_terms_data_));
950 EXPECT_EQ(test_data[i].path,
951 url.url_ref().GetPath(search_terms_data_));
vitbarf2a11562017-05-15 14:09:50952 EXPECT_EQ(test_data[i].key,
953 url.url_ref().GetSearchTermKey(search_terms_data_));
954 EXPECT_EQ(test_data[i].value_prefix,
955 url.url_ref().GetSearchTermValuePrefix(search_terms_data_));
956 EXPECT_EQ(test_data[i].value_suffix,
957 url.url_ref().GetSearchTermValueSuffix(search_terms_data_));
alexmos294849f2015-03-14 00:55:06958 }
959}
960
[email protected]d82443b2009-01-15 19:54:56961TEST_F(TemplateURLTest, GoogleBaseSuggestURL) {
962 static const struct {
[email protected]ddd231e2010-06-29 20:35:19963 const char* const base_url;
964 const char* const base_suggest_url;
[email protected]d82443b2009-01-15 19:54:56965 } data[] = {
[email protected]014010e2011-10-01 04:12:44966 { "http://google.com/", "http://google.com/complete/", },
967 { "http://www.google.com/", "http://www.google.com/complete/", },
968 { "http://www.google.co.uk/", "http://www.google.co.uk/complete/", },
969 { "http://www.google.com.by/", "http://www.google.com.by/complete/", },
970 { "http://google.com/intl/xx/", "http://google.com/complete/", },
[email protected]d82443b2009-01-15 19:54:56971 };
972
Avi Drissman2244c2d2018-12-25 23:08:02973 for (size_t i = 0; i < base::size(data); ++i)
[email protected]d82443b2009-01-15 19:54:56974 CheckSuggestBaseURL(data[i].base_url, data[i].base_suggest_url);
975}
976
[email protected]81c6ef62010-01-21 09:58:47977TEST_F(TemplateURLTest, ParseParameterKnown) {
[email protected]ddd231e2010-06-29 20:35:19978 std::string parsed_url("{searchTerms}");
[email protected]573889f22012-04-07 01:31:54979 TemplateURLData data;
980 data.SetURL(parsed_url);
[email protected]168d08722014-06-18 07:13:28981 TemplateURL url(data);
[email protected]81c6ef62010-01-21 09:58:47982 TemplateURLRef::Replacements replacements;
[email protected]360ba052012-04-04 17:26:13983 EXPECT_TRUE(url.url_ref().ParseParameter(0, 12, &parsed_url, &replacements));
[email protected]ddd231e2010-06-29 20:35:19984 EXPECT_EQ(std::string(), parsed_url);
[email protected]81c6ef62010-01-21 09:58:47985 ASSERT_EQ(1U, replacements.size());
[email protected]b37bdfe2012-03-16 20:53:27986 EXPECT_EQ(0U, replacements[0].index);
[email protected]81c6ef62010-01-21 09:58:47987 EXPECT_EQ(TemplateURLRef::SEARCH_TERMS, replacements[0].type);
988}
989
990TEST_F(TemplateURLTest, ParseParameterUnknown) {
[email protected]243abf32012-05-15 18:28:20991 std::string parsed_url("{fhqwhgads}abc");
[email protected]573889f22012-04-07 01:31:54992 TemplateURLData data;
993 data.SetURL(parsed_url);
[email protected]168d08722014-06-18 07:13:28994 TemplateURL url(data);
[email protected]81c6ef62010-01-21 09:58:47995 TemplateURLRef::Replacements replacements;
[email protected]1a257262011-06-28 22:15:44996
997 // By default, TemplateURLRef should not consider itself prepopulated.
998 // Therefore we should not replace the unknown parameter.
[email protected]360ba052012-04-04 17:26:13999 EXPECT_FALSE(url.url_ref().ParseParameter(0, 10, &parsed_url, &replacements));
[email protected]243abf32012-05-15 18:28:201000 EXPECT_EQ("{fhqwhgads}abc", parsed_url);
[email protected]1a257262011-06-28 22:15:441001 EXPECT_TRUE(replacements.empty());
1002
1003 // If the TemplateURLRef is prepopulated, we should remove unknown parameters.
[email protected]243abf32012-05-15 18:28:201004 parsed_url = "{fhqwhgads}abc";
[email protected]573889f22012-04-07 01:31:541005 data.prepopulate_id = 1;
[email protected]168d08722014-06-18 07:13:281006 TemplateURL url2(data);
[email protected]495c30b2012-05-15 18:48:151007 EXPECT_TRUE(url2.url_ref().ParseParameter(0, 10, &parsed_url, &replacements));
[email protected]243abf32012-05-15 18:28:201008 EXPECT_EQ("abc", parsed_url);
[email protected]81c6ef62010-01-21 09:58:471009 EXPECT_TRUE(replacements.empty());
1010}
1011
1012TEST_F(TemplateURLTest, ParseURLEmpty) {
[email protected]168d08722014-06-18 07:13:281013 TemplateURL url((TemplateURLData()));
[email protected]81c6ef62010-01-21 09:58:471014 TemplateURLRef::Replacements replacements;
1015 bool valid = false;
Ivan Kotenkov75b1c3a2017-10-24 14:47:241016 EXPECT_EQ(std::string(), url.url_ref().ParseURL(std::string(), &replacements,
1017 nullptr, &valid));
[email protected]81c6ef62010-01-21 09:58:471018 EXPECT_TRUE(replacements.empty());
1019 EXPECT_TRUE(valid);
1020}
1021
1022TEST_F(TemplateURLTest, ParseURLNoTemplateEnd) {
[email protected]573889f22012-04-07 01:31:541023 TemplateURLData data;
1024 data.SetURL("{");
[email protected]168d08722014-06-18 07:13:281025 TemplateURL url(data);
[email protected]81c6ef62010-01-21 09:58:471026 TemplateURLRef::Replacements replacements;
1027 bool valid = false;
Ivan Kotenkov75b1c3a2017-10-24 14:47:241028 EXPECT_EQ(std::string(),
1029 url.url_ref().ParseURL("{", &replacements, nullptr, &valid));
[email protected]81c6ef62010-01-21 09:58:471030 EXPECT_TRUE(replacements.empty());
1031 EXPECT_FALSE(valid);
1032}
1033
1034TEST_F(TemplateURLTest, ParseURLNoKnownParameters) {
[email protected]573889f22012-04-07 01:31:541035 TemplateURLData data;
1036 data.SetURL("{}");
[email protected]168d08722014-06-18 07:13:281037 TemplateURL url(data);
[email protected]81c6ef62010-01-21 09:58:471038 TemplateURLRef::Replacements replacements;
1039 bool valid = false;
Ivan Kotenkov75b1c3a2017-10-24 14:47:241040 EXPECT_EQ("{}", url.url_ref().ParseURL("{}", &replacements, nullptr, &valid));
[email protected]81c6ef62010-01-21 09:58:471041 EXPECT_TRUE(replacements.empty());
1042 EXPECT_TRUE(valid);
1043}
1044
1045TEST_F(TemplateURLTest, ParseURLTwoParameters) {
[email protected]573889f22012-04-07 01:31:541046 TemplateURLData data;
1047 data.SetURL("{}{{%s}}");
[email protected]168d08722014-06-18 07:13:281048 TemplateURL url(data);
[email protected]81c6ef62010-01-21 09:58:471049 TemplateURLRef::Replacements replacements;
1050 bool valid = false;
Ivan Kotenkov75b1c3a2017-10-24 14:47:241051 EXPECT_EQ("{}{}", url.url_ref().ParseURL("{}{{searchTerms}}", &replacements,
1052 nullptr, &valid));
[email protected]81c6ef62010-01-21 09:58:471053 ASSERT_EQ(1U, replacements.size());
[email protected]b37bdfe2012-03-16 20:53:271054 EXPECT_EQ(3U, replacements[0].index);
[email protected]81c6ef62010-01-21 09:58:471055 EXPECT_EQ(TemplateURLRef::SEARCH_TERMS, replacements[0].type);
1056 EXPECT_TRUE(valid);
1057}
1058
1059TEST_F(TemplateURLTest, ParseURLNestedParameter) {
[email protected]573889f22012-04-07 01:31:541060 TemplateURLData data;
1061 data.SetURL("{%s");
[email protected]168d08722014-06-18 07:13:281062 TemplateURL url(data);
[email protected]81c6ef62010-01-21 09:58:471063 TemplateURLRef::Replacements replacements;
1064 bool valid = false;
Ivan Kotenkov75b1c3a2017-10-24 14:47:241065 EXPECT_EQ("{", url.url_ref().ParseURL("{{searchTerms}", &replacements,
1066 nullptr, &valid));
[email protected]81c6ef62010-01-21 09:58:471067 ASSERT_EQ(1U, replacements.size());
[email protected]b37bdfe2012-03-16 20:53:271068 EXPECT_EQ(1U, replacements[0].index);
[email protected]81c6ef62010-01-21 09:58:471069 EXPECT_EQ(TemplateURLRef::SEARCH_TERMS, replacements[0].type);
1070 EXPECT_TRUE(valid);
1071}
[email protected]5b3078752012-10-09 18:54:161072
[email protected]fd6d8822012-12-08 06:56:111073TEST_F(TemplateURLTest, SearchClient) {
1074 const std::string base_url_str("http://google.com/?");
1075 const std::string terms_str("{searchTerms}&{google:searchClient}");
1076 const std::string full_url_str = base_url_str + terms_str;
[email protected]0085863a2013-12-06 21:19:031077 const base::string16 terms(ASCIIToUTF16(terms_str));
[email protected]798baa8e2014-06-20 05:42:441078 search_terms_data_.set_google_base_url(base_url_str);
[email protected]fd6d8822012-12-08 06:56:111079
1080 TemplateURLData data;
1081 data.SetURL(full_url_str);
[email protected]168d08722014-06-18 07:13:281082 TemplateURL url(data);
[email protected]ce7ee5f2014-06-16 23:41:191083 EXPECT_TRUE(url.url_ref().IsValid(search_terms_data_));
1084 ASSERT_TRUE(url.url_ref().SupportsReplacement(search_terms_data_));
[email protected]fd6d8822012-12-08 06:56:111085 TemplateURLRef::SearchTermsArgs search_terms_args(ASCIIToUTF16("foobar"));
1086
1087 // Check that the URL is correct when a client is not present.
[email protected]ce7ee5f2014-06-16 23:41:191088 GURL result(url.url_ref().ReplaceSearchTerms(search_terms_args,
1089 search_terms_data_));
[email protected]fd6d8822012-12-08 06:56:111090 ASSERT_TRUE(result.is_valid());
1091 EXPECT_EQ("http://google.com/?foobar&", result.spec());
1092
1093 // Check that the URL is correct when a client is present.
[email protected]798baa8e2014-06-20 05:42:441094 search_terms_data_.set_search_client("search_client");
[email protected]ce7ee5f2014-06-16 23:41:191095 GURL result_2(url.url_ref().ReplaceSearchTerms(search_terms_args,
1096 search_terms_data_));
[email protected]fd6d8822012-12-08 06:56:111097 ASSERT_TRUE(result_2.is_valid());
[email protected]798baa8e2014-06-20 05:42:441098 EXPECT_EQ("http://google.com/?foobar&client=search_client&", result_2.spec());
[email protected]fd6d8822012-12-08 06:56:111099}
[email protected]fd6d8822012-12-08 06:56:111100
[email protected]5b3078752012-10-09 18:54:161101TEST_F(TemplateURLTest, GetURLNoSuggestionsURL) {
1102 TemplateURLData data;
1103 data.SetURL("http://google.com/?q={searchTerms}");
[email protected]5b3078752012-10-09 18:54:161104 data.alternate_urls.push_back("http://google.com/alt?q={searchTerms}");
1105 data.alternate_urls.push_back("{google:baseURL}/alt/#q={searchTerms}");
[email protected]168d08722014-06-18 07:13:281106 TemplateURL url(data);
vitbar5bd8c252016-01-29 18:44:511107 const std::vector<TemplateURLRef>& url_refs = url.url_refs();
1108 ASSERT_EQ(3U, url_refs.size());
1109 EXPECT_EQ("http://google.com/alt?q={searchTerms}", url_refs[0].GetURL());
1110 EXPECT_EQ("{google:baseURL}/alt/#q={searchTerms}", url_refs[1].GetURL());
1111 EXPECT_EQ("http://google.com/?q={searchTerms}", url_refs[2].GetURL());
[email protected]5b3078752012-10-09 18:54:161112}
1113
1114TEST_F(TemplateURLTest, GetURLOnlyOneURL) {
1115 TemplateURLData data;
1116 data.SetURL("http://www.google.co.uk/");
[email protected]168d08722014-06-18 07:13:281117 TemplateURL url(data);
vitbar5bd8c252016-01-29 18:44:511118 const std::vector<TemplateURLRef>& url_refs = url.url_refs();
1119 ASSERT_EQ(1U, url_refs.size());
1120 EXPECT_EQ("http://www.google.co.uk/", url_refs[0].GetURL());
[email protected]5b3078752012-10-09 18:54:161121}
1122
1123TEST_F(TemplateURLTest, ExtractSearchTermsFromURL) {
1124 TemplateURLData data;
1125 data.SetURL("http://google.com/?q={searchTerms}");
[email protected]5b3078752012-10-09 18:54:161126 data.alternate_urls.push_back("http://google.com/alt/#q={searchTerms}");
1127 data.alternate_urls.push_back(
1128 "http://google.com/alt/?ext=foo&q={searchTerms}#ref=bar");
[email protected]168d08722014-06-18 07:13:281129 TemplateURL url(data);
[email protected]0085863a2013-12-06 21:19:031130 base::string16 result;
[email protected]5b3078752012-10-09 18:54:161131
1132 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
[email protected]ce7ee5f2014-06-16 23:41:191133 GURL("http://google.com/?q=something"), search_terms_data_, &result));
[email protected]4076ea62013-01-09 01:47:191134 EXPECT_EQ(ASCIIToUTF16("something"), result);
1135
1136 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
Marc Treibf0f6afc92017-10-04 09:05:471137 GURL("http://google.com/?q=something"), search_terms_data_, &result));
[email protected]4076ea62013-01-09 01:47:191138 EXPECT_EQ(ASCIIToUTF16("something"), result);
1139
1140 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
Marc Treibf0f6afc92017-10-04 09:05:471141 GURL("http://google.com/?q=something"), search_terms_data_, &result));
[email protected]4076ea62013-01-09 01:47:191142 EXPECT_EQ(ASCIIToUTF16("something"), result);
1143
1144 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
Marc Treibf0f6afc92017-10-04 09:05:471145 GURL("http://google.com/?q=something"), search_terms_data_, &result));
[email protected]4076ea62013-01-09 01:47:191146 EXPECT_EQ(ASCIIToUTF16("something"), result);
1147
1148 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
[email protected]ce7ee5f2014-06-16 23:41:191149 GURL("http://google.com/alt/#q=something"),
1150 search_terms_data_, &result));
[email protected]4076ea62013-01-09 01:47:191151 EXPECT_EQ(ASCIIToUTF16("something"), result);
1152
1153 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
Marc Treibf0f6afc92017-10-04 09:05:471154 GURL("http://google.com/alt/#q=something"), search_terms_data_, &result));
[email protected]4076ea62013-01-09 01:47:191155 EXPECT_EQ(ASCIIToUTF16("something"), result);
1156
1157 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
Marc Treibf0f6afc92017-10-04 09:05:471158 GURL("http://google.com/alt/#q=something"), search_terms_data_, &result));
[email protected]4076ea62013-01-09 01:47:191159 EXPECT_EQ(ASCIIToUTF16("something"), result);
1160
1161 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
Marc Treibf0f6afc92017-10-04 09:05:471162 GURL("http://google.com/alt/#q=something"), search_terms_data_, &result));
[email protected]5b3078752012-10-09 18:54:161163 EXPECT_EQ(ASCIIToUTF16("something"), result);
1164
1165 EXPECT_FALSE(url.ExtractSearchTermsFromURL(
[email protected]ce7ee5f2014-06-16 23:41:191166 GURL("http://google.ca/?q=something"), search_terms_data_, &result));
[email protected]b959d7d42013-12-13 17:26:371167 EXPECT_EQ(base::string16(), result);
[email protected]5b3078752012-10-09 18:54:161168
1169 EXPECT_FALSE(url.ExtractSearchTermsFromURL(
[email protected]ce7ee5f2014-06-16 23:41:191170 GURL("http://google.ca/?q=something&q=anything"),
1171 search_terms_data_, &result));
[email protected]b959d7d42013-12-13 17:26:371172 EXPECT_EQ(base::string16(), result);
[email protected]67d8b752013-04-03 17:33:271173
1174 EXPECT_FALSE(url.ExtractSearchTermsFromURL(
[email protected]ce7ee5f2014-06-16 23:41:191175 GURL("http://google.com/foo/?q=foo"), search_terms_data_, &result));
[email protected]b959d7d42013-12-13 17:26:371176 EXPECT_EQ(base::string16(), result);
[email protected]5b3078752012-10-09 18:54:161177
[email protected]32e2d81b2012-10-16 19:03:251178 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
[email protected]ce7ee5f2014-06-16 23:41:191179 GURL("https://google.com/?q=foo"), search_terms_data_, &result));
[email protected]32e2d81b2012-10-16 19:03:251180 EXPECT_EQ(ASCIIToUTF16("foo"), result);
[email protected]5b3078752012-10-09 18:54:161181
1182 EXPECT_FALSE(url.ExtractSearchTermsFromURL(
[email protected]ce7ee5f2014-06-16 23:41:191183 GURL("http://google.com:8080/?q=foo"), search_terms_data_, &result));
[email protected]b959d7d42013-12-13 17:26:371184 EXPECT_EQ(base::string16(), result);
[email protected]5b3078752012-10-09 18:54:161185
1186 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
[email protected]ce7ee5f2014-06-16 23:41:191187 GURL("http://google.com/?q=1+2+3&b=456"), search_terms_data_, &result));
[email protected]5b3078752012-10-09 18:54:161188 EXPECT_EQ(ASCIIToUTF16("1 2 3"), result);
1189
1190 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
[email protected]ce7ee5f2014-06-16 23:41:191191 GURL("http://google.com/alt/?q=123#q=456"),
1192 search_terms_data_, &result));
[email protected]5b3078752012-10-09 18:54:161193 EXPECT_EQ(ASCIIToUTF16("456"), result);
1194
1195 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
[email protected]ce7ee5f2014-06-16 23:41:191196 GURL("http://google.com/alt/?a=012&q=123&b=456#f=789"),
1197 search_terms_data_, &result));
[email protected]5b3078752012-10-09 18:54:161198 EXPECT_EQ(ASCIIToUTF16("123"), result);
1199
1200 EXPECT_TRUE(url.ExtractSearchTermsFromURL(GURL(
[email protected]ce7ee5f2014-06-16 23:41:191201 "http://google.com/alt/?a=012&q=123&b=456#j=abc&q=789&h=def9"),
1202 search_terms_data_, &result));
[email protected]5b3078752012-10-09 18:54:161203 EXPECT_EQ(ASCIIToUTF16("789"), result);
1204
1205 EXPECT_FALSE(url.ExtractSearchTermsFromURL(
[email protected]ce7ee5f2014-06-16 23:41:191206 GURL("http://google.com/alt/?q="), search_terms_data_, &result));
[email protected]b959d7d42013-12-13 17:26:371207 EXPECT_EQ(base::string16(), 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/alt/?#q="), 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_FALSE(url.ExtractSearchTermsFromURL(
[email protected]ce7ee5f2014-06-16 23:41:191214 GURL("http://google.com/alt/?q=#q="), search_terms_data_, &result));
[email protected]b959d7d42013-12-13 17:26:371215 EXPECT_EQ(base::string16(), result);
[email protected]5b3078752012-10-09 18:54:161216
1217 EXPECT_FALSE(url.ExtractSearchTermsFromURL(
[email protected]ce7ee5f2014-06-16 23:41:191218 GURL("http://google.com/alt/?q=123#q="), search_terms_data_, &result));
[email protected]b959d7d42013-12-13 17:26:371219 EXPECT_EQ(base::string16(), result);
[email protected]5b3078752012-10-09 18:54:161220
1221 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
[email protected]ce7ee5f2014-06-16 23:41:191222 GURL("http://google.com/alt/?q=#q=123"), search_terms_data_, &result));
[email protected]5b3078752012-10-09 18:54:161223 EXPECT_EQ(ASCIIToUTF16("123"), result);
1224}
[email protected]4076ea62013-01-09 01:47:191225
alexmos294849f2015-03-14 00:55:061226TEST_F(TemplateURLTest, ExtractSearchTermsFromURLPath) {
1227 TemplateURLData data;
1228 data.SetURL("http://term-in-path.com/begin/{searchTerms}/end");
1229 TemplateURL url(data);
1230 base::string16 result;
1231
1232 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
1233 GURL("http://term-in-path.com/begin/something/end"),
1234 search_terms_data_, &result));
1235 EXPECT_EQ(ASCIIToUTF16("something"), result);
1236
1237 // "%20" must be converted to space.
1238 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
1239 GURL("http://term-in-path.com/begin/a%20b%20c/end"),
1240 search_terms_data_, &result));
1241 EXPECT_EQ(ASCIIToUTF16("a b c"), result);
1242
1243 // Plus must not be converted to space.
1244 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
1245 GURL("http://term-in-path.com/begin/1+2+3/end"),
1246 search_terms_data_, &result));
1247 EXPECT_EQ(ASCIIToUTF16("1+2+3"), result);
1248
1249 EXPECT_FALSE(url.ExtractSearchTermsFromURL(
1250 GURL("http://term-in-path.com/about"), search_terms_data_, &result));
1251 EXPECT_EQ(base::string16(), result);
1252
1253 EXPECT_FALSE(url.ExtractSearchTermsFromURL(
1254 GURL("http://term-in-path.com/begin"), search_terms_data_, &result));
1255 EXPECT_EQ(base::string16(), result);
1256
1257 EXPECT_FALSE(url.ExtractSearchTermsFromURL(
1258 GURL("http://term-in-path.com/end"), search_terms_data_, &result));
1259 EXPECT_EQ(base::string16(), result);
1260}
1261
vitbar27804d102015-04-15 10:54:411262// Checks that the ExtractSearchTermsFromURL function works correctly
1263// for urls containing non-latin characters in UTF8 encoding.
1264TEST_F(TemplateURLTest, ExtractSearchTermsFromUTF8URL) {
1265 TemplateURLData data;
1266 data.SetURL("http://utf-8.ru/?q={searchTerms}");
1267 data.alternate_urls.push_back("http://utf-8.ru/#q={searchTerms}");
1268 data.alternate_urls.push_back("http://utf-8.ru/path/{searchTerms}");
1269 TemplateURL url(data);
1270 base::string16 result;
1271
1272 // Russian text encoded with UTF-8.
1273 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
vitbar7060e23c2015-04-22 13:19:551274 GURL("http://utf-8.ru/?q=%D0%97%D0%B4%D1%80%D0%B0%D0%B2%D1%81%D1%82"
1275 "%D0%B2%D1%83%D0%B9,+%D0%BC%D0%B8%D1%80!"),
vitbar27804d102015-04-15 10:54:411276 search_terms_data_, &result));
1277 EXPECT_EQ(
1278 base::WideToUTF16(
1279 L"\x0417\x0434\x0440\x0430\x0432\x0441\x0442\x0432\x0443\x0439, "
1280 L"\x043C\x0438\x0440!"),
1281 result);
1282
1283 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
vitbar7060e23c2015-04-22 13:19:551284 GURL("http://utf-8.ru/#q=%D0%B4%D0%B2%D0%B0+%D1%81%D0%BB%D0%BE%D0%B2"
1285 "%D0%B0"),
vitbar27804d102015-04-15 10:54:411286 search_terms_data_, &result));
1287 EXPECT_EQ(
1288 base::WideToUTF16(L"\x0434\x0432\x0430 \x0441\x043B\x043E\x0432\x0430"),
1289 result);
1290
1291 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
vitbar7060e23c2015-04-22 13:19:551292 GURL("http://utf-8.ru/path/%D0%B1%D1%83%D0%BA%D0%B2%D1%8B%20%D0%90%20"
1293 "%D0%B8%20A"),
vitbar27804d102015-04-15 10:54:411294 search_terms_data_, &result));
1295 EXPECT_EQ(
1296 base::WideToUTF16(L"\x0431\x0443\x043A\x0432\x044B \x0410 \x0438 A"),
1297 result);
1298}
1299
1300// Checks that the ExtractSearchTermsFromURL function works correctly
1301// for urls containing non-latin characters in non-UTF8 encoding.
1302TEST_F(TemplateURLTest, ExtractSearchTermsFromNonUTF8URL) {
1303 TemplateURLData data;
1304 data.SetURL("http://windows-1251.ru/?q={searchTerms}");
1305 data.alternate_urls.push_back("http://windows-1251.ru/#q={searchTerms}");
1306 data.alternate_urls.push_back("http://windows-1251.ru/path/{searchTerms}");
1307 data.input_encodings.push_back("windows-1251");
1308 TemplateURL url(data);
1309 base::string16 result;
1310
1311 // Russian text encoded with Windows-1251.
1312 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
1313 GURL("http://windows-1251.ru/?q=%C7%E4%F0%E0%E2%F1%F2%E2%F3%E9%2C+"
1314 "%EC%E8%F0!"),
1315 search_terms_data_, &result));
1316 EXPECT_EQ(
1317 base::WideToUTF16(
1318 L"\x0417\x0434\x0440\x0430\x0432\x0441\x0442\x0432\x0443\x0439, "
1319 L"\x043C\x0438\x0440!"),
1320 result);
1321
1322 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
1323 GURL("http://windows-1251.ru/#q=%E4%E2%E0+%F1%EB%EE%E2%E0"),
1324 search_terms_data_, &result));
1325 EXPECT_EQ(
1326 base::WideToUTF16(L"\x0434\x0432\x0430 \x0441\x043B\x043E\x0432\x0430"),
1327 result);
1328
1329 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
1330 GURL("http://windows-1251.ru/path/%E1%F3%EA%E2%FB%20%C0%20%E8%20A"),
1331 search_terms_data_, &result));
1332 EXPECT_EQ(
1333 base::WideToUTF16(L"\x0431\x0443\x043A\x0432\x044B \x0410 \x0438 A"),
1334 result);
1335}
1336
jbroman50832022016-04-21 23:53:001337// Checks that the ExtractSearchTermsFromURL function strips constant
1338// prefix/suffix strings from the search terms param.
1339TEST_F(TemplateURLTest, ExtractSearchTermsWithPrefixAndSuffix) {
1340 TemplateURLData data;
1341 data.alternate_urls.push_back(
1342 "http://www.example.com/?q=chromium-{searchTerms}@chromium.org");
1343 data.alternate_urls.push_back(
1344 "http://www.example.com/chromium-{searchTerms}@chromium.org/info");
1345 TemplateURL url(data);
1346 base::string16 result;
1347
1348 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
1349 GURL("http://www.example.com/[email protected]"),
1350 search_terms_data_, &result));
1351 EXPECT_EQ(ASCIIToUTF16("dev"), result);
1352
1353 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
1354 GURL("http://www.example.com/[email protected]/info"),
1355 search_terms_data_, &result));
1356 EXPECT_EQ(ASCIIToUTF16("dev"), result);
1357
1358 // Don't match if the prefix and suffix aren't there.
1359 EXPECT_FALSE(url.ExtractSearchTermsFromURL(
1360 GURL("http://www.example.com/?q=invalid"), search_terms_data_, &result));
jbromane8b8728d2017-04-12 17:29:391361
1362 // Don't match if the prefix and suffix overlap.
1363 TemplateURLData data_with_overlap;
1364 data.alternate_urls.push_back(
1365 "http://www.example.com/?q=goo{searchTerms}oogle");
1366 TemplateURL url_with_overlap(data);
1367 EXPECT_FALSE(url_with_overlap.ExtractSearchTermsFromURL(
1368 GURL("http://www.example.com/?q=google"), search_terms_data_, &result));
jbroman50832022016-04-21 23:53:001369}
1370
[email protected]f62e30f52013-03-23 03:45:151371TEST_F(TemplateURLTest, ReplaceSearchTermsInURL) {
1372 TemplateURLData data;
1373 data.SetURL("http://google.com/?q={searchTerms}");
[email protected]f62e30f52013-03-23 03:45:151374 data.alternate_urls.push_back("http://google.com/alt/#q={searchTerms}");
1375 data.alternate_urls.push_back(
1376 "http://google.com/alt/?ext=foo&q={searchTerms}#ref=bar");
[email protected]168d08722014-06-18 07:13:281377 TemplateURL url(data);
[email protected]f62e30f52013-03-23 03:45:151378 TemplateURLRef::SearchTermsArgs search_terms(ASCIIToUTF16("Bob Morane"));
1379 GURL result;
1380
1381 EXPECT_TRUE(url.ReplaceSearchTermsInURL(
[email protected]ce7ee5f2014-06-16 23:41:191382 GURL("http://google.com/?q=something"), search_terms,
1383 search_terms_data_, &result));
vitbarf298455d2015-04-21 12:58:101384 EXPECT_EQ(GURL("http://google.com/?q=Bob+Morane"), result);
[email protected]f62e30f52013-03-23 03:45:151385
1386 result = GURL("http://should.not.change.com");
1387 EXPECT_FALSE(url.ReplaceSearchTermsInURL(
[email protected]ce7ee5f2014-06-16 23:41:191388 GURL("http://google.ca/?q=something"), search_terms,
1389 search_terms_data_, &result));
[email protected]f62e30f52013-03-23 03:45:151390 EXPECT_EQ(GURL("http://should.not.change.com"), result);
1391
1392 EXPECT_FALSE(url.ReplaceSearchTermsInURL(
[email protected]ce7ee5f2014-06-16 23:41:191393 GURL("http://google.com/foo/?q=foo"), search_terms,
1394 search_terms_data_, &result));
[email protected]f62e30f52013-03-23 03:45:151395
1396 EXPECT_TRUE(url.ReplaceSearchTermsInURL(
[email protected]ce7ee5f2014-06-16 23:41:191397 GURL("https://google.com/?q=foo"), search_terms,
1398 search_terms_data_, &result));
vitbarf298455d2015-04-21 12:58:101399 EXPECT_EQ(GURL("https://google.com/?q=Bob+Morane"), result);
[email protected]f62e30f52013-03-23 03:45:151400
1401 EXPECT_FALSE(url.ReplaceSearchTermsInURL(
[email protected]ce7ee5f2014-06-16 23:41:191402 GURL("http://google.com:8080/?q=foo"), search_terms,
1403 search_terms_data_, &result));
[email protected]f62e30f52013-03-23 03:45:151404
1405 EXPECT_TRUE(url.ReplaceSearchTermsInURL(
[email protected]ce7ee5f2014-06-16 23:41:191406 GURL("http://google.com/?q=1+2+3&b=456"), search_terms,
1407 search_terms_data_, &result));
vitbarf298455d2015-04-21 12:58:101408 EXPECT_EQ(GURL("http://google.com/?q=Bob+Morane&b=456"), result);
[email protected]f62e30f52013-03-23 03:45:151409
1410 // Note: Spaces in REF parameters are not escaped. See TryEncoding() in
1411 // template_url.cc for details.
1412 EXPECT_TRUE(url.ReplaceSearchTermsInURL(
[email protected]ce7ee5f2014-06-16 23:41:191413 GURL("http://google.com/alt/?q=123#q=456"), search_terms,
1414 search_terms_data_, &result));
vitbarf298455d2015-04-21 12:58:101415 EXPECT_EQ(GURL("http://google.com/alt/?q=123#q=Bob+Morane"), result);
[email protected]f62e30f52013-03-23 03:45:151416
1417 EXPECT_TRUE(url.ReplaceSearchTermsInURL(
1418 GURL("http://google.com/alt/?a=012&q=123&b=456#f=789"), search_terms,
[email protected]ce7ee5f2014-06-16 23:41:191419 search_terms_data_, &result));
vitbarf298455d2015-04-21 12:58:101420 EXPECT_EQ(GURL("http://google.com/alt/?a=012&q=Bob+Morane&b=456#f=789"),
[email protected]f62e30f52013-03-23 03:45:151421 result);
1422
1423 EXPECT_TRUE(url.ReplaceSearchTermsInURL(
1424 GURL("http://google.com/alt/?a=012&q=123&b=456#j=abc&q=789&h=def9"),
[email protected]ce7ee5f2014-06-16 23:41:191425 search_terms, search_terms_data_, &result));
[email protected]f62e30f52013-03-23 03:45:151426 EXPECT_EQ(GURL("http://google.com/alt/?a=012&q=123&b=456"
vitbarf298455d2015-04-21 12:58:101427 "#j=abc&q=Bob+Morane&h=def9"), result);
[email protected]f62e30f52013-03-23 03:45:151428
1429 EXPECT_FALSE(url.ReplaceSearchTermsInURL(
[email protected]ce7ee5f2014-06-16 23:41:191430 GURL("http://google.com/alt/?q="), search_terms,
1431 search_terms_data_, &result));
[email protected]f62e30f52013-03-23 03:45:151432
1433 EXPECT_FALSE(url.ReplaceSearchTermsInURL(
[email protected]ce7ee5f2014-06-16 23:41:191434 GURL("http://google.com/alt/?#q="), search_terms,
1435 search_terms_data_, &result));
[email protected]f62e30f52013-03-23 03:45:151436
1437 EXPECT_FALSE(url.ReplaceSearchTermsInURL(
[email protected]ce7ee5f2014-06-16 23:41:191438 GURL("http://google.com/alt/?q=#q="), search_terms,
1439 search_terms_data_, &result));
[email protected]f62e30f52013-03-23 03:45:151440
1441 EXPECT_FALSE(url.ReplaceSearchTermsInURL(
[email protected]ce7ee5f2014-06-16 23:41:191442 GURL("http://google.com/alt/?q=123#q="), search_terms,
1443 search_terms_data_, &result));
[email protected]f62e30f52013-03-23 03:45:151444
1445 EXPECT_TRUE(url.ReplaceSearchTermsInURL(
[email protected]ce7ee5f2014-06-16 23:41:191446 GURL("http://google.com/alt/?q=#q=123"), search_terms,
1447 search_terms_data_, &result));
vitbarf298455d2015-04-21 12:58:101448 EXPECT_EQ(GURL("http://google.com/alt/?q=#q=Bob+Morane"), result);
[email protected]f62e30f52013-03-23 03:45:151449}
[email protected]56fa29592013-07-02 20:25:531450
alexmos294849f2015-03-14 00:55:061451TEST_F(TemplateURLTest, ReplaceSearchTermsInURLPath) {
1452 TemplateURLData data;
1453 data.SetURL("http://term-in-path.com/begin/{searchTerms}/end");
1454 TemplateURL url(data);
1455 TemplateURLRef::SearchTermsArgs search_terms(ASCIIToUTF16("Bob Morane"));
1456 GURL result;
1457
1458 EXPECT_TRUE(url.ReplaceSearchTermsInURL(
1459 GURL("http://term-in-path.com/begin/something/end"), search_terms,
1460 search_terms_data_, &result));
1461 EXPECT_EQ(GURL("http://term-in-path.com/begin/Bob%20Morane/end"), result);
1462
1463 EXPECT_TRUE(url.ReplaceSearchTermsInURL(
1464 GURL("http://term-in-path.com/begin/1%202%203/end"), search_terms,
1465 search_terms_data_, &result));
1466 EXPECT_EQ(GURL("http://term-in-path.com/begin/Bob%20Morane/end"), result);
1467
1468 result = GURL("http://should.not.change.com");
1469 EXPECT_FALSE(url.ReplaceSearchTermsInURL(
1470 GURL("http://term-in-path.com/about"), search_terms,
1471 search_terms_data_, &result));
1472 EXPECT_EQ(GURL("http://should.not.change.com"), result);
1473}
1474
vitbarf298455d2015-04-21 12:58:101475// Checks that the ReplaceSearchTermsInURL function works correctly
1476// for search terms containing non-latin characters for a search engine
1477// using UTF-8 input encoding.
1478TEST_F(TemplateURLTest, ReplaceSearchTermsInUTF8URL) {
1479 TemplateURLData data;
1480 data.SetURL("http://utf-8.ru/?q={searchTerms}");
1481 data.alternate_urls.push_back("http://utf-8.ru/#q={searchTerms}");
1482 data.alternate_urls.push_back("http://utf-8.ru/path/{searchTerms}");
1483 TemplateURL url(data);
1484
1485 // Russian text which will be encoded with UTF-8.
1486 TemplateURLRef::SearchTermsArgs search_terms(base::WideToUTF16(
1487 L"\x0442\x0435\x043A\x0441\x0442"));
1488 GURL result;
1489
1490 EXPECT_TRUE(url.ReplaceSearchTermsInURL(
1491 GURL("http://utf-8.ru/?q=a+b"), search_terms, search_terms_data_,
1492 &result));
1493 EXPECT_EQ(GURL("http://utf-8.ru/?q=%D1%82%D0%B5%D0%BA%D1%81%D1%82"),
1494 result);
1495
1496 EXPECT_TRUE(url.ReplaceSearchTermsInURL(
1497 GURL("http://utf-8.ru/#q=a+b"), search_terms, search_terms_data_,
1498 &result));
1499 EXPECT_EQ(GURL("http://utf-8.ru/#q=%D1%82%D0%B5%D0%BA%D1%81%D1%82"),
1500 result);
1501
1502 EXPECT_TRUE(url.ReplaceSearchTermsInURL(
1503 GURL("http://utf-8.ru/path/a%20b"), search_terms, search_terms_data_,
1504 &result));
1505 EXPECT_EQ(GURL("http://utf-8.ru/path/%D1%82%D0%B5%D0%BA%D1%81%D1%82"),
1506 result);
1507}
1508
1509// Checks that the ReplaceSearchTermsInURL function works correctly
1510// for search terms containing non-latin characters for a search engine
1511// using non UTF-8 input encoding.
1512TEST_F(TemplateURLTest, ReplaceSearchTermsInNonUTF8URL) {
1513 TemplateURLData data;
1514 data.SetURL("http://windows-1251.ru/?q={searchTerms}");
1515 data.alternate_urls.push_back("http://windows-1251.ru/#q={searchTerms}");
1516 data.alternate_urls.push_back("http://windows-1251.ru/path/{searchTerms}");
1517 data.input_encodings.push_back("windows-1251");
1518 TemplateURL url(data);
1519
1520 // Russian text which will be encoded with Windows-1251.
1521 TemplateURLRef::SearchTermsArgs search_terms(base::WideToUTF16(
1522 L"\x0442\x0435\x043A\x0441\x0442"));
1523 GURL result;
1524
1525 EXPECT_TRUE(url.ReplaceSearchTermsInURL(
1526 GURL("http://windows-1251.ru/?q=a+b"), search_terms, search_terms_data_,
1527 &result));
1528 EXPECT_EQ(GURL("http://windows-1251.ru/?q=%F2%E5%EA%F1%F2"),
1529 result);
1530
1531 EXPECT_TRUE(url.ReplaceSearchTermsInURL(
1532 GURL("http://windows-1251.ru/#q=a+b"), search_terms, search_terms_data_,
1533 &result));
1534 EXPECT_EQ(GURL("http://windows-1251.ru/#q=%F2%E5%EA%F1%F2"),
1535 result);
1536
1537 EXPECT_TRUE(url.ReplaceSearchTermsInURL(
1538 GURL("http://windows-1251.ru/path/a%20b"), search_terms,
1539 search_terms_data_, &result));
1540 EXPECT_EQ(GURL("http://windows-1251.ru/path/%F2%E5%EA%F1%F2"),
1541 result);
1542}
1543
Mark Pearson247fb8a2018-08-30 05:12:261544// Test the |additional_query_params| field of SearchTermsArgs.
[email protected]621ade062013-10-28 06:27:431545TEST_F(TemplateURLTest, SuggestQueryParams) {
[email protected]621ade062013-10-28 06:27:431546 TemplateURLData data;
1547 // Pick a URL with replacements before, during, and after the query, to ensure
1548 // we don't goof up any of them.
1549 data.SetURL("{google:baseURL}search?q={searchTerms}"
1550 "#{google:originalQueryForSuggestion}x");
[email protected]168d08722014-06-18 07:13:281551 TemplateURL url(data);
[email protected]621ade062013-10-28 06:27:431552
Mark Pearson247fb8a2018-08-30 05:12:261553 // Baseline: no |additional_query_params| field.
[email protected]621ade062013-10-28 06:27:431554 TemplateURLRef::SearchTermsArgs search_terms(ASCIIToUTF16("abc"));
1555 search_terms.original_query = ASCIIToUTF16("def");
1556 search_terms.accepted_suggestion = 0;
1557 EXPECT_EQ("http://www.google.com/search?q=abc#oq=def&x",
[email protected]ce7ee5f2014-06-16 23:41:191558 url.url_ref().ReplaceSearchTerms(search_terms, search_terms_data_));
[email protected]621ade062013-10-28 06:27:431559
Mark Pearson247fb8a2018-08-30 05:12:261560 // Set the |additional_query_params|.
1561 search_terms.additional_query_params = "pq=xyz";
[email protected]621ade062013-10-28 06:27:431562 EXPECT_EQ("http://www.google.com/search?pq=xyz&q=abc#oq=def&x",
[email protected]ce7ee5f2014-06-16 23:41:191563 url.url_ref().ReplaceSearchTerms(search_terms, search_terms_data_));
[email protected]621ade062013-10-28 06:27:431564
Mark Pearson247fb8a2018-08-30 05:12:261565 // Add |append_extra_query_params_from_command_line| into the mix, and ensure
1566 // it works.
1567 search_terms.append_extra_query_params_from_command_line = true;
avi1772c1a2014-12-22 22:42:331568 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
[email protected]621ade062013-10-28 06:27:431569 switches::kExtraSearchQueryParams, "a=b");
1570 EXPECT_EQ("http://www.google.com/search?a=b&pq=xyz&q=abc#oq=def&x",
[email protected]ce7ee5f2014-06-16 23:41:191571 url.url_ref().ReplaceSearchTerms(search_terms, search_terms_data_));
[email protected]621ade062013-10-28 06:27:431572}
1573
Mark Pearson247fb8a2018-08-30 05:12:261574// Test the |search_terms.append_extra_query_params_from_command_line| field of
1575// SearchTermsArgs.
[email protected]56fa29592013-07-02 20:25:531576TEST_F(TemplateURLTest, ExtraQueryParams) {
[email protected]56fa29592013-07-02 20:25:531577 TemplateURLData data;
1578 // Pick a URL with replacements before, during, and after the query, to ensure
1579 // we don't goof up any of them.
1580 data.SetURL("{google:baseURL}search?q={searchTerms}"
1581 "#{google:originalQueryForSuggestion}x");
[email protected]168d08722014-06-18 07:13:281582 TemplateURL url(data);
[email protected]56fa29592013-07-02 20:25:531583
Mark Pearson247fb8a2018-08-30 05:12:261584 // Baseline: no command-line args, no
1585 // |search_terms.append_extra_query_params_from_command_line| flag.
[email protected]56fa29592013-07-02 20:25:531586 TemplateURLRef::SearchTermsArgs search_terms(ASCIIToUTF16("abc"));
1587 search_terms.original_query = ASCIIToUTF16("def");
1588 search_terms.accepted_suggestion = 0;
1589 EXPECT_EQ("http://www.google.com/search?q=abc#oq=def&x",
[email protected]ce7ee5f2014-06-16 23:41:191590 url.url_ref().ReplaceSearchTerms(search_terms, search_terms_data_));
[email protected]56fa29592013-07-02 20:25:531591
1592 // Set the flag. Since there are no command-line args, this should have no
1593 // effect.
Mark Pearson247fb8a2018-08-30 05:12:261594 search_terms.append_extra_query_params_from_command_line = true;
[email protected]56fa29592013-07-02 20:25:531595 EXPECT_EQ("http://www.google.com/search?q=abc#oq=def&x",
[email protected]ce7ee5f2014-06-16 23:41:191596 url.url_ref().ReplaceSearchTerms(search_terms, search_terms_data_));
[email protected]56fa29592013-07-02 20:25:531597
1598 // Now append the command-line arg. This should be inserted into the query.
avi1772c1a2014-12-22 22:42:331599 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
[email protected]56fa29592013-07-02 20:25:531600 switches::kExtraSearchQueryParams, "a=b");
1601 EXPECT_EQ("http://www.google.com/search?a=b&q=abc#oq=def&x",
[email protected]ce7ee5f2014-06-16 23:41:191602 url.url_ref().ReplaceSearchTerms(search_terms, search_terms_data_));
[email protected]56fa29592013-07-02 20:25:531603
1604 // Turn off the flag. Now the command-line arg should be ignored again.
Mark Pearson247fb8a2018-08-30 05:12:261605 search_terms.append_extra_query_params_from_command_line = false;
[email protected]56fa29592013-07-02 20:25:531606 EXPECT_EQ("http://www.google.com/search?q=abc#oq=def&x",
[email protected]ce7ee5f2014-06-16 23:41:191607 url.url_ref().ReplaceSearchTerms(search_terms, search_terms_data_));
[email protected]56fa29592013-07-02 20:25:531608}
[email protected]d5015ca2013-08-08 22:04:181609
1610// Tests replacing pageClassification.
[email protected]57ac99b92013-11-13 01:30:171611TEST_F(TemplateURLTest, ReplacePageClassification) {
[email protected]d5015ca2013-08-08 22:04:181612 TemplateURLData data;
1613 data.input_encodings.push_back("UTF-8");
1614 data.SetURL("{google:baseURL}?{google:pageClassification}q={searchTerms}");
[email protected]168d08722014-06-18 07:13:281615 TemplateURL url(data);
[email protected]ce7ee5f2014-06-16 23:41:191616 EXPECT_TRUE(url.url_ref().IsValid(search_terms_data_));
1617 ASSERT_TRUE(url.url_ref().SupportsReplacement(search_terms_data_));
[email protected]d5015ca2013-08-08 22:04:181618 TemplateURLRef::SearchTermsArgs search_terms_args(ASCIIToUTF16("foo"));
1619
[email protected]ce7ee5f2014-06-16 23:41:191620 std::string result = url.url_ref().ReplaceSearchTerms(search_terms_args,
1621 search_terms_data_);
[email protected]d5015ca2013-08-08 22:04:181622 EXPECT_EQ("http://www.google.com/?q=foo", result);
1623
[email protected]332d17d22014-06-20 16:56:031624 search_terms_args.page_classification = metrics::OmniboxEventProto::NTP;
[email protected]ce7ee5f2014-06-16 23:41:191625 result = url.url_ref().ReplaceSearchTerms(search_terms_args,
1626 search_terms_data_);
[email protected]d5015ca2013-08-08 22:04:181627 EXPECT_EQ("http://www.google.com/?pgcl=1&q=foo", result);
1628
1629 search_terms_args.page_classification =
[email protected]332d17d22014-06-20 16:56:031630 metrics::OmniboxEventProto::HOME_PAGE;
[email protected]ce7ee5f2014-06-16 23:41:191631 result = url.url_ref().ReplaceSearchTerms(search_terms_args,
1632 search_terms_data_);
[email protected]d5015ca2013-08-08 22:04:181633 EXPECT_EQ("http://www.google.com/?pgcl=3&q=foo", result);
1634}
[email protected]2328ee22013-08-08 23:00:191635
1636// Test the IsSearchResults function.
1637TEST_F(TemplateURLTest, IsSearchResults) {
1638 TemplateURLData data;
1639 data.SetURL("http://bar/search?q={searchTerms}");
[email protected]2767c0fd2013-08-16 17:44:161640 data.new_tab_url = "http://bar/newtab";
[email protected]2328ee22013-08-08 23:00:191641 data.alternate_urls.push_back("http://bar/?q={searchTerms}");
1642 data.alternate_urls.push_back("http://bar/#q={searchTerms}");
1643 data.alternate_urls.push_back("http://bar/search#q{searchTerms}");
1644 data.alternate_urls.push_back("http://bar/webhp#q={searchTerms}");
[email protected]168d08722014-06-18 07:13:281645 TemplateURL search_provider(data);
[email protected]2328ee22013-08-08 23:00:191646
1647 const struct {
1648 const char* const url;
1649 bool result;
1650 } url_data[] = {
1651 { "http://bar/search?q=foo&oq=foo", true, },
1652 { "http://bar/?q=foo&oq=foo", true, },
1653 { "http://bar/#output=search&q=foo&oq=foo", true, },
1654 { "http://bar/webhp#q=foo&oq=foo", true, },
1655 { "http://bar/#q=foo&oq=foo", true, },
1656 { "http://bar/?ext=foo&q=foo#ref=bar", true, },
1657 { "http://bar/url?url=http://www.foo.com/&q=foo#ref=bar", false, },
1658 { "http://bar/", false, },
1659 { "http://foo/", false, },
[email protected]2767c0fd2013-08-16 17:44:161660 { "http://bar/newtab", false, },
[email protected]2328ee22013-08-08 23:00:191661 };
1662
Avi Drissman2244c2d2018-12-25 23:08:021663 for (size_t i = 0; i < base::size(url_data); ++i) {
[email protected]2328ee22013-08-08 23:00:191664 EXPECT_EQ(url_data[i].result,
[email protected]ce7ee5f2014-06-16 23:41:191665 search_provider.IsSearchURL(GURL(url_data[i].url),
1666 search_terms_data_));
[email protected]2328ee22013-08-08 23:00:191667 }
1668}
[email protected]a048de8a2013-10-02 18:30:061669
jdonnelly41c5b46a2015-07-10 21:24:381670TEST_F(TemplateURLTest, SearchboxVersionIncludedForAnswers) {
[email protected]9d70de12014-05-10 02:15:311671 TemplateURLData data;
[email protected]798baa8e2014-06-20 05:42:441672 search_terms_data_.set_google_base_url("http://bar/");
[email protected]9d70de12014-05-10 02:15:311673 data.SetURL("http://bar/search?q={searchTerms}&{google:searchVersion}xssi=t");
1674
[email protected]168d08722014-06-18 07:13:281675 TemplateURL url(data);
[email protected]9d70de12014-05-10 02:15:311676 TemplateURLRef::SearchTermsArgs search_terms_args(ASCIIToUTF16("foo"));
[email protected]ce7ee5f2014-06-16 23:41:191677 std::string result = url.url_ref().ReplaceSearchTerms(search_terms_args,
1678 search_terms_data_);
[email protected]9d70de12014-05-10 02:15:311679 EXPECT_EQ("http://bar/search?q=foo&gs_rn=42&xssi=t", result);
1680}
[email protected]20184242014-05-14 02:57:421681
1682TEST_F(TemplateURLTest, SessionToken) {
1683 TemplateURLData data;
[email protected]798baa8e2014-06-20 05:42:441684 search_terms_data_.set_google_base_url("http://bar/");
[email protected]20184242014-05-14 02:57:421685 data.SetURL("http://bar/search?q={searchTerms}&{google:sessionToken}xssi=t");
1686
[email protected]168d08722014-06-18 07:13:281687 TemplateURL url(data);
[email protected]20184242014-05-14 02:57:421688 TemplateURLRef::SearchTermsArgs search_terms_args(ASCIIToUTF16("foo"));
1689 search_terms_args.session_token = "SESSIONTOKENGOESHERE";
[email protected]ce7ee5f2014-06-16 23:41:191690 std::string result = url.url_ref().ReplaceSearchTerms(search_terms_args,
1691 search_terms_data_);
[email protected]20184242014-05-14 02:57:421692 EXPECT_EQ("http://bar/search?q=foo&psi=SESSIONTOKENGOESHERE&xssi=t", result);
1693
[email protected]168d08722014-06-18 07:13:281694 TemplateURL url2(data);
[email protected]20184242014-05-14 02:57:421695 search_terms_args.session_token = "";
[email protected]ce7ee5f2014-06-16 23:41:191696 result = url.url_ref().ReplaceSearchTerms(search_terms_args,
1697 search_terms_data_);
[email protected]20184242014-05-14 02:57:421698 EXPECT_EQ("http://bar/search?q=foo&xssi=t", result);
1699}
[email protected]448b17f52014-06-13 01:08:031700
1701TEST_F(TemplateURLTest, ContextualSearchParameters) {
1702 TemplateURLData data;
[email protected]798baa8e2014-06-20 05:42:441703 search_terms_data_.set_google_base_url("http://bar/");
[email protected]448b17f52014-06-13 01:08:031704 data.SetURL("http://bar/_/contextualsearch?"
1705 "{google:contextualSearchVersion}"
1706 "{google:contextualSearchContextData}");
1707
[email protected]168d08722014-06-18 07:13:281708 TemplateURL url(data);
[email protected]448b17f52014-06-13 01:08:031709 TemplateURLRef::SearchTermsArgs search_terms_args(ASCIIToUTF16("foo"));
[email protected]ce7ee5f2014-06-16 23:41:191710 std::string result = url.url_ref().ReplaceSearchTerms(search_terms_args,
1711 search_terms_data_);
donndbb98274e2016-11-01 21:04:401712 EXPECT_EQ("http://bar/_/contextualsearch?", result);
[email protected]448b17f52014-06-13 01:08:031713
Donn Denman01b1bf72018-08-14 16:25:201714 // Test the current common case, which uses no home country or previous
1715 // event.
1716 TemplateURLRef::SearchTermsArgs::ContextualSearchParams params(
1717 2, 1, std::string(), 0, 0);
[email protected]448b17f52014-06-13 01:08:031718 search_terms_args.contextual_search_params = params;
[email protected]ce7ee5f2014-06-16 23:41:191719 result = url.url_ref().ReplaceSearchTerms(search_terms_args,
1720 search_terms_data_);
donndd9fc4d92016-09-16 00:30:491721 EXPECT_EQ(
1722 "http://bar/_/contextualsearch?"
donnd0bc73292017-01-17 22:07:561723 "ctxs=2&"
donndd9fc4d92016-09-16 00:30:491724 "ctxsl_coca=1",
1725 result);
donndbb98274e2016-11-01 21:04:401726
Donn Denman01b1bf72018-08-14 16:25:201727 // Test the home country and non-zero event data case.
donndbb98274e2016-11-01 21:04:401728 search_terms_args.contextual_search_params =
Donn Denman01b1bf72018-08-14 16:25:201729 TemplateURLRef::SearchTermsArgs::ContextualSearchParams(2, 2, "CH",
1730 1657713458, 5);
donndbb98274e2016-11-01 21:04:401731 result =
1732 url.url_ref().ReplaceSearchTerms(search_terms_args, search_terms_data_);
1733
1734 EXPECT_EQ(
1735 "http://bar/_/contextualsearch?"
1736 "ctxs=2&"
donnd0bc73292017-01-17 22:07:561737 "ctxsl_coca=2&"
Donn Denman01b1bf72018-08-14 16:25:201738 "ctxs_hc=CH&"
1739 "ctxsl_pid=1657713458&"
1740 "ctxsl_per=5",
donndbb98274e2016-11-01 21:04:401741 result);
[email protected]448b17f52014-06-13 01:08:031742}
[email protected]44ccc9f2014-06-20 17:36:211743
1744TEST_F(TemplateURLTest, GenerateKeyword) {
1745 ASSERT_EQ(ASCIIToUTF16("foo"),
jshin1fb76462016-04-05 22:13:031746 TemplateURL::GenerateKeyword(GURL("http://foo")));
[email protected]44ccc9f2014-06-20 17:36:211747 // www. should be stripped.
jshin1fb76462016-04-05 22:13:031748 ASSERT_EQ(ASCIIToUTF16("foo"),
1749 TemplateURL::GenerateKeyword(GURL("http://www.foo")));
[email protected]44ccc9f2014-06-20 17:36:211750 // Make sure we don't get a trailing '/'.
jshin1fb76462016-04-05 22:13:031751 ASSERT_EQ(ASCIIToUTF16("blah"),
1752 TemplateURL::GenerateKeyword(GURL("http://blah/")));
[email protected]44ccc9f2014-06-20 17:36:211753 // Don't generate the empty string.
jshin1fb76462016-04-05 22:13:031754 ASSERT_EQ(ASCIIToUTF16("www"),
1755 TemplateURL::GenerateKeyword(GURL("http://www.")));
alshabaline6212ac2015-07-23 08:03:001756 ASSERT_EQ(
1757 base::UTF8ToUTF16("\xd0\xb0\xd0\xb1\xd0\xb2"),
jshin1fb76462016-04-05 22:13:031758 TemplateURL::GenerateKeyword(GURL("http://xn--80acd")));
a-v-y81695d0d2017-04-20 08:22:221759
1760 // Generated keywords must always be in lowercase, because TemplateURLs always
1761 // converts keywords to lowercase in its constructor and TemplateURLService
1762 // stores TemplateURLs in maps using keyword as key.
1763 EXPECT_TRUE(IsLowerCase(TemplateURL::GenerateKeyword(GURL("http://BLAH/"))));
1764 EXPECT_TRUE(IsLowerCase(
1765 TemplateURL::GenerateKeyword(GURL("http://embeddedhtml.<head>/"))));
[email protected]44ccc9f2014-06-20 17:36:211766}
1767
1768TEST_F(TemplateURLTest, GenerateSearchURL) {
1769 struct GenerateSearchURLCase {
1770 const char* test_name;
1771 const char* url;
1772 const char* expected;
1773 } generate_url_cases[] = {
1774 { "invalid URL", "foo{searchTerms}", "" },
1775 { "URL with no replacements", "http://foo/", "http://foo/" },
1776 { "basic functionality", "http://foo/{searchTerms}",
1777 "http://foo/blah.blah.blah.blah.blah" }
1778 };
1779
Avi Drissman2244c2d2018-12-25 23:08:021780 for (size_t i = 0; i < base::size(generate_url_cases); ++i) {
[email protected]44ccc9f2014-06-20 17:36:211781 TemplateURLData data;
1782 data.SetURL(generate_url_cases[i].url);
1783 TemplateURL t_url(data);
1784 EXPECT_EQ(t_url.GenerateSearchURL(search_terms_data_).spec(),
1785 generate_url_cases[i].expected)
1786 << generate_url_cases[i].test_name << " failed.";
1787 }
1788}
[email protected]9e9130ce2014-06-23 23:20:511789
1790TEST_F(TemplateURLTest, PrefetchQueryParameters) {
1791 TemplateURLData data;
1792 search_terms_data_.set_google_base_url("http://bar/");
1793 data.SetURL("http://bar/search?q={searchTerms}&{google:prefetchQuery}xssi=t");
1794
1795 TemplateURL url(data);
1796 TemplateURLRef::SearchTermsArgs search_terms_args(ASCIIToUTF16("foo"));
1797 search_terms_args.prefetch_query = "full query text";
1798 search_terms_args.prefetch_query_type = "2338";
1799 std::string result =
1800 url.url_ref().ReplaceSearchTerms(search_terms_args, search_terms_data_);
1801 EXPECT_EQ("http://bar/search?q=foo&pfq=full%20query%20text&qha=2338&xssi=t",
1802 result);
1803
1804 TemplateURL url2(data);
1805 search_terms_args.prefetch_query.clear();
1806 search_terms_args.prefetch_query_type.clear();
1807 result =
1808 url2.url_ref().ReplaceSearchTerms(search_terms_args, search_terms_data_);
1809 EXPECT_EQ("http://bar/search?q=foo&xssi=t", result);
1810}
vitbar5bd8c252016-01-29 18:44:511811
1812// Tests that TemplateURL works correctly after changing the Google base URL
1813// and invalidating cached values.
1814TEST_F(TemplateURLTest, InvalidateCachedValues) {
1815 TemplateURLData data;
1816 data.SetURL("{google:baseURL}search?q={searchTerms}");
1817 data.suggestions_url = "{google:baseSuggestURL}search?q={searchTerms}";
vitbar5bd8c252016-01-29 18:44:511818 data.image_url = "{google:baseURL}searchbyimage/upload";
1819 data.new_tab_url = "{google:baseURL}_/chrome/newtab";
1820 data.contextual_search_url = "{google:baseURL}_/contextualsearch";
1821 data.alternate_urls.push_back("{google:baseURL}s#q={searchTerms}");
1822 TemplateURL url(data);
1823 TemplateURLRef::SearchTermsArgs search_terms_args(ASCIIToUTF16("X"));
1824 base::string16 search_terms;
1825
1826 EXPECT_TRUE(url.HasGoogleBaseURLs(search_terms_data_));
1827 EXPECT_EQ("http://www.google.com/search?q=X",
1828 url.url_ref().ReplaceSearchTerms(search_terms_args,
1829 search_terms_data_));
1830 EXPECT_EQ("http://www.google.com/s#q=X",
1831 url.url_refs()[0].ReplaceSearchTerms(search_terms_args,
1832 search_terms_data_));
1833 EXPECT_EQ("http://www.google.com/search?q=X",
1834 url.url_refs()[1].ReplaceSearchTerms(search_terms_args,
1835 search_terms_data_));
1836 EXPECT_EQ("http://www.google.com/complete/search?q=X",
1837 url.suggestions_url_ref().ReplaceSearchTerms(search_terms_args,
1838 search_terms_data_));
vitbar5bd8c252016-01-29 18:44:511839 EXPECT_EQ("http://www.google.com/searchbyimage/upload",
1840 url.image_url_ref().ReplaceSearchTerms(search_terms_args,
1841 search_terms_data_));
1842 EXPECT_EQ("http://www.google.com/_/chrome/newtab",
1843 url.new_tab_url_ref().ReplaceSearchTerms(search_terms_args,
1844 search_terms_data_));
1845 EXPECT_EQ("http://www.google.com/_/contextualsearch",
1846 url.contextual_search_url_ref().ReplaceSearchTerms(
1847 search_terms_args, search_terms_data_));
1848
1849 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
1850 GURL("http://www.google.com/search?q=Y+Z"),
1851 search_terms_data_, &search_terms));
1852 EXPECT_EQ(base::ASCIIToUTF16("Y Z"), search_terms);
1853 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
1854 GURL("http://www.google.com/s#q=123"),
1855 search_terms_data_, &search_terms));
1856 EXPECT_EQ(base::ASCIIToUTF16("123"), search_terms);
1857
1858 search_terms_data_.set_google_base_url("https://www.foo.org/");
1859 url.InvalidateCachedValues();
1860
1861 EXPECT_TRUE(url.HasGoogleBaseURLs(search_terms_data_));
1862 EXPECT_EQ("https://www.foo.org/search?q=X",
1863 url.url_ref().ReplaceSearchTerms(search_terms_args,
1864 search_terms_data_));
1865 EXPECT_EQ("https://www.foo.org/s#q=X",
1866 url.url_refs()[0].ReplaceSearchTerms(search_terms_args,
1867 search_terms_data_));
1868 EXPECT_EQ("https://www.foo.org/search?q=X",
1869 url.url_refs()[1].ReplaceSearchTerms(search_terms_args,
1870 search_terms_data_));
1871 EXPECT_EQ("https://www.foo.org/complete/search?q=X",
1872 url.suggestions_url_ref().ReplaceSearchTerms(search_terms_args,
1873 search_terms_data_));
vitbar5bd8c252016-01-29 18:44:511874 EXPECT_EQ("https://www.foo.org/searchbyimage/upload",
1875 url.image_url_ref().ReplaceSearchTerms(search_terms_args,
1876 search_terms_data_));
1877 EXPECT_EQ("https://www.foo.org/_/chrome/newtab",
1878 url.new_tab_url_ref().ReplaceSearchTerms(search_terms_args,
1879 search_terms_data_));
1880 EXPECT_EQ("https://www.foo.org/_/contextualsearch",
1881 url.contextual_search_url_ref().ReplaceSearchTerms(
1882 search_terms_args, search_terms_data_));
1883
1884 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
1885 GURL("https://www.foo.org/search?q=Y+Z"),
1886 search_terms_data_, &search_terms));
1887 EXPECT_EQ(base::ASCIIToUTF16("Y Z"), search_terms);
1888 EXPECT_TRUE(url.ExtractSearchTermsFromURL(
1889 GURL("https://www.foo.org/s#q=123"),
1890 search_terms_data_, &search_terms));
1891 EXPECT_EQ(base::ASCIIToUTF16("123"), search_terms);
1892
1893 search_terms_data_.set_google_base_url("http://www.google.com/");
1894}
Troy Hildebrandt47ac4d8b2018-05-10 22:40:001895
1896// Tests the use of wildcards in the path to ensure both extracting search terms
1897// and generating a search URL work correctly.
1898TEST_F(TemplateURLTest, PathWildcard) {
1899 TemplateURLData data;
1900 data.SetURL(
1901 "https://www.google.com/search{google:pathWildcard}?q={searchTerms}");
1902 TemplateURL url(data);
1903
1904 // Test extracting search terms from a URL.
1905 base::string16 search_terms;
1906 url.ExtractSearchTermsFromURL(GURL("https://www.google.com/search?q=testing"),
1907 search_terms_data_, &search_terms);
1908 EXPECT_EQ(base::ASCIIToUTF16("testing"), search_terms);
1909 url.ExtractSearchTermsFromURL(
1910 GURL("https://www.google.com/search;_this_is_a_test;_?q=testing"),
1911 search_terms_data_, &search_terms);
1912 EXPECT_EQ(base::ASCIIToUTF16("testing"), search_terms);
1913
1914 // Tests overlapping prefix/suffix.
1915 data.SetURL(
1916 "https://www.google.com/search{google:pathWildcard}rch?q={searchTerms}");
1917 TemplateURL overlap_url(data);
1918 overlap_url.ExtractSearchTermsFromURL(
1919 GURL("https://www.google.com/search?q=testing"), search_terms_data_,
1920 &search_terms);
1921 EXPECT_TRUE(search_terms.empty());
1922
1923 // Tests wildcard at beginning of path so we only have a suffix.
1924 data.SetURL(
1925 "https://www.google.com/{google:pathWildcard}rch?q={searchTerms}");
1926 TemplateURL suffix_url(data);
1927 suffix_url.ExtractSearchTermsFromURL(
1928 GURL("https://www.google.com/search?q=testing"), search_terms_data_,
1929 &search_terms);
1930 EXPECT_EQ(base::ASCIIToUTF16("testing"), search_terms);
1931
1932 // Tests wildcard between prefix/suffix.
1933 overlap_url.ExtractSearchTermsFromURL(
1934 GURL("https://www.google.com/search_testing_rch?q=testing"),
1935 search_terms_data_, &search_terms);
1936 EXPECT_EQ(base::ASCIIToUTF16("testing"), search_terms);
1937
1938 // Test generating a URL.
1939 TemplateURLRef::SearchTermsArgs search_terms_args(ASCIIToUTF16("foo"));
1940 GURL generated_url;
1941 url.ReplaceSearchTermsInURL(url.GenerateSearchURL(search_terms_data_),
1942 search_terms_args, search_terms_data_,
1943 &generated_url);
1944 EXPECT_EQ("https://www.google.com/search?q=foo", generated_url.spec());
1945}