Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(811)

Side by Side Diff: chrome/browser/search_engines/template_url_service_unittest.cc

Issue 2498053002: Add field to monitor last visited time for each search engine (Closed)
Patch Set: Update Nit comment. Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | components/search_engines/default_search_manager.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/search_engines/template_url_service.h" 5 #include "components/search_engines/template_url_service.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <memory> 9 #include <memory>
10 #include <utility> 10 #include <utility>
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
71 const std::string& keyword, 71 const std::string& keyword,
72 const std::string& url, 72 const std::string& url,
73 const std::string& suggest_url, 73 const std::string& suggest_url,
74 const std::string& alternate_url, 74 const std::string& alternate_url,
75 const std::string& favicon_url, 75 const std::string& favicon_url,
76 bool safe_for_autoreplace, 76 bool safe_for_autoreplace,
77 int prepopulate_id, 77 int prepopulate_id,
78 const std::string& encodings, 78 const std::string& encodings,
79 Time date_created, 79 Time date_created,
80 Time last_modified, 80 Time last_modified,
81 Time last_visited,
81 TemplateURL::Type type = TemplateURL::NORMAL) { 82 TemplateURL::Type type = TemplateURL::NORMAL) {
82 TemplateURLData data; 83 TemplateURLData data;
83 data.SetShortName(base::UTF8ToUTF16(short_name)); 84 data.SetShortName(base::UTF8ToUTF16(short_name));
84 data.SetKeyword(base::UTF8ToUTF16(keyword)); 85 data.SetKeyword(base::UTF8ToUTF16(keyword));
85 data.SetURL(url); 86 data.SetURL(url);
86 data.suggestions_url = suggest_url; 87 data.suggestions_url = suggest_url;
87 if (!alternate_url.empty()) 88 if (!alternate_url.empty())
88 data.alternate_urls.push_back(alternate_url); 89 data.alternate_urls.push_back(alternate_url);
89 data.favicon_url = GURL(favicon_url); 90 data.favicon_url = GURL(favicon_url);
90 data.safe_for_autoreplace = safe_for_autoreplace; 91 data.safe_for_autoreplace = safe_for_autoreplace;
91 data.prepopulate_id = prepopulate_id; 92 data.prepopulate_id = prepopulate_id;
92 data.input_encodings = base::SplitString( 93 data.input_encodings = base::SplitString(
93 encodings, ";", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); 94 encodings, ";", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
94 data.date_created = date_created; 95 data.date_created = date_created;
95 data.last_modified = last_modified; 96 data.last_modified = last_modified;
97 data.last_visited = last_visited;
96 return base::MakeUnique<TemplateURL>(data, type); 98 return base::MakeUnique<TemplateURL>(data, type);
97 } 99 }
98 100
99 TemplateURL* AddKeywordWithDate( 101 TemplateURL* AddKeywordWithDate(TemplateURLService* model,
100 TemplateURLService* model, 102 const std::string& short_name,
101 const std::string& short_name, 103 const std::string& keyword,
102 const std::string& keyword, 104 const std::string& url,
103 const std::string& url, 105 const std::string& suggest_url,
104 const std::string& suggest_url, 106 const std::string& alternate_url,
105 const std::string& alternate_url, 107 const std::string& favicon_url,
106 const std::string& favicon_url, 108 bool safe_for_autoreplace,
107 bool safe_for_autoreplace, 109 const std::string& encodings,
108 const std::string& encodings, 110 Time date_created,
109 Time date_created, 111 Time last_modified,
110 Time last_modified) { 112 Time last_visited) {
111 TemplateURL* t_url = model->Add(CreateKeywordWithDate( 113 TemplateURL* t_url = model->Add(CreateKeywordWithDate(
112 model, short_name, keyword, url, suggest_url, alternate_url, favicon_url, 114 model, short_name, keyword, url, suggest_url, alternate_url, favicon_url,
113 safe_for_autoreplace, 0, encodings, date_created, last_modified)); 115 safe_for_autoreplace, 0, encodings, date_created, last_modified,
116 last_visited));
114 EXPECT_NE(0, t_url->id()); 117 EXPECT_NE(0, t_url->id());
115 return t_url; 118 return t_url;
116 } 119 }
117 120
118 // Checks that the two TemplateURLs are similar. It does not check the id, the 121 // Checks that the two TemplateURLs are similar. It does not check the id or
119 // date_created or the last_modified time. Neither pointer should be NULL. 122 // any time-related fields. Neither pointer should be NULL.
120 void ExpectSimilar(const TemplateURL* expected, const TemplateURL* actual) { 123 void ExpectSimilar(const TemplateURL* expected, const TemplateURL* actual) {
121 ASSERT_TRUE(expected != NULL); 124 ASSERT_TRUE(expected != NULL);
122 ASSERT_TRUE(actual != NULL); 125 ASSERT_TRUE(actual != NULL);
123 EXPECT_EQ(expected->short_name(), actual->short_name()); 126 EXPECT_EQ(expected->short_name(), actual->short_name());
124 EXPECT_EQ(expected->keyword(), actual->keyword()); 127 EXPECT_EQ(expected->keyword(), actual->keyword());
125 EXPECT_EQ(expected->url(), actual->url()); 128 EXPECT_EQ(expected->url(), actual->url());
126 EXPECT_EQ(expected->suggestions_url(), actual->suggestions_url()); 129 EXPECT_EQ(expected->suggestions_url(), actual->suggestions_url());
127 EXPECT_EQ(expected->favicon_url(), actual->favicon_url()); 130 EXPECT_EQ(expected->favicon_url(), actual->favicon_url());
128 EXPECT_EQ(expected->alternate_urls(), actual->alternate_urls()); 131 EXPECT_EQ(expected->alternate_urls(), actual->alternate_urls());
129 EXPECT_EQ(expected->safe_for_autoreplace(), actual->safe_for_autoreplace()); 132 EXPECT_EQ(expected->safe_for_autoreplace(), actual->safe_for_autoreplace());
(...skipping 30 matching lines...) Expand all
160 163
161 TemplateURL* AddKeywordWithDate(const std::string& short_name, 164 TemplateURL* AddKeywordWithDate(const std::string& short_name,
162 const std::string& keyword, 165 const std::string& keyword,
163 const std::string& url, 166 const std::string& url,
164 const std::string& suggest_url, 167 const std::string& suggest_url,
165 const std::string& alternate_url, 168 const std::string& alternate_url,
166 const std::string& favicon_url, 169 const std::string& favicon_url,
167 bool safe_for_autoreplace, 170 bool safe_for_autoreplace,
168 const std::string& encodings, 171 const std::string& encodings,
169 Time date_created, 172 Time date_created,
170 Time last_modified); 173 Time last_modified,
174 Time last_visited);
171 175
172 // Verifies the two TemplateURLs are equal. 176 // Verifies the two TemplateURLs are equal.
173 void AssertEquals(const TemplateURL& expected, const TemplateURL& actual); 177 void AssertEquals(const TemplateURL& expected, const TemplateURL& actual);
174 178
175 // Verifies the two timestamps are equal, within the expected degree of 179 // Verifies the two timestamps are equal, within the expected degree of
176 // precision. 180 // precision.
177 void AssertTimesEqual(const base::Time& expected, const base::Time& actual); 181 void AssertTimesEqual(const base::Time& expected, const base::Time& actual);
178 182
179 // Create an URL that appears to have been prepopulated, but won't be in the 183 // Create an URL that appears to have been prepopulated, but won't be in the
180 // current data. 184 // current data.
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
228 TemplateURL* TemplateURLServiceTest::AddKeywordWithDate( 232 TemplateURL* TemplateURLServiceTest::AddKeywordWithDate(
229 const std::string& short_name, 233 const std::string& short_name,
230 const std::string& keyword, 234 const std::string& keyword,
231 const std::string& url, 235 const std::string& url,
232 const std::string& suggest_url, 236 const std::string& suggest_url,
233 const std::string& alternate_url, 237 const std::string& alternate_url,
234 const std::string& favicon_url, 238 const std::string& favicon_url,
235 bool safe_for_autoreplace, 239 bool safe_for_autoreplace,
236 const std::string& encodings, 240 const std::string& encodings,
237 Time date_created, 241 Time date_created,
238 Time last_modified) { 242 Time last_modified,
243 Time last_visited) {
239 return ::AddKeywordWithDate(model(), short_name, keyword, url, suggest_url, 244 return ::AddKeywordWithDate(model(), short_name, keyword, url, suggest_url,
240 alternate_url, favicon_url, safe_for_autoreplace, 245 alternate_url, favicon_url, safe_for_autoreplace,
241 encodings, date_created, last_modified); 246 encodings, date_created, last_modified,
247 last_visited);
242 } 248 }
243 249
244 void TemplateURLServiceTest::AssertEquals(const TemplateURL& expected, 250 void TemplateURLServiceTest::AssertEquals(const TemplateURL& expected,
245 const TemplateURL& actual) { 251 const TemplateURL& actual) {
246 ASSERT_EQ(expected.short_name(), actual.short_name()); 252 ASSERT_EQ(expected.short_name(), actual.short_name());
247 ASSERT_EQ(expected.keyword(), actual.keyword()); 253 ASSERT_EQ(expected.keyword(), actual.keyword());
248 ASSERT_EQ(expected.url(), actual.url()); 254 ASSERT_EQ(expected.url(), actual.url());
249 ASSERT_EQ(expected.suggestions_url(), actual.suggestions_url()); 255 ASSERT_EQ(expected.suggestions_url(), actual.suggestions_url());
250 ASSERT_EQ(expected.favicon_url(), actual.favicon_url()); 256 ASSERT_EQ(expected.favicon_url(), actual.favicon_url());
251 ASSERT_EQ(expected.alternate_urls(), actual.alternate_urls()); 257 ASSERT_EQ(expected.alternate_urls(), actual.alternate_urls());
252 ASSERT_EQ(expected.prepopulate_id(), actual.prepopulate_id()); 258 ASSERT_EQ(expected.prepopulate_id(), actual.prepopulate_id());
253 ASSERT_EQ(expected.safe_for_autoreplace(), actual.safe_for_autoreplace()); 259 ASSERT_EQ(expected.safe_for_autoreplace(), actual.safe_for_autoreplace());
254 ASSERT_EQ(expected.input_encodings(), actual.input_encodings()); 260 ASSERT_EQ(expected.input_encodings(), actual.input_encodings());
255 ASSERT_EQ(expected.id(), actual.id()); 261 ASSERT_EQ(expected.id(), actual.id());
256 ASSERT_EQ(expected.date_created(), actual.date_created()); 262 ASSERT_EQ(expected.date_created(), actual.date_created());
257 AssertTimesEqual(expected.last_modified(), actual.last_modified()); 263 AssertTimesEqual(expected.last_modified(), actual.last_modified());
264 ASSERT_EQ(expected.last_visited(), actual.last_visited());
258 ASSERT_EQ(expected.sync_guid(), actual.sync_guid()); 265 ASSERT_EQ(expected.sync_guid(), actual.sync_guid());
259 ASSERT_EQ(expected.search_terms_replacement_key(), 266 ASSERT_EQ(expected.search_terms_replacement_key(),
260 actual.search_terms_replacement_key()); 267 actual.search_terms_replacement_key());
261 } 268 }
262 269
263 void TemplateURLServiceTest::AssertTimesEqual(const base::Time& expected, 270 void TemplateURLServiceTest::AssertTimesEqual(const base::Time& expected,
264 const base::Time& actual) { 271 const base::Time& actual) {
265 // Because times are stored with a granularity of one second, there is a loss 272 // Because times are stored with a granularity of one second, there is a loss
266 // of precision when serializing and deserializing the timestamps. Hence, only 273 // of precision when serializing and deserializing the timestamps. Hence, only
267 // expect timestamps to be equal to within one second of one another. 274 // expect timestamps to be equal to within one second of one another.
268 ASSERT_LT((expected - actual).magnitude(), base::TimeDelta::FromSeconds(1)); 275 ASSERT_LT((expected - actual).magnitude(), base::TimeDelta::FromSeconds(1));
269 } 276 }
270 277
271 std::unique_ptr<TemplateURL> TemplateURLServiceTest::CreatePreloadedTemplateURL( 278 std::unique_ptr<TemplateURL> TemplateURLServiceTest::CreatePreloadedTemplateURL(
272 bool safe_for_autoreplace, 279 bool safe_for_autoreplace,
273 int prepopulate_id) { 280 int prepopulate_id) {
274 TemplateURLData data; 281 TemplateURLData data;
275 data.SetShortName(ASCIIToUTF16("unittest")); 282 data.SetShortName(ASCIIToUTF16("unittest"));
276 data.SetKeyword(ASCIIToUTF16("unittest")); 283 data.SetKeyword(ASCIIToUTF16("unittest"));
277 data.SetURL("http://www.unittest.com/{searchTerms}"); 284 data.SetURL("http://www.unittest.com/{searchTerms}");
278 data.favicon_url = GURL("http://favicon.url"); 285 data.favicon_url = GURL("http://favicon.url");
279 data.safe_for_autoreplace = safe_for_autoreplace; 286 data.safe_for_autoreplace = safe_for_autoreplace;
280 data.input_encodings.push_back("UTF-8"); 287 data.input_encodings.push_back("UTF-8");
281 data.date_created = Time::FromTimeT(100); 288 data.date_created = Time::FromTimeT(100);
282 data.last_modified = Time::FromTimeT(100); 289 data.last_modified = Time::FromTimeT(100);
290 data.last_visited = Time::FromTimeT(100);
283 data.prepopulate_id = prepopulate_id; 291 data.prepopulate_id = prepopulate_id;
284 return base::MakeUnique<TemplateURL>(data); 292 return base::MakeUnique<TemplateURL>(data);
285 } 293 }
286 294
287 void TemplateURLServiceTest::VerifyObserverCount(int expected_changed_count) { 295 void TemplateURLServiceTest::VerifyObserverCount(int expected_changed_count) {
288 EXPECT_EQ(expected_changed_count, test_util_->GetObserverCount()); 296 EXPECT_EQ(expected_changed_count, test_util_->GetObserverCount());
289 test_util_->ResetObserverCount(); 297 test_util_->ResetObserverCount();
290 } 298 }
291 299
292 void TemplateURLServiceTest::VerifyObserverFired() { 300 void TemplateURLServiceTest::VerifyObserverFired() {
(...skipping 14 matching lines...) Expand all
307 const size_t initial_count = model()->GetTemplateURLs().size(); 315 const size_t initial_count = model()->GetTemplateURLs().size();
308 316
309 TemplateURLData data; 317 TemplateURLData data;
310 data.SetShortName(ASCIIToUTF16("google")); 318 data.SetShortName(ASCIIToUTF16("google"));
311 data.SetKeyword(ASCIIToUTF16("keyword")); 319 data.SetKeyword(ASCIIToUTF16("keyword"));
312 data.SetURL("http://www.google.com/foo/bar"); 320 data.SetURL("http://www.google.com/foo/bar");
313 data.favicon_url = GURL("http://favicon.url"); 321 data.favicon_url = GURL("http://favicon.url");
314 data.safe_for_autoreplace = true; 322 data.safe_for_autoreplace = true;
315 data.date_created = Time::FromTimeT(100); 323 data.date_created = Time::FromTimeT(100);
316 data.last_modified = Time::FromTimeT(100); 324 data.last_modified = Time::FromTimeT(100);
325 data.last_visited = Time::FromTimeT(100);
317 data.sync_guid = "00000000-0000-0000-0000-000000000001"; 326 data.sync_guid = "00000000-0000-0000-0000-000000000001";
318 TemplateURL* t_url = model()->Add(base::MakeUnique<TemplateURL>(data)); 327 TemplateURL* t_url = model()->Add(base::MakeUnique<TemplateURL>(data));
319 ASSERT_TRUE(model()->CanAddAutogeneratedKeyword(ASCIIToUTF16("keyword"), 328 ASSERT_TRUE(model()->CanAddAutogeneratedKeyword(ASCIIToUTF16("keyword"),
320 GURL(), NULL)); 329 GURL(), NULL));
321 VerifyObserverCount(1); 330 VerifyObserverCount(1);
322 base::RunLoop().RunUntilIdle(); 331 base::RunLoop().RunUntilIdle();
323 ASSERT_EQ(initial_count + 1, model()->GetTemplateURLs().size()); 332 ASSERT_EQ(initial_count + 1, model()->GetTemplateURLs().size());
324 ASSERT_EQ(t_url, model()->GetTemplateURLForKeyword(t_url->keyword())); 333 ASSERT_EQ(t_url, model()->GetTemplateURLForKeyword(t_url->keyword()));
325 // We need to make a second copy as the model takes ownership of |t_url| and 334 // We need to make a second copy as the model takes ownership of |t_url| and
326 // will delete it. We have to do this after calling Add() since that gives 335 // will delete it. We have to do this after calling Add() since that gives
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
371 model()->Remove(loaded_url); 380 model()->Remove(loaded_url);
372 VerifyObserverCount(1); 381 VerifyObserverCount(1);
373 test_util()->ResetModel(true); 382 test_util()->ResetModel(true);
374 ASSERT_EQ(initial_count, model()->GetTemplateURLs().size()); 383 ASSERT_EQ(initial_count, model()->GetTemplateURLs().size());
375 EXPECT_TRUE(model()->GetTemplateURLForKeyword(ASCIIToUTF16("b")) == NULL); 384 EXPECT_TRUE(model()->GetTemplateURLForKeyword(ASCIIToUTF16("b")) == NULL);
376 } 385 }
377 386
378 TEST_F(TemplateURLServiceTest, AddSameKeyword) { 387 TEST_F(TemplateURLServiceTest, AddSameKeyword) {
379 test_util()->VerifyLoad(); 388 test_util()->VerifyLoad();
380 389
381 AddKeywordWithDate( 390 AddKeywordWithDate("first", "keyword", "http://test1", std::string(),
382 "first", "keyword", "http://test1", std::string(), std::string(), 391 std::string(), std::string(), true, "UTF-8", Time(),
383 std::string(), true, "UTF-8", Time(), Time()); 392 Time(), Time());
384 VerifyObserverCount(1); 393 VerifyObserverCount(1);
385 394
386 // Test what happens when we try to add a TemplateURL with the same keyword as 395 // Test what happens when we try to add a TemplateURL with the same keyword as
387 // one in the model. 396 // one in the model.
388 TemplateURLData data; 397 TemplateURLData data;
389 data.SetShortName(ASCIIToUTF16("second")); 398 data.SetShortName(ASCIIToUTF16("second"));
390 data.SetKeyword(ASCIIToUTF16("keyword")); 399 data.SetKeyword(ASCIIToUTF16("keyword"));
391 data.SetURL("http://test2"); 400 data.SetURL("http://test2");
392 data.safe_for_autoreplace = false; 401 data.safe_for_autoreplace = false;
393 TemplateURL* t_url = model()->Add(base::MakeUnique<TemplateURL>(data)); 402 TemplateURL* t_url = model()->Add(base::MakeUnique<TemplateURL>(data));
(...skipping 28 matching lines...) Expand all
422 EXPECT_EQ(t_url2, model()->GetTemplateURLForKeyword(ASCIIToUTF16("keyword"))); 431 EXPECT_EQ(t_url2, model()->GetTemplateURLForKeyword(ASCIIToUTF16("keyword")));
423 EXPECT_EQ(ASCIIToUTF16("fourth"), t_url2->short_name()); 432 EXPECT_EQ(ASCIIToUTF16("fourth"), t_url2->short_name());
424 EXPECT_EQ(ASCIIToUTF16("keyword"), t_url2->keyword()); 433 EXPECT_EQ(ASCIIToUTF16("keyword"), t_url2->keyword());
425 EXPECT_EQ(ASCIIToUTF16("second"), t_url->short_name()); 434 EXPECT_EQ(ASCIIToUTF16("second"), t_url->short_name());
426 EXPECT_EQ(ASCIIToUTF16("test2"), t_url->keyword()); 435 EXPECT_EQ(ASCIIToUTF16("test2"), t_url->keyword());
427 } 436 }
428 437
429 TEST_F(TemplateURLServiceTest, AddExtensionKeyword) { 438 TEST_F(TemplateURLServiceTest, AddExtensionKeyword) {
430 test_util()->VerifyLoad(); 439 test_util()->VerifyLoad();
431 440
432 AddKeywordWithDate( 441 AddKeywordWithDate("replaceable", "keyword1", "http://test1", std::string(),
433 "replaceable", "keyword1", "http://test1", std::string(), std::string(), 442 std::string(), std::string(), true, "UTF-8", Time(),
434 std::string(), true, "UTF-8", Time(), Time()); 443 Time(), Time());
435 TemplateURL* original2 = AddKeywordWithDate( 444 TemplateURL* original2 = AddKeywordWithDate(
436 "nonreplaceable", "keyword2", "http://test2", std::string(), 445 "nonreplaceable", "keyword2", "http://test2", std::string(),
437 std::string(), std::string(), false, "UTF-8", Time(), Time()); 446 std::string(), std::string(), false, "UTF-8", Time(), Time(), Time());
438 model()->RegisterOmniboxKeyword("test3", "extension", "keyword3", 447 model()->RegisterOmniboxKeyword("test3", "extension", "keyword3",
439 "http://test3"); 448 "http://test3");
440 TemplateURL* original3 = 449 TemplateURL* original3 =
441 model()->GetTemplateURLForKeyword(ASCIIToUTF16("keyword3")); 450 model()->GetTemplateURLForKeyword(ASCIIToUTF16("keyword3"));
442 ASSERT_TRUE(original3); 451 ASSERT_TRUE(original3);
443 452
444 // Extension keywords should override replaceable keywords. 453 // Extension keywords should override replaceable keywords.
445 model()->RegisterOmniboxKeyword("id1", "test", "keyword1", "http://test4"); 454 model()->RegisterOmniboxKeyword("id1", "test", "keyword1", "http://test4");
446 TemplateURL* extension1 = model()->FindTemplateURLForExtension( 455 TemplateURL* extension1 = model()->FindTemplateURLForExtension(
447 "id1", TemplateURL::OMNIBOX_API_EXTENSION); 456 "id1", TemplateURL::OMNIBOX_API_EXTENSION);
(...skipping 23 matching lines...) Expand all
471 480
472 // Similar to the AddSameKeyword test, but with an extension keyword masking a 481 // Similar to the AddSameKeyword test, but with an extension keyword masking a
473 // replaceable TemplateURL. We should still do correct conflict resolution 482 // replaceable TemplateURL. We should still do correct conflict resolution
474 // between the non-template URLs. 483 // between the non-template URLs.
475 model()->RegisterOmniboxKeyword("test2", "extension", "keyword", 484 model()->RegisterOmniboxKeyword("test2", "extension", "keyword",
476 "http://test2"); 485 "http://test2");
477 TemplateURL* extension = 486 TemplateURL* extension =
478 model()->GetTemplateURLForKeyword(ASCIIToUTF16("keyword")); 487 model()->GetTemplateURLForKeyword(ASCIIToUTF16("keyword"));
479 ASSERT_TRUE(extension); 488 ASSERT_TRUE(extension);
480 // Adding a keyword that matches the extension. 489 // Adding a keyword that matches the extension.
481 AddKeywordWithDate( 490 AddKeywordWithDate("replaceable", "keyword", "http://test1", std::string(),
482 "replaceable", "keyword", "http://test1", std::string(), std::string(), 491 std::string(), std::string(), true, "UTF-8", Time(),
483 std::string(), true, "UTF-8", Time(), Time()); 492 Time(), Time());
484 493
485 // Adding another replaceable keyword should remove the existing one, but 494 // Adding another replaceable keyword should remove the existing one, but
486 // leave the extension as is. 495 // leave the extension as is.
487 TemplateURLData data; 496 TemplateURLData data;
488 data.SetShortName(ASCIIToUTF16("name1")); 497 data.SetShortName(ASCIIToUTF16("name1"));
489 data.SetKeyword(ASCIIToUTF16("keyword")); 498 data.SetKeyword(ASCIIToUTF16("keyword"));
490 data.SetURL("http://test3"); 499 data.SetURL("http://test3");
491 data.safe_for_autoreplace = true; 500 data.safe_for_autoreplace = true;
492 TemplateURL* t_url = model()->Add(base::MakeUnique<TemplateURL>(data)); 501 TemplateURL* t_url = model()->Add(base::MakeUnique<TemplateURL>(data));
493 EXPECT_EQ(extension, 502 EXPECT_EQ(extension,
(...skipping 30 matching lines...) Expand all
524 Time now = Time::Now(); 533 Time now = Time::Now();
525 TimeDelta one_day = TimeDelta::FromDays(1); 534 TimeDelta one_day = TimeDelta::FromDays(1);
526 Time month_ago = now - TimeDelta::FromDays(30); 535 Time month_ago = now - TimeDelta::FromDays(30);
527 536
528 // Nothing has been added. 537 // Nothing has been added.
529 EXPECT_EQ(0U, model()->GetTemplateURLs().size()); 538 EXPECT_EQ(0U, model()->GetTemplateURLs().size());
530 539
531 // Create one with a 0 time. 540 // Create one with a 0 time.
532 AddKeywordWithDate("name1", "key1", "http://foo1", "http://suggest1", 541 AddKeywordWithDate("name1", "key1", "http://foo1", "http://suggest1",
533 std::string(), "http://icon1", true, "UTF-8;UTF-16", 542 std::string(), "http://icon1", true, "UTF-8;UTF-16",
534 Time(), Time()); 543 Time(), Time(), Time());
535 // Create one for now and +/- 1 day. 544 // Create one for now and +/- 1 day.
536 AddKeywordWithDate("name2", "key2", "http://foo2", "http://suggest2", 545 AddKeywordWithDate("name2", "key2", "http://foo2", "http://suggest2",
537 std::string(), "http://icon2", true, "UTF-8;UTF-16", 546 std::string(), "http://icon2", true, "UTF-8;UTF-16",
538 now - one_day, Time()); 547 now - one_day, Time(), Time());
539 AddKeywordWithDate("name3", "key3", "http://foo3", std::string(), 548 AddKeywordWithDate("name3", "key3", "http://foo3", std::string(),
540 std::string(), std::string(), true, std::string(), now, 549 std::string(), std::string(), true, std::string(), now,
541 Time()); 550 Time(), Time());
542 AddKeywordWithDate("name4", "key4", "http://foo4", std::string(), 551 AddKeywordWithDate("name4", "key4", "http://foo4", std::string(),
543 std::string(), std::string(), true, std::string(), 552 std::string(), std::string(), true, std::string(),
544 now + one_day, Time()); 553 now + one_day, Time(), Time());
545 // Try the other three states. 554 // Try the other three states.
546 AddKeywordWithDate("name5", "key5", "http://foo5", "http://suggest5", 555 AddKeywordWithDate("name5", "key5", "http://foo5", "http://suggest5",
547 std::string(), "http://icon5", false, "UTF-8;UTF-16", now, 556 std::string(), "http://icon5", false, "UTF-8;UTF-16", now,
548 Time()); 557 Time(), Time());
549 AddKeywordWithDate("name6", "key6", "http://foo6", "http://suggest6", 558 AddKeywordWithDate("name6", "key6", "http://foo6", "http://suggest6",
550 std::string(), "http://icon6", false, "UTF-8;UTF-16", 559 std::string(), "http://icon6", false, "UTF-8;UTF-16",
551 month_ago, Time()); 560 month_ago, Time(), Time());
552 561
553 // We just added a few items, validate them. 562 // We just added a few items, validate them.
554 EXPECT_EQ(6U, model()->GetTemplateURLs().size()); 563 EXPECT_EQ(6U, model()->GetTemplateURLs().size());
555 564
556 // Try removing from current timestamp. This should delete the one in the 565 // Try removing from current timestamp. This should delete the one in the
557 // future and one very recent one. 566 // future and one very recent one.
558 model()->RemoveAutoGeneratedSince(now); 567 model()->RemoveAutoGeneratedSince(now);
559 EXPECT_EQ(4U, model()->GetTemplateURLs().size()); 568 EXPECT_EQ(4U, model()->GetTemplateURLs().size());
560 569
561 // Try removing from two months ago. This should only delete items that are 570 // Try removing from two months ago. This should only delete items that are
(...skipping 26 matching lines...) Expand all
588 Time now = Time::Now(); 597 Time now = Time::Now();
589 TimeDelta one_day = TimeDelta::FromDays(1); 598 TimeDelta one_day = TimeDelta::FromDays(1);
590 Time month_ago = now - TimeDelta::FromDays(30); 599 Time month_ago = now - TimeDelta::FromDays(30);
591 600
592 // Nothing has been added. 601 // Nothing has been added.
593 EXPECT_EQ(0U, model()->GetTemplateURLs().size()); 602 EXPECT_EQ(0U, model()->GetTemplateURLs().size());
594 603
595 // Create one for now and +/- 1 day. 604 // Create one for now and +/- 1 day.
596 AddKeywordWithDate("name1", "key1", "http://foo1", "http://suggest1", 605 AddKeywordWithDate("name1", "key1", "http://foo1", "http://suggest1",
597 std::string(), "http://icon2", true, "UTF-8;UTF-16", 606 std::string(), "http://icon2", true, "UTF-8;UTF-16",
598 now - one_day, Time()); 607 now - one_day, Time(), Time());
599 AddKeywordWithDate("name2", "key2", "http://foo2", std::string(), 608 AddKeywordWithDate("name2", "key2", "http://foo2", std::string(),
600 std::string(), std::string(), true, std::string(), now, 609 std::string(), std::string(), true, std::string(), now,
601 Time()); 610 Time(), Time());
602 AddKeywordWithDate("name3", "key3", "http://foo3", std::string(), 611 AddKeywordWithDate("name3", "key3", "http://foo3", std::string(),
603 std::string(), std::string(), true, std::string(), 612 std::string(), std::string(), true, std::string(),
604 now + one_day, Time()); 613 now + one_day, Time(), Time());
605 614
606 // We just added a few items, validate them. 615 // We just added a few items, validate them.
607 EXPECT_EQ(3U, model()->GetTemplateURLs().size()); 616 EXPECT_EQ(3U, model()->GetTemplateURLs().size());
608 617
609 // Try removing foo2. This should delete foo2, but leave foo1 and 3 untouched. 618 // Try removing foo2. This should delete foo2, but leave foo1 and 3 untouched.
610 GURL url2("http://foo2"); 619 GURL url2("http://foo2");
611 model()->RemoveAutoGeneratedForUrlsBetween( 620 model()->RemoveAutoGeneratedForUrlsBetween(
612 base::Bind(static_cast<bool (*)(const GURL&, const GURL&)>(operator==), 621 base::Bind(static_cast<bool (*)(const GURL&, const GURL&)>(operator==),
613 url2), 622 url2),
614 month_ago, now + one_day); 623 month_ago, now + one_day);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
646 // Add a new TemplateURL. 655 // Add a new TemplateURL.
647 test_util()->VerifyLoad(); 656 test_util()->VerifyLoad();
648 const size_t initial_count = model()->GetTemplateURLs().size(); 657 const size_t initial_count = model()->GetTemplateURLs().size();
649 TemplateURLData data; 658 TemplateURLData data;
650 data.SetShortName(ASCIIToUTF16("google")); 659 data.SetShortName(ASCIIToUTF16("google"));
651 data.SetKeyword(ASCIIToUTF16("keyword")); 660 data.SetKeyword(ASCIIToUTF16("keyword"));
652 data.SetURL("http://www.google.com/foo/bar"); 661 data.SetURL("http://www.google.com/foo/bar");
653 data.favicon_url = GURL("http://favicon.url"); 662 data.favicon_url = GURL("http://favicon.url");
654 data.date_created = Time::FromTimeT(100); 663 data.date_created = Time::FromTimeT(100);
655 data.last_modified = Time::FromTimeT(100); 664 data.last_modified = Time::FromTimeT(100);
665 data.last_visited = Time::FromTimeT(100);
656 TemplateURL* t_url = model()->Add(base::MakeUnique<TemplateURL>(data)); 666 TemplateURL* t_url = model()->Add(base::MakeUnique<TemplateURL>(data));
657 667
658 VerifyObserverCount(1); 668 VerifyObserverCount(1);
659 base::RunLoop().RunUntilIdle(); 669 base::RunLoop().RunUntilIdle();
660 670
661 base::Time now = base::Time::Now(); 671 base::Time now = base::Time::Now();
662 std::unique_ptr<base::SimpleTestClock> clock(new base::SimpleTestClock); 672 std::unique_ptr<base::SimpleTestClock> clock(new base::SimpleTestClock);
663 clock->SetNow(now); 673 clock->SetNow(now);
664 model()->set_clock(std::move(clock)); 674 model()->set_clock(std::move(clock));
665 675
(...skipping 20 matching lines...) Expand all
686 const TemplateURL* read_url = model()->GetTemplateURLForKeyword(new_keyword); 696 const TemplateURL* read_url = model()->GetTemplateURLForKeyword(new_keyword);
687 ASSERT_TRUE(read_url); 697 ASSERT_TRUE(read_url);
688 AssertEquals(*cloned_url, *read_url); 698 AssertEquals(*cloned_url, *read_url);
689 AssertTimesEqual(now, read_url->last_modified()); 699 AssertTimesEqual(now, read_url->last_modified());
690 } 700 }
691 701
692 TEST_F(TemplateURLServiceTest, DefaultSearchProvider) { 702 TEST_F(TemplateURLServiceTest, DefaultSearchProvider) {
693 // Add a new TemplateURL. 703 // Add a new TemplateURL.
694 test_util()->VerifyLoad(); 704 test_util()->VerifyLoad();
695 const size_t initial_count = model()->GetTemplateURLs().size(); 705 const size_t initial_count = model()->GetTemplateURLs().size();
696 TemplateURL* t_url = AddKeywordWithDate( 706 TemplateURL* t_url =
697 "name1", "key1", "http://foo1/{searchTerms}", "http://sugg1", 707 AddKeywordWithDate("name1", "key1", "http://foo1/{searchTerms}",
698 std::string(), "http://icon1", true, "UTF-8;UTF-16", Time(), Time()); 708 "http://sugg1", std::string(), "http://icon1", true,
709 "UTF-8;UTF-16", Time(), Time(), Time());
699 test_util()->ResetObserverCount(); 710 test_util()->ResetObserverCount();
700 711
701 model()->SetUserSelectedDefaultSearchProvider(t_url); 712 model()->SetUserSelectedDefaultSearchProvider(t_url);
702 ASSERT_EQ(t_url, model()->GetDefaultSearchProvider()); 713 ASSERT_EQ(t_url, model()->GetDefaultSearchProvider());
703 ASSERT_TRUE(t_url->safe_for_autoreplace()); 714 ASSERT_TRUE(t_url->safe_for_autoreplace());
704 ASSERT_TRUE(model()->ShowInDefaultList(t_url)); 715 ASSERT_TRUE(model()->ShowInDefaultList(t_url));
705 716
706 // Setting the default search provider should have caused notification. 717 // Setting the default search provider should have caused notification.
707 VerifyObserverCount(1); 718 VerifyObserverCount(1);
708 base::RunLoop().RunUntilIdle(); 719 base::RunLoop().RunUntilIdle();
709 720
710 std::unique_ptr<TemplateURL> cloned_url( 721 std::unique_ptr<TemplateURL> cloned_url(
711 base::MakeUnique<TemplateURL>(t_url->data())); 722 base::MakeUnique<TemplateURL>(t_url->data()));
712 723
713 // Make sure when we reload we get a default search provider. 724 // Make sure when we reload we get a default search provider.
714 test_util()->ResetModel(true); 725 test_util()->ResetModel(true);
715 EXPECT_EQ(initial_count + 1, model()->GetTemplateURLs().size()); 726 EXPECT_EQ(initial_count + 1, model()->GetTemplateURLs().size());
716 ASSERT_TRUE(model()->GetDefaultSearchProvider()); 727 ASSERT_TRUE(model()->GetDefaultSearchProvider());
717 AssertEquals(*cloned_url, *model()->GetDefaultSearchProvider()); 728 AssertEquals(*cloned_url, *model()->GetDefaultSearchProvider());
718 } 729 }
719 730
720 TEST_F(TemplateURLServiceTest, CantReplaceWithSameKeyword) { 731 TEST_F(TemplateURLServiceTest, CantReplaceWithSameKeyword) {
721 test_util()->ChangeModelToLoadState(); 732 test_util()->ChangeModelToLoadState();
722 ASSERT_TRUE(model()->CanAddAutogeneratedKeyword(ASCIIToUTF16("foo"), GURL(), 733 ASSERT_TRUE(model()->CanAddAutogeneratedKeyword(ASCIIToUTF16("foo"), GURL(),
723 NULL)); 734 NULL));
724 TemplateURL* t_url = AddKeywordWithDate( 735 TemplateURL* t_url = AddKeywordWithDate(
725 "name1", "foo", "http://foo1", "http://sugg1", std::string(), 736 "name1", "foo", "http://foo1", "http://sugg1", std::string(),
726 "http://icon1", true, "UTF-8;UTF-16", Time(), Time()); 737 "http://icon1", true, "UTF-8;UTF-16", Time(), Time(), Time());
727 738
728 // Can still replace, newly added template url is marked safe to replace. 739 // Can still replace, newly added template url is marked safe to replace.
729 ASSERT_TRUE(model()->CanAddAutogeneratedKeyword(ASCIIToUTF16("foo"), 740 ASSERT_TRUE(model()->CanAddAutogeneratedKeyword(ASCIIToUTF16("foo"),
730 GURL("http://foo2"), NULL)); 741 GURL("http://foo2"), NULL));
731 742
732 // ResetTemplateURL marks the TemplateURL as unsafe to replace, so it should 743 // ResetTemplateURL marks the TemplateURL as unsafe to replace, so it should
733 // no longer be replaceable. 744 // no longer be replaceable.
734 model()->ResetTemplateURL(t_url, t_url->short_name(), t_url->keyword(), 745 model()->ResetTemplateURL(t_url, t_url->short_name(), t_url->keyword(),
735 t_url->url()); 746 t_url->url());
736 747
737 ASSERT_FALSE(model()->CanAddAutogeneratedKeyword(ASCIIToUTF16("foo"), 748 ASSERT_FALSE(model()->CanAddAutogeneratedKeyword(ASCIIToUTF16("foo"),
738 GURL("http://foo2"), NULL)); 749 GURL("http://foo2"), NULL));
739 } 750 }
740 751
741 TEST_F(TemplateURLServiceTest, CantReplaceWithSameHosts) { 752 TEST_F(TemplateURLServiceTest, CantReplaceWithSameHosts) {
742 test_util()->ChangeModelToLoadState(); 753 test_util()->ChangeModelToLoadState();
743 ASSERT_TRUE(model()->CanAddAutogeneratedKeyword(ASCIIToUTF16("foo"), 754 ASSERT_TRUE(model()->CanAddAutogeneratedKeyword(ASCIIToUTF16("foo"),
744 GURL("http://foo.com"), NULL)); 755 GURL("http://foo.com"), NULL));
745 TemplateURL* t_url = AddKeywordWithDate( 756 TemplateURL* t_url = AddKeywordWithDate(
746 "name1", "foo", "http://foo.com", "http://sugg1", std::string(), 757 "name1", "foo", "http://foo.com", "http://sugg1", std::string(),
747 "http://icon1", true, "UTF-8;UTF-16", Time(), Time()); 758 "http://icon1", true, "UTF-8;UTF-16", Time(), Time(), Time());
748 759
749 // Can still replace, newly added template url is marked safe to replace. 760 // Can still replace, newly added template url is marked safe to replace.
750 ASSERT_TRUE(model()->CanAddAutogeneratedKeyword(ASCIIToUTF16("bar"), 761 ASSERT_TRUE(model()->CanAddAutogeneratedKeyword(ASCIIToUTF16("bar"),
751 GURL("http://foo.com"), NULL)); 762 GURL("http://foo.com"), NULL));
752 763
753 // ResetTemplateURL marks the TemplateURL as unsafe to replace, so it should 764 // ResetTemplateURL marks the TemplateURL as unsafe to replace, so it should
754 // no longer be replaceable. 765 // no longer be replaceable.
755 model()->ResetTemplateURL(t_url, t_url->short_name(), t_url->keyword(), 766 model()->ResetTemplateURL(t_url, t_url->short_name(), t_url->keyword(),
756 t_url->url()); 767 t_url->url());
757 768
(...skipping 15 matching lines...) Expand all
773 test_util()->VerifyLoad(); 784 test_util()->VerifyLoad();
774 785
775 TemplateURLData data; 786 TemplateURLData data;
776 data.SetShortName(ASCIIToUTF16("a")); 787 data.SetShortName(ASCIIToUTF16("a"));
777 data.safe_for_autoreplace = true; 788 data.safe_for_autoreplace = true;
778 data.SetURL("http://url/{searchTerms}"); 789 data.SetURL("http://url/{searchTerms}");
779 data.suggestions_url = "http://url2"; 790 data.suggestions_url = "http://url2";
780 data.instant_url = "http://instant"; 791 data.instant_url = "http://instant";
781 data.date_created = Time::FromTimeT(100); 792 data.date_created = Time::FromTimeT(100);
782 data.last_modified = Time::FromTimeT(100); 793 data.last_modified = Time::FromTimeT(100);
794 data.last_visited = Time::FromTimeT(100);
783 TemplateURL* t_url = model()->Add(base::MakeUnique<TemplateURL>(data)); 795 TemplateURL* t_url = model()->Add(base::MakeUnique<TemplateURL>(data));
784 const TemplateURLID id = t_url->id(); 796 const TemplateURLID id = t_url->id();
785 797
786 model()->SetUserSelectedDefaultSearchProvider(t_url); 798 model()->SetUserSelectedDefaultSearchProvider(t_url);
787 base::RunLoop().RunUntilIdle(); 799 base::RunLoop().RunUntilIdle();
788 std::unique_ptr<TemplateURL> cloned_url( 800 std::unique_ptr<TemplateURL> cloned_url(
789 base::MakeUnique<TemplateURL>(t_url->data())); 801 base::MakeUnique<TemplateURL>(t_url->data()));
790 802
791 // Reset the model and don't load it. The template url we set as the default 803 // Reset the model and don't load it. The template url we set as the default
792 // should be pulled from prefs now. 804 // should be pulled from prefs now.
(...skipping 24 matching lines...) Expand all
817 ASCIIToUTF16("google.com")); 829 ASCIIToUTF16("google.com"));
818 ASSERT_TRUE(google); 830 ASSERT_TRUE(google);
819 model()->ResetTemplateURL(google, ASCIIToUTF16("trash"), ASCIIToUTF16("xxx"), 831 model()->ResetTemplateURL(google, ASCIIToUTF16("trash"), ASCIIToUTF16("xxx"),
820 "http://www.foo.com/s?q={searchTerms}"); 832 "http://www.foo.com/s?q={searchTerms}");
821 EXPECT_EQ(ASCIIToUTF16("trash"), google->short_name()); 833 EXPECT_EQ(ASCIIToUTF16("trash"), google->short_name());
822 EXPECT_EQ(ASCIIToUTF16("xxx"), google->keyword()); 834 EXPECT_EQ(ASCIIToUTF16("xxx"), google->keyword());
823 835
824 // Add third-party default search engine. 836 // Add third-party default search engine.
825 TemplateURL* user_dse = AddKeywordWithDate( 837 TemplateURL* user_dse = AddKeywordWithDate(
826 "malware", "google.com", "http://www.goo.com/s?q={searchTerms}", 838 "malware", "google.com", "http://www.goo.com/s?q={searchTerms}",
827 std::string(), std::string(), std::string(), 839 std::string(), std::string(), std::string(), true, "UTF-8", Time(),
828 true, "UTF-8", Time(), Time()); 840 Time(), Time());
829 model()->SetUserSelectedDefaultSearchProvider(user_dse); 841 model()->SetUserSelectedDefaultSearchProvider(user_dse);
830 EXPECT_EQ(user_dse, model()->GetDefaultSearchProvider()); 842 EXPECT_EQ(user_dse, model()->GetDefaultSearchProvider());
831 843
832 // Remove bing. 844 // Remove bing.
833 TemplateURL* bing = model()->GetTemplateURLForKeyword( 845 TemplateURL* bing = model()->GetTemplateURLForKeyword(
834 ASCIIToUTF16("bing.com")); 846 ASCIIToUTF16("bing.com"));
835 ASSERT_TRUE(bing); 847 ASSERT_TRUE(bing);
836 model()->Remove(bing); 848 model()->Remove(bing);
837 EXPECT_FALSE(model()->GetTemplateURLForKeyword(ASCIIToUTF16("bing.com"))); 849 EXPECT_FALSE(model()->GetTemplateURLForKeyword(ASCIIToUTF16("bing.com")));
838 850
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
895 { "http://x/foo?q=b&q=xx", base::string16() }, 907 { "http://x/foo?q=b&q=xx", base::string16() },
896 { "http://x/foo#query=xx", ASCIIToUTF16("xx") }, 908 { "http://x/foo#query=xx", ASCIIToUTF16("xx") },
897 { "http://x/foo?q=b#query=xx", ASCIIToUTF16("xx") }, 909 { "http://x/foo?q=b#query=xx", ASCIIToUTF16("xx") },
898 { "http://x/foo?q=b#q=xx", ASCIIToUTF16("b") }, 910 { "http://x/foo?q=b#q=xx", ASCIIToUTF16("b") },
899 { "http://x/foo?query=b#q=xx", base::string16() }, 911 { "http://x/foo?query=b#q=xx", base::string16() },
900 }; 912 };
901 913
902 test_util()->ChangeModelToLoadState(); 914 test_util()->ChangeModelToLoadState();
903 AddKeywordWithDate("name", "x", "http://x/foo?q={searchTerms}", 915 AddKeywordWithDate("name", "x", "http://x/foo?q={searchTerms}",
904 "http://sugg1", "http://x/foo#query={searchTerms}", 916 "http://sugg1", "http://x/foo#query={searchTerms}",
905 "http://icon1", false, "UTF-8;UTF-16", Time(), Time()); 917 "http://icon1", false, "UTF-8;UTF-16", Time(), Time(),
918 Time());
906 919
907 for (size_t i = 0; i < arraysize(data); ++i) { 920 for (size_t i = 0; i < arraysize(data); ++i) {
908 TemplateURLService::URLVisitedDetails details = { 921 TemplateURLService::URLVisitedDetails details = {
909 GURL(data[i].url), false 922 GURL(data[i].url), false
910 }; 923 };
911 model()->UpdateKeywordSearchTermsForURL(details); 924 model()->UpdateKeywordSearchTermsForURL(details);
912 EXPECT_EQ(data[i].term, test_util()->GetAndClearSearchTerm()); 925 EXPECT_EQ(data[i].term, test_util()->GetAndClearSearchTerm());
913 } 926 }
914 } 927 }
915 928
916 TEST_F(TemplateURLServiceTest, DontUpdateKeywordSearchForNonReplaceable) { 929 TEST_F(TemplateURLServiceTest, DontUpdateKeywordSearchForNonReplaceable) {
917 struct TestData { 930 struct TestData {
918 const std::string url; 931 const std::string url;
919 } data[] = { 932 } data[] = {
920 { "http://foo/" }, 933 { "http://foo/" },
921 { "http://x/bar?q=xx" }, 934 { "http://x/bar?q=xx" },
922 { "http://x/foo?y=xx" }, 935 { "http://x/foo?y=xx" },
923 }; 936 };
924 937
925 test_util()->ChangeModelToLoadState(); 938 test_util()->ChangeModelToLoadState();
926 AddKeywordWithDate("name", "x", "http://x/foo", "http://sugg1", std::string(), 939 AddKeywordWithDate("name", "x", "http://x/foo", "http://sugg1", std::string(),
927 "http://icon1", false, "UTF-8;UTF-16", Time(), Time()); 940 "http://icon1", false, "UTF-8;UTF-16", Time(), Time(),
941 Time());
928 942
929 for (size_t i = 0; i < arraysize(data); ++i) { 943 for (size_t i = 0; i < arraysize(data); ++i) {
930 TemplateURLService::URLVisitedDetails details = { 944 TemplateURLService::URLVisitedDetails details = {
931 GURL(data[i].url), false 945 GURL(data[i].url), false
932 }; 946 };
933 model()->UpdateKeywordSearchTermsForURL(details); 947 model()->UpdateKeywordSearchTermsForURL(details);
934 ASSERT_EQ(base::string16(), test_util()->GetAndClearSearchTerm()); 948 ASSERT_EQ(base::string16(), test_util()->GetAndClearSearchTerm());
935 } 949 }
936 } 950 }
937 951
938 TEST_F(TemplateURLServiceWithoutFallbackTest, ChangeGoogleBaseValue) { 952 TEST_F(TemplateURLServiceWithoutFallbackTest, ChangeGoogleBaseValue) {
939 // NOTE: Do not load the prepopulate data, which also has a {google:baseURL} 953 // NOTE: Do not load the prepopulate data, which also has a {google:baseURL}
940 // keyword in it and would confuse this test. 954 // keyword in it and would confuse this test.
941 test_util()->ChangeModelToLoadState(); 955 test_util()->ChangeModelToLoadState();
942 956
943 test_util()->SetGoogleBaseURL(GURL("http://google.com/")); 957 test_util()->SetGoogleBaseURL(GURL("http://google.com/"));
944 const TemplateURL* t_url = AddKeywordWithDate( 958 const TemplateURL* t_url = AddKeywordWithDate(
945 "name", "google.com", "{google:baseURL}?q={searchTerms}", "http://sugg1", 959 "name", "google.com", "{google:baseURL}?q={searchTerms}", "http://sugg1",
946 std::string(), "http://icon1", false, "UTF-8;UTF-16", Time(), Time()); 960 std::string(), "http://icon1", false, "UTF-8;UTF-16", Time(), Time(),
961 Time());
947 ASSERT_EQ(t_url, model()->GetTemplateURLForHost("google.com")); 962 ASSERT_EQ(t_url, model()->GetTemplateURLForHost("google.com"));
948 EXPECT_EQ("google.com", t_url->url_ref().GetHost(search_terms_data())); 963 EXPECT_EQ("google.com", t_url->url_ref().GetHost(search_terms_data()));
949 EXPECT_EQ(ASCIIToUTF16("google.com"), t_url->keyword()); 964 EXPECT_EQ(ASCIIToUTF16("google.com"), t_url->keyword());
950 965
951 // Change the Google base url. 966 // Change the Google base url.
952 test_util()->ResetObserverCount(); 967 test_util()->ResetObserverCount();
953 test_util()->SetGoogleBaseURL(GURL("http://google.co.uk/")); 968 test_util()->SetGoogleBaseURL(GURL("http://google.co.uk/"));
954 VerifyObserverCount(1); 969 VerifyObserverCount(1);
955 970
956 // Make sure the host->TemplateURL map was updated appropriately. 971 // Make sure the host->TemplateURL map was updated appropriately.
957 ASSERT_EQ(t_url, model()->GetTemplateURLForHost("google.co.uk")); 972 ASSERT_EQ(t_url, model()->GetTemplateURLForHost("google.co.uk"));
958 EXPECT_TRUE(model()->GetTemplateURLForHost("google.com") == NULL); 973 EXPECT_TRUE(model()->GetTemplateURLForHost("google.com") == NULL);
959 EXPECT_EQ("google.co.uk", t_url->url_ref().GetHost(search_terms_data())); 974 EXPECT_EQ("google.co.uk", t_url->url_ref().GetHost(search_terms_data()));
960 EXPECT_EQ(ASCIIToUTF16("google.co.uk"), t_url->keyword()); 975 EXPECT_EQ(ASCIIToUTF16("google.co.uk"), t_url->keyword());
961 EXPECT_EQ("http://google.co.uk/?q=x", t_url->url_ref().ReplaceSearchTerms( 976 EXPECT_EQ("http://google.co.uk/?q=x", t_url->url_ref().ReplaceSearchTerms(
962 TemplateURLRef::SearchTermsArgs(ASCIIToUTF16("x")), search_terms_data())); 977 TemplateURLRef::SearchTermsArgs(ASCIIToUTF16("x")), search_terms_data()));
963 978
964 // Now add a manual entry and then change the Google base URL such that the 979 // Now add a manual entry and then change the Google base URL such that the
965 // autogenerated Google search keyword would conflict. 980 // autogenerated Google search keyword would conflict.
966 TemplateURL* manual = AddKeywordWithDate( 981 TemplateURL* manual = AddKeywordWithDate(
967 "manual", "google.de", "http://google.de/search?q={searchTerms}", 982 "manual", "google.de", "http://google.de/search?q={searchTerms}",
968 std::string(), std::string(), std::string(), false, "UTF-8", Time(), 983 std::string(), std::string(), std::string(), false, "UTF-8", Time(),
969 Time()); 984 Time(), Time());
970 test_util()->SetGoogleBaseURL(GURL("http://google.de")); 985 test_util()->SetGoogleBaseURL(GURL("http://google.de"));
971 986
972 // Verify that the manual entry is untouched, and the autogenerated keyword 987 // Verify that the manual entry is untouched, and the autogenerated keyword
973 // has not changed. 988 // has not changed.
974 ASSERT_EQ(manual, 989 ASSERT_EQ(manual,
975 model()->GetTemplateURLForKeyword(ASCIIToUTF16("google.de"))); 990 model()->GetTemplateURLForKeyword(ASCIIToUTF16("google.de")));
976 EXPECT_EQ("google.de", manual->url_ref().GetHost(search_terms_data())); 991 EXPECT_EQ("google.de", manual->url_ref().GetHost(search_terms_data()));
977 ASSERT_EQ(t_url, 992 ASSERT_EQ(t_url,
978 model()->GetTemplateURLForKeyword(ASCIIToUTF16("google.co.uk"))); 993 model()->GetTemplateURLForKeyword(ASCIIToUTF16("google.co.uk")));
979 EXPECT_EQ("google.de", t_url->url_ref().GetHost(search_terms_data())); 994 EXPECT_EQ("google.de", t_url->url_ref().GetHost(search_terms_data()));
(...skipping 16 matching lines...) Expand all
996 // KEYWORD visits. 1011 // KEYWORD visits.
997 TEST_F(TemplateURLServiceTest, GenerateVisitOnKeyword) { 1012 TEST_F(TemplateURLServiceTest, GenerateVisitOnKeyword) {
998 test_util()->profile()->CreateBookmarkModel(false); 1013 test_util()->profile()->CreateBookmarkModel(false);
999 ASSERT_TRUE(test_util()->profile()->CreateHistoryService(true, false)); 1014 ASSERT_TRUE(test_util()->profile()->CreateHistoryService(true, false));
1000 test_util()->ResetModel(true); 1015 test_util()->ResetModel(true);
1001 1016
1002 // Create a keyword. 1017 // Create a keyword.
1003 TemplateURL* t_url = AddKeywordWithDate( 1018 TemplateURL* t_url = AddKeywordWithDate(
1004 "keyword", "keyword", "http://foo.com/foo?query={searchTerms}", 1019 "keyword", "keyword", "http://foo.com/foo?query={searchTerms}",
1005 "http://sugg1", std::string(), "http://icon1", true, "UTF-8;UTF-16", 1020 "http://sugg1", std::string(), "http://icon1", true, "UTF-8;UTF-16",
1006 base::Time::Now(), base::Time::Now()); 1021 base::Time::Now(), base::Time::Now(), base::Time());
1007 1022
1008 // Add a visit that matches the url of the keyword. 1023 // Add a visit that matches the url of the keyword.
1009 history::HistoryService* history = HistoryServiceFactory::GetForProfile( 1024 history::HistoryService* history = HistoryServiceFactory::GetForProfile(
1010 test_util()->profile(), ServiceAccessType::EXPLICIT_ACCESS); 1025 test_util()->profile(), ServiceAccessType::EXPLICIT_ACCESS);
1011 history->AddPage( 1026 history->AddPage(
1012 GURL(t_url->url_ref().ReplaceSearchTerms( 1027 GURL(t_url->url_ref().ReplaceSearchTerms(
1013 TemplateURLRef::SearchTermsArgs(ASCIIToUTF16("blah")), 1028 TemplateURLRef::SearchTermsArgs(ASCIIToUTF16("blah")),
1014 search_terms_data())), 1029 search_terms_data())),
1015 base::Time::Now(), NULL, 0, GURL(), history::RedirectList(), 1030 base::Time::Now(), NULL, 0, GURL(), history::RedirectList(),
1016 ui::PAGE_TRANSITION_KEYWORD, history::SOURCE_BROWSED, false); 1031 ui::PAGE_TRANSITION_KEYWORD, history::SOURCE_BROWSED, false);
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
1205 1220
1206 // Verifies that if the default search URL preference is managed, we report 1221 // Verifies that if the default search URL preference is managed, we report
1207 // the default search as managed. Also check that we are getting the right 1222 // the default search as managed. Also check that we are getting the right
1208 // values. 1223 // values.
1209 TEST_F(TemplateURLServiceTest, TestManagedDefaultSearch) { 1224 TEST_F(TemplateURLServiceTest, TestManagedDefaultSearch) {
1210 test_util()->VerifyLoad(); 1225 test_util()->VerifyLoad();
1211 const size_t initial_count = model()->GetTemplateURLs().size(); 1226 const size_t initial_count = model()->GetTemplateURLs().size();
1212 test_util()->ResetObserverCount(); 1227 test_util()->ResetObserverCount();
1213 1228
1214 // Set a regular default search provider. 1229 // Set a regular default search provider.
1215 TemplateURL* regular_default = AddKeywordWithDate( 1230 TemplateURL* regular_default =
1216 "name1", "key1", "http://foo1/{searchTerms}", "http://sugg1", 1231 AddKeywordWithDate("name1", "key1", "http://foo1/{searchTerms}",
1217 std::string(), "http://icon1", true, "UTF-8;UTF-16", Time(), Time()); 1232 "http://sugg1", std::string(), "http://icon1", true,
1233 "UTF-8;UTF-16", Time(), Time(), Time());
1218 VerifyObserverCount(1); 1234 VerifyObserverCount(1);
1219 model()->SetUserSelectedDefaultSearchProvider(regular_default); 1235 model()->SetUserSelectedDefaultSearchProvider(regular_default);
1220 // Adding the URL and setting the default search provider should have caused 1236 // Adding the URL and setting the default search provider should have caused
1221 // notifications. 1237 // notifications.
1222 VerifyObserverCount(1); 1238 VerifyObserverCount(1);
1223 EXPECT_FALSE(model()->is_default_search_managed()); 1239 EXPECT_FALSE(model()->is_default_search_managed());
1224 EXPECT_EQ(initial_count + 1, model()->GetTemplateURLs().size()); 1240 EXPECT_EQ(initial_count + 1, model()->GetTemplateURLs().size());
1225 1241
1226 // Set a managed preference that establishes a default search provider. 1242 // Set a managed preference that establishes a default search provider.
1227 std::unique_ptr<TemplateURLData> managed = CreateTestSearchEngine(); 1243 std::unique_ptr<TemplateURLData> managed = CreateTestSearchEngine();
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
1369 ASSERT_EQ(initial_count + 1, model()->GetTemplateURLs().size()); 1385 ASSERT_EQ(initial_count + 1, model()->GetTemplateURLs().size());
1370 loaded_url = model()->GetTemplateURLForKeyword(ASCIIToUTF16("keyword")); 1386 loaded_url = model()->GetTemplateURLForKeyword(ASCIIToUTF16("keyword"));
1371 ASSERT_FALSE(loaded_url == NULL); 1387 ASSERT_FALSE(loaded_url == NULL);
1372 EXPECT_EQ(4U, loaded_url->input_encodings().size()); 1388 EXPECT_EQ(4U, loaded_url->input_encodings().size());
1373 } 1389 }
1374 1390
1375 TEST_F(TemplateURLServiceTest, DefaultExtensionEngine) { 1391 TEST_F(TemplateURLServiceTest, DefaultExtensionEngine) {
1376 test_util()->VerifyLoad(); 1392 test_util()->VerifyLoad();
1377 // Add third-party default search engine. 1393 // Add third-party default search engine.
1378 TemplateURL* user_dse = AddKeywordWithDate( 1394 TemplateURL* user_dse = AddKeywordWithDate(
1379 "user", "user", "http://www.goo.com/s?q={searchTerms}", 1395 "user", "user", "http://www.goo.com/s?q={searchTerms}", std::string(),
1380 std::string(), std::string(), std::string(), 1396 std::string(), std::string(), true, "UTF-8", Time(), Time(), Time());
1381 true, "UTF-8", Time(), Time());
1382 model()->SetUserSelectedDefaultSearchProvider(user_dse); 1397 model()->SetUserSelectedDefaultSearchProvider(user_dse);
1383 EXPECT_EQ(user_dse, model()->GetDefaultSearchProvider()); 1398 EXPECT_EQ(user_dse, model()->GetDefaultSearchProvider());
1384 1399
1385 std::unique_ptr<TemplateURL> ext_dse = CreateKeywordWithDate( 1400 std::unique_ptr<TemplateURL> ext_dse = CreateKeywordWithDate(
1386 model(), "ext", "ext", "http://www.search.com/s?q={searchTerms}", 1401 model(), "ext", "ext", "http://www.search.com/s?q={searchTerms}",
1387 std::string(), std::string(), std::string(), true, kPrepopulatedId, 1402 std::string(), std::string(), std::string(), true, kPrepopulatedId,
1388 "UTF-8", Time(), Time(), TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION); 1403 "UTF-8", Time(), Time(), Time(),
1404 TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION);
1389 std::unique_ptr<TemplateURL::AssociatedExtensionInfo> extension_info( 1405 std::unique_ptr<TemplateURL::AssociatedExtensionInfo> extension_info(
1390 new TemplateURL::AssociatedExtensionInfo("ext")); 1406 new TemplateURL::AssociatedExtensionInfo("ext"));
1391 extension_info->wants_to_be_default_engine = true; 1407 extension_info->wants_to_be_default_engine = true;
1392 TemplateURL* ext_dse_ptr = model()->AddExtensionControlledTURL( 1408 TemplateURL* ext_dse_ptr = model()->AddExtensionControlledTURL(
1393 std::move(ext_dse), std::move(extension_info)); 1409 std::move(ext_dse), std::move(extension_info));
1394 EXPECT_EQ(ext_dse_ptr, model()->GetDefaultSearchProvider()); 1410 EXPECT_EQ(ext_dse_ptr, model()->GetDefaultSearchProvider());
1395 1411
1396 model()->RemoveExtensionControlledTURL( 1412 model()->RemoveExtensionControlledTURL(
1397 "ext", TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION); 1413 "ext", TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION);
1398 ExpectSimilar(user_dse, model()->GetDefaultSearchProvider()); 1414 ExpectSimilar(user_dse, model()->GetDefaultSearchProvider());
1399 } 1415 }
1400 1416
1401 TEST_F(TemplateURLServiceTest, ExtensionEnginesNotPersist) { 1417 TEST_F(TemplateURLServiceTest, ExtensionEnginesNotPersist) {
1402 test_util()->VerifyLoad(); 1418 test_util()->VerifyLoad();
1403 // Add third-party default search engine. 1419 // Add third-party default search engine.
1404 TemplateURL* user_dse = AddKeywordWithDate( 1420 TemplateURL* user_dse = AddKeywordWithDate(
1405 "user", "user", "http://www.goo.com/s?q={searchTerms}", 1421 "user", "user", "http://www.goo.com/s?q={searchTerms}", std::string(),
1406 std::string(), std::string(), std::string(), 1422 std::string(), std::string(), true, "UTF-8", Time(), Time(), Time());
1407 true, "UTF-8", Time(), Time());
1408 model()->SetUserSelectedDefaultSearchProvider(user_dse); 1423 model()->SetUserSelectedDefaultSearchProvider(user_dse);
1409 EXPECT_EQ(user_dse, model()->GetDefaultSearchProvider()); 1424 EXPECT_EQ(user_dse, model()->GetDefaultSearchProvider());
1410 1425
1411 std::unique_ptr<TemplateURL> ext_dse = CreateKeywordWithDate( 1426 std::unique_ptr<TemplateURL> ext_dse = CreateKeywordWithDate(
1412 model(), "ext1", "ext1", "http://www.ext1.com/s?q={searchTerms}", 1427 model(), "ext1", "ext1", "http://www.ext1.com/s?q={searchTerms}",
1413 std::string(), std::string(), std::string(), true, 0, "UTF-8", Time(), 1428 std::string(), std::string(), std::string(), true, 0, "UTF-8", Time(),
1414 Time(), TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION); 1429 Time(), Time(), TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION);
1415 std::unique_ptr<TemplateURL::AssociatedExtensionInfo> extension_info( 1430 std::unique_ptr<TemplateURL::AssociatedExtensionInfo> extension_info(
1416 new TemplateURL::AssociatedExtensionInfo("ext1")); 1431 new TemplateURL::AssociatedExtensionInfo("ext1"));
1417 extension_info->wants_to_be_default_engine = false; 1432 extension_info->wants_to_be_default_engine = false;
1418 model()->AddExtensionControlledTURL(std::move(ext_dse), 1433 model()->AddExtensionControlledTURL(std::move(ext_dse),
1419 std::move(extension_info)); 1434 std::move(extension_info));
1420 EXPECT_EQ(user_dse, model()->GetDefaultSearchProvider()); 1435 EXPECT_EQ(user_dse, model()->GetDefaultSearchProvider());
1421 1436
1422 ext_dse = CreateKeywordWithDate( 1437 ext_dse = CreateKeywordWithDate(
1423 model(), "ext2", "ext2", "http://www.ext2.com/s?q={searchTerms}", 1438 model(), "ext2", "ext2", "http://www.ext2.com/s?q={searchTerms}",
1424 std::string(), std::string(), std::string(), true, kPrepopulatedId, 1439 std::string(), std::string(), std::string(), true, kPrepopulatedId,
1425 "UTF-8", Time(), Time(), TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION); 1440 "UTF-8", Time(), Time(), Time(),
1441 TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION);
1426 extension_info.reset(new TemplateURL::AssociatedExtensionInfo("ext2")); 1442 extension_info.reset(new TemplateURL::AssociatedExtensionInfo("ext2"));
1427 extension_info->wants_to_be_default_engine = true; 1443 extension_info->wants_to_be_default_engine = true;
1428 TemplateURL* ext_dse_ptr = model()->AddExtensionControlledTURL( 1444 TemplateURL* ext_dse_ptr = model()->AddExtensionControlledTURL(
1429 std::move(ext_dse), std::move(extension_info)); 1445 std::move(ext_dse), std::move(extension_info));
1430 EXPECT_EQ(ext_dse_ptr, model()->GetDefaultSearchProvider()); 1446 EXPECT_EQ(ext_dse_ptr, model()->GetDefaultSearchProvider());
1431 1447
1432 test_util()->ResetModel(true); 1448 test_util()->ResetModel(true);
1433 user_dse = model()->GetTemplateURLForKeyword(ASCIIToUTF16("user")); 1449 user_dse = model()->GetTemplateURLForKeyword(ASCIIToUTF16("user"));
1434 ExpectSimilar(user_dse, model()->GetDefaultSearchProvider()); 1450 ExpectSimilar(user_dse, model()->GetDefaultSearchProvider());
1435 EXPECT_FALSE(model()->GetTemplateURLForKeyword(ASCIIToUTF16("ext1"))); 1451 EXPECT_FALSE(model()->GetTemplateURLForKeyword(ASCIIToUTF16("ext1")));
1436 EXPECT_FALSE(model()->GetTemplateURLForKeyword(ASCIIToUTF16("ext2"))); 1452 EXPECT_FALSE(model()->GetTemplateURLForKeyword(ASCIIToUTF16("ext2")));
1437 } 1453 }
1438 1454
1439 TEST_F(TemplateURLServiceTest, ExtensionEngineVsPolicy) { 1455 TEST_F(TemplateURLServiceTest, ExtensionEngineVsPolicy) {
1440 // Set a managed preference that establishes a default search provider. 1456 // Set a managed preference that establishes a default search provider.
1441 std::unique_ptr<TemplateURLData> managed = CreateTestSearchEngine(); 1457 std::unique_ptr<TemplateURLData> managed = CreateTestSearchEngine();
1442 SetManagedDefaultSearchPreferences(*managed, true, test_util()->profile()); 1458 SetManagedDefaultSearchPreferences(*managed, true, test_util()->profile());
1443 test_util()->VerifyLoad(); 1459 test_util()->VerifyLoad();
1444 // Verify that the default manager we are getting is the managed one. 1460 // Verify that the default manager we are getting is the managed one.
1445 auto expected_managed_default = base::MakeUnique<TemplateURL>(*managed); 1461 auto expected_managed_default = base::MakeUnique<TemplateURL>(*managed);
1446 EXPECT_TRUE(model()->is_default_search_managed()); 1462 EXPECT_TRUE(model()->is_default_search_managed());
1447 const TemplateURL* actual_managed_default = 1463 const TemplateURL* actual_managed_default =
1448 model()->GetDefaultSearchProvider(); 1464 model()->GetDefaultSearchProvider();
1449 ExpectSimilar(expected_managed_default.get(), actual_managed_default); 1465 ExpectSimilar(expected_managed_default.get(), actual_managed_default);
1450 1466
1451 std::unique_ptr<TemplateURL> ext_dse = CreateKeywordWithDate( 1467 std::unique_ptr<TemplateURL> ext_dse = CreateKeywordWithDate(
1452 model(), "ext1", "ext1", "http://www.ext1.com/s?q={searchTerms}", 1468 model(), "ext1", "ext1", "http://www.ext1.com/s?q={searchTerms}",
1453 std::string(), std::string(), std::string(), true, kPrepopulatedId, 1469 std::string(), std::string(), std::string(), true, kPrepopulatedId,
1454 "UTF-8", Time(), Time(), TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION); 1470 "UTF-8", Time(), Time(), Time(),
1471 TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION);
1455 auto extension_info = 1472 auto extension_info =
1456 base::MakeUnique<TemplateURL::AssociatedExtensionInfo>("ext1"); 1473 base::MakeUnique<TemplateURL::AssociatedExtensionInfo>("ext1");
1457 extension_info->wants_to_be_default_engine = true; 1474 extension_info->wants_to_be_default_engine = true;
1458 TemplateURL* ext_dse_ptr = model()->AddExtensionControlledTURL( 1475 TemplateURL* ext_dse_ptr = model()->AddExtensionControlledTURL(
1459 std::move(ext_dse), std::move(extension_info)); 1476 std::move(ext_dse), std::move(extension_info));
1460 EXPECT_EQ(ext_dse_ptr, 1477 EXPECT_EQ(ext_dse_ptr,
1461 model()->GetTemplateURLForKeyword(ASCIIToUTF16("ext1"))); 1478 model()->GetTemplateURLForKeyword(ASCIIToUTF16("ext1")));
1462 EXPECT_TRUE(model()->is_default_search_managed()); 1479 EXPECT_TRUE(model()->is_default_search_managed());
1463 actual_managed_default = model()->GetDefaultSearchProvider(); 1480 actual_managed_default = model()->GetDefaultSearchProvider();
1464 ExpectSimilar(expected_managed_default.get(), actual_managed_default); 1481 ExpectSimilar(expected_managed_default.get(), actual_managed_default);
1465 } 1482 }
1483
1484 TEST_F(TemplateURLServiceTest, LastVisitedTimeUpdate) {
1485 test_util()->VerifyLoad();
1486 TemplateURL* original_url = AddKeywordWithDate(
1487 "name1", "key1", "http://foo1", "http://suggest1", std::string(),
1488 "http://icon1", true, "UTF-8;UTF-16", Time(), Time(), Time());
1489 const base::Time original_last_visited = original_url->last_visited();
1490 model()->UpdateTemplateURLVisitTime(original_url);
1491 TemplateURL* modified_url =
1492 model()->GetTemplateURLForKeyword(ASCIIToUTF16("key1"));
1493 const base::Time modified_last_visited = modified_url->last_visited();
1494 EXPECT_NE(original_last_visited, modified_last_visited);
1495 test_util()->ResetModel(true);
1496 TemplateURL* reloaded_url =
1497 model()->GetTemplateURLForKeyword(ASCIIToUTF16("key1"));
1498 AssertTimesEqual(modified_last_visited, reloaded_url->last_visited());
1499 }
OLDNEW
« no previous file with comments | « no previous file | components/search_engines/default_search_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698