OLD | NEW |
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 "chrome/browser/webdata/web_data_service.h" | 5 #include "chrome/browser/webdata/web_data_service.h" |
6 | 6 |
7 #include "base/bind.h" | |
8 #include "base/command_line.h" | |
9 #include "base/message_loop.h" | |
10 #include "base/stl_util.h" | |
11 #include "base/threading/thread.h" | |
12 #include "chrome/browser/profiles/profile.h" | |
13 #include "chrome/browser/profiles/profile_manager.h" | |
14 #include "chrome/browser/search_engines/template_url.h" | 7 #include "chrome/browser/search_engines/template_url.h" |
15 #include "chrome/browser/ui/profile_error_dialog.h" | |
16 #include "chrome/browser/webdata/autocomplete_syncable_service.h" | 8 #include "chrome/browser/webdata/autocomplete_syncable_service.h" |
17 #include "chrome/browser/webdata/autofill_change.h" | 9 #include "chrome/browser/webdata/autofill_change.h" |
18 #include "chrome/browser/webdata/autofill_entry.h" | 10 #include "chrome/browser/webdata/autofill_entry.h" |
19 #include "chrome/browser/webdata/autofill_profile_syncable_service.h" | 11 #include "chrome/browser/webdata/autofill_profile_syncable_service.h" |
20 #include "chrome/browser/webdata/autofill_table.h" | 12 #include "chrome/browser/webdata/autofill_table.h" |
21 #include "chrome/browser/webdata/keyword_table.h" | 13 #include "chrome/browser/webdata/keyword_table.h" |
22 #include "chrome/browser/webdata/logins_table.h" | 14 #include "chrome/browser/webdata/logins_table.h" |
23 #include "chrome/browser/webdata/token_service_table.h" | 15 #include "chrome/browser/webdata/token_service_table.h" |
24 #include "chrome/browser/webdata/web_apps_table.h" | 16 #include "chrome/browser/webdata/web_apps_table.h" |
25 #include "chrome/browser/webdata/web_database_service.h" | 17 #include "chrome/browser/webdata/web_database_service.h" |
26 #include "chrome/browser/webdata/web_intents_table.h" | 18 #include "chrome/browser/webdata/web_intents_table.h" |
27 #include "chrome/common/chrome_constants.h" | |
28 #include "chrome/common/chrome_notification_types.h" | 19 #include "chrome/common/chrome_notification_types.h" |
29 #include "components/autofill/browser/autofill_country.h" | 20 #include "components/autofill/browser/autofill_country.h" |
30 #include "components/autofill/browser/autofill_profile.h" | 21 #include "components/autofill/browser/autofill_profile.h" |
31 #include "components/autofill/browser/credit_card.h" | 22 #include "components/autofill/browser/credit_card.h" |
32 #include "components/autofill/common/form_field_data.h" | 23 #include "components/autofill/common/form_field_data.h" |
33 #ifdef DEBUG | |
34 #include "content/public/browser/browser_thread.h" | |
35 #endif | |
36 #include "content/public/browser/notification_details.h" | 24 #include "content/public/browser/notification_details.h" |
37 #include "content/public/browser/notification_service.h" | 25 #include "content/public/browser/notification_service.h" |
38 #include "content/public/browser/notification_source.h" | 26 #include "content/public/browser/notification_source.h" |
39 #include "grit/chromium_strings.h" | |
40 #include "grit/generated_resources.h" | |
41 #include "third_party/skia/include/core/SkBitmap.h" | 27 #include "third_party/skia/include/core/SkBitmap.h" |
42 | 28 |
43 //////////////////////////////////////////////////////////////////////////////// | 29 //////////////////////////////////////////////////////////////////////////////// |
44 // | 30 // |
45 // WebDataService implementation. | 31 // WebDataService implementation. |
46 // | 32 // |
47 //////////////////////////////////////////////////////////////////////////////// | 33 //////////////////////////////////////////////////////////////////////////////// |
48 | 34 |
49 using base::Bind; | 35 using base::Bind; |
50 using base::Time; | 36 using base::Time; |
(...skipping 19 matching lines...) Expand all Loading... |
70 | 56 |
71 WDAppImagesResult::~WDAppImagesResult() {} | 57 WDAppImagesResult::~WDAppImagesResult() {} |
72 | 58 |
73 WDKeywordsResult::WDKeywordsResult() | 59 WDKeywordsResult::WDKeywordsResult() |
74 : default_search_provider_id(0), | 60 : default_search_provider_id(0), |
75 builtin_keyword_version(0) { | 61 builtin_keyword_version(0) { |
76 } | 62 } |
77 | 63 |
78 WDKeywordsResult::~WDKeywordsResult() {} | 64 WDKeywordsResult::~WDKeywordsResult() {} |
79 | 65 |
80 WebDataService::WebDataService() | 66 WebDataService::WebDataService(const ProfileErrorCallback& callback) |
81 : db_loaded_(false), | 67 : WebDataServiceBase(callback), |
82 autocomplete_syncable_service_(NULL), | 68 autocomplete_syncable_service_(NULL), |
83 autofill_profile_syncable_service_(NULL) { | 69 autofill_profile_syncable_service_(NULL) { |
84 // WebDataService requires DB thread if instantiated. | |
85 // Set WebDataServiceFactory::GetInstance()->SetTestingFactory(&profile, NULL) | |
86 // if you do not want to instantiate WebDataService in your test. | |
87 DCHECK(BrowserThread::IsWellKnownThread(BrowserThread::DB)); | |
88 } | 70 } |
89 | 71 |
90 // static | 72 // static |
91 void WebDataService::NotifyOfMultipleAutofillChanges( | 73 void WebDataService::NotifyOfMultipleAutofillChanges( |
92 WebDataService* web_data_service) { | 74 WebDataService* web_data_service) { |
93 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); | 75 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); |
94 | 76 |
95 if (!web_data_service) | 77 if (!web_data_service) |
96 return; | 78 return; |
97 | 79 |
98 BrowserThread::PostTask( | 80 BrowserThread::PostTask( |
99 BrowserThread::UI, FROM_HERE, | 81 BrowserThread::UI, FROM_HERE, |
100 Bind(&NotifyOfMultipleAutofillChangesTask, | 82 Bind(&NotifyOfMultipleAutofillChangesTask, |
101 make_scoped_refptr(web_data_service))); | 83 make_scoped_refptr(web_data_service))); |
102 } | 84 } |
103 | 85 |
104 void WebDataService::ShutdownOnUIThread() { | 86 void WebDataService::ShutdownOnUIThread() { |
105 db_loaded_ = false; | |
106 ShutdownDatabase(); | |
107 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, | 87 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
108 Bind(&WebDataService::ShutdownSyncableServices, this)); | 88 Bind(&WebDataService::ShutdownSyncableServices, this)); |
| 89 WebDataServiceBase::ShutdownOnUIThread(); |
109 } | 90 } |
110 | 91 |
111 void WebDataService::Init(const base::FilePath& path) { | 92 void WebDataService::Init(const base::FilePath& path) { |
112 wdbs_.reset(new WebDatabaseService(path)); | 93 WebDataServiceBase::Init(path); |
113 wdbs_->LoadDatabase(Bind(&WebDataService::DatabaseInitOnDB, this)); | |
114 | |
115 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, | 94 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
116 Bind(&WebDataService::InitializeSyncableServices, this)); | 95 Bind(&WebDataService::InitializeSyncableServices, this)); |
117 } | 96 } |
118 | 97 |
119 void WebDataService::UnloadDatabase() { | |
120 if (!wdbs_) | |
121 return; | |
122 wdbs_->UnloadDatabase(); | |
123 } | |
124 | |
125 void WebDataService::ShutdownDatabase() { | |
126 if (!wdbs_) | |
127 return; | |
128 wdbs_->ShutdownDatabase(); | |
129 } | |
130 | |
131 void WebDataService::CancelRequest(Handle h) { | |
132 if (!wdbs_) | |
133 return; | |
134 wdbs_->CancelRequest(h); | |
135 } | |
136 | |
137 content::NotificationSource WebDataService::GetNotificationSource() { | |
138 return content::Source<WebDataService>(this); | |
139 } | |
140 | |
141 bool WebDataService::IsDatabaseLoaded() { | |
142 return db_loaded_; | |
143 } | |
144 | |
145 WebDatabase* WebDataService::GetDatabase() { | |
146 if (!wdbs_) | |
147 return NULL; | |
148 return wdbs_->GetDatabaseOnDB(); | |
149 } | |
150 | |
151 ////////////////////////////////////////////////////////////////////////////// | 98 ////////////////////////////////////////////////////////////////////////////// |
152 // | 99 // |
153 // Keywords. | 100 // Keywords. |
154 // | 101 // |
155 ////////////////////////////////////////////////////////////////////////////// | 102 ////////////////////////////////////////////////////////////////////////////// |
156 | 103 |
157 void WebDataService::AddKeyword(const TemplateURLData& data) { | 104 void WebDataService::AddKeyword(const TemplateURLData& data) { |
158 wdbs_->ScheduleDBTask( | 105 wdbs_->ScheduleDBTask( |
159 FROM_HERE, Bind(&WebDataService::AddKeywordImpl, this, data)); | 106 FROM_HERE, Bind(&WebDataService::AddKeywordImpl, this, data)); |
160 } | 107 } |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
322 } | 269 } |
323 | 270 |
324 void WebDataService::RemoveAutofillProfilesAndCreditCardsModifiedBetween( | 271 void WebDataService::RemoveAutofillProfilesAndCreditCardsModifiedBetween( |
325 const Time& delete_begin, | 272 const Time& delete_begin, |
326 const Time& delete_end) { | 273 const Time& delete_end) { |
327 wdbs_->ScheduleDBTask(FROM_HERE, Bind( | 274 wdbs_->ScheduleDBTask(FROM_HERE, Bind( |
328 &WebDataService::RemoveAutofillProfilesAndCreditCardsModifiedBetweenImpl, | 275 &WebDataService::RemoveAutofillProfilesAndCreditCardsModifiedBetweenImpl, |
329 this, delete_begin, delete_end)); | 276 this, delete_begin, delete_end)); |
330 } | 277 } |
331 | 278 |
| 279 WebDataService::WebDataService() |
| 280 : WebDataServiceBase(ProfileErrorCallback()), |
| 281 autocomplete_syncable_service_(NULL), |
| 282 autofill_profile_syncable_service_(NULL) { |
| 283 } |
| 284 |
332 WebDataService::~WebDataService() { | 285 WebDataService::~WebDataService() { |
333 wdbs_.reset(); | |
334 DCHECK(!autocomplete_syncable_service_); | 286 DCHECK(!autocomplete_syncable_service_); |
335 DCHECK(!autofill_profile_syncable_service_); | 287 DCHECK(!autofill_profile_syncable_service_); |
336 } | 288 } |
337 | 289 |
338 //////////////////////////////////////////////////////////////////////////////// | 290 //////////////////////////////////////////////////////////////////////////////// |
339 // | 291 // |
340 // The following methods are executed on the DB thread. | 292 // The following methods are executed on the DB thread. |
341 // | 293 // |
342 //////////////////////////////////////////////////////////////////////////////// | 294 //////////////////////////////////////////////////////////////////////////////// |
343 | 295 |
344 void WebDataService::DBInitFailed(sql::InitStatus sql_status) { | |
345 ShowProfileErrorDialog( | |
346 (sql_status == sql::INIT_FAILURE) ? | |
347 IDS_COULDNT_OPEN_PROFILE_ERROR : IDS_PROFILE_TOO_NEW_ERROR); | |
348 } | |
349 | |
350 void WebDataService::NotifyDatabaseLoadedOnUIThread() { | |
351 db_loaded_ = true; | |
352 // Notify that the database has been initialized. | |
353 content::NotificationService::current()->Notify( | |
354 chrome::NOTIFICATION_WEB_DATABASE_LOADED, | |
355 content::Source<WebDataService>(this), | |
356 content::NotificationService::NoDetails()); | |
357 } | |
358 | |
359 void WebDataService::DatabaseInitOnDB(sql::InitStatus status) { | |
360 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); | |
361 if (status == sql::INIT_OK) { | |
362 BrowserThread::PostTask( | |
363 BrowserThread::UI, FROM_HERE, | |
364 base::Bind(&WebDataService::NotifyDatabaseLoadedOnUIThread, this)); | |
365 } else { | |
366 BrowserThread::PostTask( | |
367 BrowserThread::UI, FROM_HERE, | |
368 base::Bind(&WebDataService::DBInitFailed, this, status)); | |
369 } | |
370 } | |
371 | |
372 void WebDataService::InitializeSyncableServices() { | 296 void WebDataService::InitializeSyncableServices() { |
373 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); | 297 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); |
374 DCHECK(!autocomplete_syncable_service_); | 298 DCHECK(!autocomplete_syncable_service_); |
375 DCHECK(!autofill_profile_syncable_service_); | 299 DCHECK(!autofill_profile_syncable_service_); |
376 | 300 |
377 autocomplete_syncable_service_ = new AutocompleteSyncableService(this); | 301 autocomplete_syncable_service_ = new AutocompleteSyncableService(this); |
378 autofill_profile_syncable_service_ = new AutofillProfileSyncableService(this); | 302 autofill_profile_syncable_service_ = new AutofillProfileSyncableService(this); |
379 } | 303 } |
380 | 304 |
381 void WebDataService::ShutdownSyncableServices() { | 305 void WebDataService::ShutdownSyncableServices() { |
382 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); | 306 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); |
383 | 307 |
384 delete autocomplete_syncable_service_; | 308 delete autocomplete_syncable_service_; |
385 autocomplete_syncable_service_ = NULL; | 309 autocomplete_syncable_service_ = NULL; |
386 delete autofill_profile_syncable_service_; | 310 delete autofill_profile_syncable_service_; |
387 autofill_profile_syncable_service_ = NULL; | 311 autofill_profile_syncable_service_ = NULL; |
388 } | 312 } |
389 | 313 |
390 //////////////////////////////////////////////////////////////////////////////// | 314 //////////////////////////////////////////////////////////////////////////////// |
391 // | 315 // |
392 // Keywords implementation. | 316 // Keywords implementation. |
393 // | 317 // |
394 //////////////////////////////////////////////////////////////////////////////// | 318 //////////////////////////////////////////////////////////////////////////////// |
395 | 319 |
396 WebDatabase::State WebDataService::AddKeywordImpl( | 320 WebDatabase::State WebDataService::AddKeywordImpl( |
397 const TemplateURLData& data, WebDatabase* db) { | 321 const TemplateURLData& data, WebDatabase* db) { |
398 db->GetKeywordTable()->AddKeyword(data); | 322 KeywordTable::FromWebDatabase(db)->AddKeyword(data); |
399 return WebDatabase::COMMIT_NEEDED; | 323 return WebDatabase::COMMIT_NEEDED; |
400 } | 324 } |
401 | 325 |
402 WebDatabase::State WebDataService::RemoveKeywordImpl( | 326 WebDatabase::State WebDataService::RemoveKeywordImpl( |
403 TemplateURLID id, WebDatabase* db) { | 327 TemplateURLID id, WebDatabase* db) { |
404 DCHECK(id); | 328 DCHECK(id); |
405 db->GetKeywordTable()->RemoveKeyword(id); | 329 KeywordTable::FromWebDatabase(db)->RemoveKeyword(id); |
406 return WebDatabase::COMMIT_NEEDED; | 330 return WebDatabase::COMMIT_NEEDED; |
407 } | 331 } |
408 | 332 |
409 WebDatabase::State WebDataService::UpdateKeywordImpl( | 333 WebDatabase::State WebDataService::UpdateKeywordImpl( |
410 const TemplateURLData& data, WebDatabase* db) { | 334 const TemplateURLData& data, WebDatabase* db) { |
411 if (!db->GetKeywordTable()->UpdateKeyword(data)) { | 335 if (!KeywordTable::FromWebDatabase(db)->UpdateKeyword(data)) { |
412 NOTREACHED(); | 336 NOTREACHED(); |
413 return WebDatabase::COMMIT_NOT_NEEDED; | 337 return WebDatabase::COMMIT_NOT_NEEDED; |
414 } | 338 } |
415 return WebDatabase::COMMIT_NEEDED; | 339 return WebDatabase::COMMIT_NEEDED; |
416 } | 340 } |
417 | 341 |
418 scoped_ptr<WDTypedResult> WebDataService::GetKeywordsImpl(WebDatabase* db) { | 342 scoped_ptr<WDTypedResult> WebDataService::GetKeywordsImpl(WebDatabase* db) { |
419 WDKeywordsResult result; | 343 WDKeywordsResult result; |
420 db->GetKeywordTable()->GetKeywords(&result.keywords); | 344 KeywordTable::FromWebDatabase(db)->GetKeywords(&result.keywords); |
421 result.default_search_provider_id = | 345 result.default_search_provider_id = |
422 db->GetKeywordTable()->GetDefaultSearchProviderID(); | 346 KeywordTable::FromWebDatabase(db)->GetDefaultSearchProviderID(); |
423 result.builtin_keyword_version = | 347 result.builtin_keyword_version = |
424 db->GetKeywordTable()->GetBuiltinKeywordVersion(); | 348 KeywordTable::FromWebDatabase(db)->GetBuiltinKeywordVersion(); |
425 return scoped_ptr<WDTypedResult>( | 349 return scoped_ptr<WDTypedResult>( |
426 new WDResult<WDKeywordsResult>(KEYWORDS_RESULT, result)); | 350 new WDResult<WDKeywordsResult>(KEYWORDS_RESULT, result)); |
427 } | 351 } |
428 | 352 |
429 WebDatabase::State WebDataService::SetDefaultSearchProviderImpl( | 353 WebDatabase::State WebDataService::SetDefaultSearchProviderImpl( |
430 TemplateURLID id, WebDatabase* db) { | 354 TemplateURLID id, WebDatabase* db) { |
431 if (!db->GetKeywordTable()->SetDefaultSearchProviderID(id)) { | 355 if (!KeywordTable::FromWebDatabase(db)->SetDefaultSearchProviderID(id)) { |
432 NOTREACHED(); | 356 NOTREACHED(); |
433 return WebDatabase::COMMIT_NOT_NEEDED; | 357 return WebDatabase::COMMIT_NOT_NEEDED; |
434 } | 358 } |
435 return WebDatabase::COMMIT_NEEDED; | 359 return WebDatabase::COMMIT_NEEDED; |
436 } | 360 } |
437 | 361 |
438 WebDatabase::State WebDataService::SetBuiltinKeywordVersionImpl( | 362 WebDatabase::State WebDataService::SetBuiltinKeywordVersionImpl( |
439 int version, WebDatabase* db) { | 363 int version, WebDatabase* db) { |
440 if (!db->GetKeywordTable()->SetBuiltinKeywordVersion(version)) { | 364 if (!KeywordTable::FromWebDatabase(db)->SetBuiltinKeywordVersion(version)) { |
441 NOTREACHED(); | 365 NOTREACHED(); |
442 return WebDatabase::COMMIT_NOT_NEEDED; | 366 return WebDatabase::COMMIT_NOT_NEEDED; |
443 } | 367 } |
444 return WebDatabase::COMMIT_NEEDED; | 368 return WebDatabase::COMMIT_NEEDED; |
445 } | 369 } |
446 | 370 |
447 //////////////////////////////////////////////////////////////////////////////// | 371 //////////////////////////////////////////////////////////////////////////////// |
448 // | 372 // |
449 // Web Apps implementation. | 373 // Web Apps implementation. |
450 // | 374 // |
451 //////////////////////////////////////////////////////////////////////////////// | 375 //////////////////////////////////////////////////////////////////////////////// |
452 | 376 |
453 WebDatabase::State WebDataService::SetWebAppImageImpl( | 377 WebDatabase::State WebDataService::SetWebAppImageImpl( |
454 const GURL& app_url, const SkBitmap& image, WebDatabase* db) { | 378 const GURL& app_url, const SkBitmap& image, WebDatabase* db) { |
455 db->GetWebAppsTable()->SetWebAppImage(app_url, image); | 379 WebAppsTable::FromWebDatabase(db)->SetWebAppImage(app_url, image); |
456 return WebDatabase::COMMIT_NEEDED; | 380 return WebDatabase::COMMIT_NEEDED; |
457 } | 381 } |
458 | 382 |
459 WebDatabase::State WebDataService::SetWebAppHasAllImagesImpl( | 383 WebDatabase::State WebDataService::SetWebAppHasAllImagesImpl( |
460 const GURL& app_url, bool has_all_images, WebDatabase* db) { | 384 const GURL& app_url, bool has_all_images, WebDatabase* db) { |
461 db->GetWebAppsTable()-> | 385 WebAppsTable::FromWebDatabase(db)->SetWebAppHasAllImages(app_url, |
462 SetWebAppHasAllImages(app_url, has_all_images); | 386 has_all_images); |
463 return WebDatabase::COMMIT_NEEDED; | 387 return WebDatabase::COMMIT_NEEDED; |
464 } | 388 } |
465 | 389 |
466 WebDatabase::State WebDataService::RemoveWebAppImpl( | 390 WebDatabase::State WebDataService::RemoveWebAppImpl( |
467 const GURL& app_url, WebDatabase* db) { | 391 const GURL& app_url, WebDatabase* db) { |
468 db->GetWebAppsTable()->RemoveWebApp(app_url); | 392 WebAppsTable::FromWebDatabase(db)->RemoveWebApp(app_url); |
469 return WebDatabase::COMMIT_NEEDED; | 393 return WebDatabase::COMMIT_NEEDED; |
470 } | 394 } |
471 | 395 |
472 scoped_ptr<WDTypedResult> WebDataService::GetWebAppImagesImpl( | 396 scoped_ptr<WDTypedResult> WebDataService::GetWebAppImagesImpl( |
473 const GURL& app_url, WebDatabase* db) { | 397 const GURL& app_url, WebDatabase* db) { |
474 WDAppImagesResult result; | 398 WDAppImagesResult result; |
475 result.has_all_images = db->GetWebAppsTable()->GetWebAppHasAllImages(app_url); | 399 result.has_all_images = |
476 db->GetWebAppsTable()->GetWebAppImages(app_url, &result.images); | 400 WebAppsTable::FromWebDatabase(db)->GetWebAppHasAllImages(app_url); |
| 401 WebAppsTable::FromWebDatabase(db)->GetWebAppImages(app_url, &result.images); |
477 return scoped_ptr<WDTypedResult>( | 402 return scoped_ptr<WDTypedResult>( |
478 new WDResult<WDAppImagesResult>(WEB_APP_IMAGES, result)); | 403 new WDResult<WDAppImagesResult>(WEB_APP_IMAGES, result)); |
479 } | 404 } |
480 | 405 |
481 //////////////////////////////////////////////////////////////////////////////// | 406 //////////////////////////////////////////////////////////////////////////////// |
482 // | 407 // |
483 // Token Service implementation. | 408 // Token Service implementation. |
484 // | 409 // |
485 //////////////////////////////////////////////////////////////////////////////// | 410 //////////////////////////////////////////////////////////////////////////////// |
486 | 411 |
487 WebDatabase::State WebDataService::RemoveAllTokensImpl(WebDatabase* db) { | 412 WebDatabase::State WebDataService::RemoveAllTokensImpl(WebDatabase* db) { |
488 if (db->GetTokenServiceTable()->RemoveAllTokens()) { | 413 if (TokenServiceTable::FromWebDatabase(db)->RemoveAllTokens()) { |
489 return WebDatabase::COMMIT_NEEDED; | 414 return WebDatabase::COMMIT_NEEDED; |
490 } | 415 } |
491 return WebDatabase::COMMIT_NOT_NEEDED; | 416 return WebDatabase::COMMIT_NOT_NEEDED; |
492 } | 417 } |
493 | 418 |
494 WebDatabase::State WebDataService::SetTokenForServiceImpl( | 419 WebDatabase::State WebDataService::SetTokenForServiceImpl( |
495 const std::string& service, const std::string& token, WebDatabase* db) { | 420 const std::string& service, const std::string& token, WebDatabase* db) { |
496 if (db->GetTokenServiceTable()->SetTokenForService(service, token)) { | 421 if (TokenServiceTable::FromWebDatabase(db)->SetTokenForService(service, |
| 422 token)) { |
497 return WebDatabase::COMMIT_NEEDED; | 423 return WebDatabase::COMMIT_NEEDED; |
498 } | 424 } |
499 return WebDatabase::COMMIT_NOT_NEEDED; | 425 return WebDatabase::COMMIT_NOT_NEEDED; |
500 } | 426 } |
501 | 427 |
502 scoped_ptr<WDTypedResult> WebDataService::GetAllTokensImpl(WebDatabase* db) { | 428 scoped_ptr<WDTypedResult> WebDataService::GetAllTokensImpl(WebDatabase* db) { |
503 std::map<std::string, std::string> map; | 429 std::map<std::string, std::string> map; |
504 db->GetTokenServiceTable()->GetAllTokens(&map); | 430 TokenServiceTable::FromWebDatabase(db)->GetAllTokens(&map); |
505 return scoped_ptr<WDTypedResult>( | 431 return scoped_ptr<WDTypedResult>( |
506 new WDResult<std::map<std::string, std::string> >(TOKEN_RESULT, map)); | 432 new WDResult<std::map<std::string, std::string> >(TOKEN_RESULT, map)); |
507 } | 433 } |
508 | 434 |
509 //////////////////////////////////////////////////////////////////////////////// | 435 //////////////////////////////////////////////////////////////////////////////// |
510 // | 436 // |
511 // Autofill implementation. | 437 // Autofill implementation. |
512 // | 438 // |
513 //////////////////////////////////////////////////////////////////////////////// | 439 //////////////////////////////////////////////////////////////////////////////// |
514 | 440 |
515 WebDatabase::State WebDataService::AddFormElementsImpl( | 441 WebDatabase::State WebDataService::AddFormElementsImpl( |
516 const std::vector<FormFieldData>& fields, WebDatabase* db) { | 442 const std::vector<FormFieldData>& fields, WebDatabase* db) { |
517 AutofillChangeList changes; | 443 AutofillChangeList changes; |
518 if (!db->GetAutofillTable()->AddFormFieldValues(fields, &changes)) { | 444 if (!AutofillTable::FromWebDatabase(db)->AddFormFieldValues( |
| 445 fields, &changes)) { |
519 NOTREACHED(); | 446 NOTREACHED(); |
520 return WebDatabase::COMMIT_NOT_NEEDED; | 447 return WebDatabase::COMMIT_NOT_NEEDED; |
521 } | 448 } |
522 | 449 |
523 // Post the notifications including the list of affected keys. | 450 // Post the notifications including the list of affected keys. |
524 // This is sent here so that work resulting from this notification will be | 451 // This is sent here so that work resulting from this notification will be |
525 // done on the DB thread, and not the UI thread. | 452 // done on the DB thread, and not the UI thread. |
526 content::NotificationService::current()->Notify( | 453 content::NotificationService::current()->Notify( |
527 chrome::NOTIFICATION_AUTOFILL_ENTRIES_CHANGED, | 454 chrome::NOTIFICATION_AUTOFILL_ENTRIES_CHANGED, |
528 content::Source<WebDataService>(this), | 455 content::Source<WebDataService>(this), |
529 content::Details<AutofillChangeList>(&changes)); | 456 content::Details<AutofillChangeList>(&changes)); |
530 | 457 |
531 return WebDatabase::COMMIT_NEEDED; | 458 return WebDatabase::COMMIT_NEEDED; |
532 } | 459 } |
533 | 460 |
534 scoped_ptr<WDTypedResult> WebDataService::GetFormValuesForElementNameImpl( | 461 scoped_ptr<WDTypedResult> WebDataService::GetFormValuesForElementNameImpl( |
535 const string16& name, const string16& prefix, int limit, WebDatabase* db) { | 462 const string16& name, const string16& prefix, int limit, WebDatabase* db) { |
536 std::vector<string16> values; | 463 std::vector<string16> values; |
537 db->GetAutofillTable()->GetFormValuesForElementName( | 464 AutofillTable::FromWebDatabase(db)->GetFormValuesForElementName( |
538 name, prefix, &values, limit); | 465 name, prefix, &values, limit); |
539 return scoped_ptr<WDTypedResult>( | 466 return scoped_ptr<WDTypedResult>( |
540 new WDResult<std::vector<string16> >(AUTOFILL_VALUE_RESULT, values)); | 467 new WDResult<std::vector<string16> >(AUTOFILL_VALUE_RESULT, values)); |
541 } | 468 } |
542 | 469 |
543 WebDatabase::State WebDataService::RemoveFormElementsAddedBetweenImpl( | 470 WebDatabase::State WebDataService::RemoveFormElementsAddedBetweenImpl( |
544 const base::Time& delete_begin, const base::Time& delete_end, | 471 const base::Time& delete_begin, const base::Time& delete_end, |
545 WebDatabase* db) { | 472 WebDatabase* db) { |
546 AutofillChangeList changes; | 473 AutofillChangeList changes; |
547 | 474 |
548 if (db->GetAutofillTable()->RemoveFormElementsAddedBetween( | 475 if (AutofillTable::FromWebDatabase(db)->RemoveFormElementsAddedBetween( |
549 delete_begin, delete_end, &changes)) { | 476 delete_begin, delete_end, &changes)) { |
550 if (!changes.empty()) { | 477 if (!changes.empty()) { |
551 // Post the notifications including the list of affected keys. | 478 // Post the notifications including the list of affected keys. |
552 // This is sent here so that work resulting from this notification | 479 // This is sent here so that work resulting from this notification |
553 // will be done on the DB thread, and not the UI thread. | 480 // will be done on the DB thread, and not the UI thread. |
554 content::NotificationService::current()->Notify( | 481 content::NotificationService::current()->Notify( |
555 chrome::NOTIFICATION_AUTOFILL_ENTRIES_CHANGED, | 482 chrome::NOTIFICATION_AUTOFILL_ENTRIES_CHANGED, |
556 content::Source<WebDataService>(this), | 483 content::Source<WebDataService>(this), |
557 content::Details<AutofillChangeList>(&changes)); | 484 content::Details<AutofillChangeList>(&changes)); |
558 } | 485 } |
559 return WebDatabase::COMMIT_NEEDED; | 486 return WebDatabase::COMMIT_NEEDED; |
560 } | 487 } |
561 return WebDatabase::COMMIT_NOT_NEEDED; | 488 return WebDatabase::COMMIT_NOT_NEEDED; |
562 } | 489 } |
563 | 490 |
564 WebDatabase::State WebDataService::RemoveExpiredFormElementsImpl( | 491 WebDatabase::State WebDataService::RemoveExpiredFormElementsImpl( |
565 WebDatabase* db) { | 492 WebDatabase* db) { |
566 AutofillChangeList changes; | 493 AutofillChangeList changes; |
567 | 494 |
568 if (db->GetAutofillTable()->RemoveExpiredFormElements(&changes)) { | 495 if (AutofillTable::FromWebDatabase(db)->RemoveExpiredFormElements(&changes)) { |
569 if (!changes.empty()) { | 496 if (!changes.empty()) { |
570 // Post the notifications including the list of affected keys. | 497 // Post the notifications including the list of affected keys. |
571 // This is sent here so that work resulting from this notification | 498 // This is sent here so that work resulting from this notification |
572 // will be done on the DB thread, and not the UI thread. | 499 // will be done on the DB thread, and not the UI thread. |
573 content::NotificationService::current()->Notify( | 500 content::NotificationService::current()->Notify( |
574 chrome::NOTIFICATION_AUTOFILL_ENTRIES_CHANGED, | 501 chrome::NOTIFICATION_AUTOFILL_ENTRIES_CHANGED, |
575 content::Source<WebDataService>(this), | 502 content::Source<WebDataService>(this), |
576 content::Details<AutofillChangeList>(&changes)); | 503 content::Details<AutofillChangeList>(&changes)); |
577 } | 504 } |
578 return WebDatabase::COMMIT_NEEDED; | 505 return WebDatabase::COMMIT_NEEDED; |
579 } | 506 } |
580 return WebDatabase::COMMIT_NOT_NEEDED; | 507 return WebDatabase::COMMIT_NOT_NEEDED; |
581 } | 508 } |
582 | 509 |
583 WebDatabase::State WebDataService::RemoveFormValueForElementNameImpl( | 510 WebDatabase::State WebDataService::RemoveFormValueForElementNameImpl( |
584 const string16& name, const string16& value, WebDatabase* db) { | 511 const string16& name, const string16& value, WebDatabase* db) { |
585 | 512 |
586 if (db->GetAutofillTable()->RemoveFormElement(name, value)) { | 513 if (AutofillTable::FromWebDatabase(db)->RemoveFormElement(name, value)) { |
587 AutofillChangeList changes; | 514 AutofillChangeList changes; |
588 changes.push_back(AutofillChange(AutofillChange::REMOVE, | 515 changes.push_back(AutofillChange(AutofillChange::REMOVE, |
589 AutofillKey(name, value))); | 516 AutofillKey(name, value))); |
590 | 517 |
591 // Post the notifications including the list of affected keys. | 518 // Post the notifications including the list of affected keys. |
592 content::NotificationService::current()->Notify( | 519 content::NotificationService::current()->Notify( |
593 chrome::NOTIFICATION_AUTOFILL_ENTRIES_CHANGED, | 520 chrome::NOTIFICATION_AUTOFILL_ENTRIES_CHANGED, |
594 content::Source<WebDataService>(this), | 521 content::Source<WebDataService>(this), |
595 content::Details<AutofillChangeList>(&changes)); | 522 content::Details<AutofillChangeList>(&changes)); |
596 | 523 |
597 return WebDatabase::COMMIT_NEEDED; | 524 return WebDatabase::COMMIT_NEEDED; |
598 } | 525 } |
599 return WebDatabase::COMMIT_NOT_NEEDED; | 526 return WebDatabase::COMMIT_NOT_NEEDED; |
600 } | 527 } |
601 | 528 |
602 WebDatabase::State WebDataService::AddAutofillProfileImpl( | 529 WebDatabase::State WebDataService::AddAutofillProfileImpl( |
603 const AutofillProfile& profile, WebDatabase* db) { | 530 const AutofillProfile& profile, WebDatabase* db) { |
604 if (!db->GetAutofillTable()->AddAutofillProfile(profile)) { | 531 if (!AutofillTable::FromWebDatabase(db)->AddAutofillProfile(profile)) { |
605 NOTREACHED(); | 532 NOTREACHED(); |
606 return WebDatabase::COMMIT_NOT_NEEDED; | 533 return WebDatabase::COMMIT_NOT_NEEDED; |
607 } | 534 } |
608 | 535 |
609 // Send GUID-based notification. | 536 // Send GUID-based notification. |
610 AutofillProfileChange change(AutofillProfileChange::ADD, | 537 AutofillProfileChange change(AutofillProfileChange::ADD, |
611 profile.guid(), &profile); | 538 profile.guid(), &profile); |
612 content::NotificationService::current()->Notify( | 539 content::NotificationService::current()->Notify( |
613 chrome::NOTIFICATION_AUTOFILL_PROFILE_CHANGED, | 540 chrome::NOTIFICATION_AUTOFILL_PROFILE_CHANGED, |
614 content::Source<WebDataService>(this), | 541 content::Source<WebDataService>(this), |
615 content::Details<AutofillProfileChange>(&change)); | 542 content::Details<AutofillProfileChange>(&change)); |
616 | 543 |
617 return WebDatabase::COMMIT_NEEDED; | 544 return WebDatabase::COMMIT_NEEDED; |
618 } | 545 } |
619 | 546 |
620 WebDatabase::State WebDataService::UpdateAutofillProfileImpl( | 547 WebDatabase::State WebDataService::UpdateAutofillProfileImpl( |
621 const AutofillProfile& profile, WebDatabase* db) { | 548 const AutofillProfile& profile, WebDatabase* db) { |
622 // Only perform the update if the profile exists. It is currently | 549 // Only perform the update if the profile exists. It is currently |
623 // valid to try to update a missing profile. We simply drop the write and | 550 // valid to try to update a missing profile. We simply drop the write and |
624 // the caller will detect this on the next refresh. | 551 // the caller will detect this on the next refresh. |
625 AutofillProfile* original_profile = NULL; | 552 AutofillProfile* original_profile = NULL; |
626 if (!db->GetAutofillTable()->GetAutofillProfile(profile.guid(), | 553 if (!AutofillTable::FromWebDatabase(db)->GetAutofillProfile(profile.guid(), |
627 &original_profile)) { | 554 &original_profile)) { |
628 return WebDatabase::COMMIT_NOT_NEEDED; | 555 return WebDatabase::COMMIT_NOT_NEEDED; |
629 } | 556 } |
630 scoped_ptr<AutofillProfile> scoped_profile(original_profile); | 557 scoped_ptr<AutofillProfile> scoped_profile(original_profile); |
631 | 558 |
632 if (!db->GetAutofillTable()->UpdateAutofillProfileMulti(profile)) { | 559 if (!AutofillTable::FromWebDatabase(db)->UpdateAutofillProfileMulti( |
| 560 profile)) { |
633 NOTREACHED(); | 561 NOTREACHED(); |
634 return WebDatabase::COMMIT_NEEDED; | 562 return WebDatabase::COMMIT_NEEDED; |
635 } | 563 } |
636 | 564 |
637 // Send GUID-based notification. | 565 // Send GUID-based notification. |
638 AutofillProfileChange change(AutofillProfileChange::UPDATE, | 566 AutofillProfileChange change(AutofillProfileChange::UPDATE, |
639 profile.guid(), &profile); | 567 profile.guid(), &profile); |
640 content::NotificationService::current()->Notify( | 568 content::NotificationService::current()->Notify( |
641 chrome::NOTIFICATION_AUTOFILL_PROFILE_CHANGED, | 569 chrome::NOTIFICATION_AUTOFILL_PROFILE_CHANGED, |
642 content::Source<WebDataService>(this), | 570 content::Source<WebDataService>(this), |
643 content::Details<AutofillProfileChange>(&change)); | 571 content::Details<AutofillProfileChange>(&change)); |
644 | 572 |
645 return WebDatabase::COMMIT_NEEDED; | 573 return WebDatabase::COMMIT_NEEDED; |
646 } | 574 } |
647 | 575 |
648 WebDatabase::State WebDataService::RemoveAutofillProfileImpl( | 576 WebDatabase::State WebDataService::RemoveAutofillProfileImpl( |
649 const std::string& guid, WebDatabase* db) { | 577 const std::string& guid, WebDatabase* db) { |
650 AutofillProfile* profile = NULL; | 578 AutofillProfile* profile = NULL; |
651 if (!db->GetAutofillTable()->GetAutofillProfile(guid, &profile)) { | 579 if (!AutofillTable::FromWebDatabase(db)->GetAutofillProfile(guid, &profile)) { |
652 NOTREACHED(); | 580 NOTREACHED(); |
653 return WebDatabase::COMMIT_NOT_NEEDED; | 581 return WebDatabase::COMMIT_NOT_NEEDED; |
654 } | 582 } |
655 scoped_ptr<AutofillProfile> scoped_profile(profile); | 583 scoped_ptr<AutofillProfile> scoped_profile(profile); |
656 | 584 |
657 if (!db->GetAutofillTable()->RemoveAutofillProfile(guid)) { | 585 if (!AutofillTable::FromWebDatabase(db)->RemoveAutofillProfile(guid)) { |
658 NOTREACHED(); | 586 NOTREACHED(); |
659 return WebDatabase::COMMIT_NOT_NEEDED; | 587 return WebDatabase::COMMIT_NOT_NEEDED; |
660 } | 588 } |
661 | 589 |
662 // Send GUID-based notification. | 590 // Send GUID-based notification. |
663 AutofillProfileChange change(AutofillProfileChange::REMOVE, guid, NULL); | 591 AutofillProfileChange change(AutofillProfileChange::REMOVE, guid, NULL); |
664 content::NotificationService::current()->Notify( | 592 content::NotificationService::current()->Notify( |
665 chrome::NOTIFICATION_AUTOFILL_PROFILE_CHANGED, | 593 chrome::NOTIFICATION_AUTOFILL_PROFILE_CHANGED, |
666 content::Source<WebDataService>(this), | 594 content::Source<WebDataService>(this), |
667 content::Details<AutofillProfileChange>(&change)); | 595 content::Details<AutofillProfileChange>(&change)); |
668 | 596 |
669 return WebDatabase::COMMIT_NEEDED; | 597 return WebDatabase::COMMIT_NEEDED; |
670 } | 598 } |
671 | 599 |
672 scoped_ptr<WDTypedResult> WebDataService::GetAutofillProfilesImpl( | 600 scoped_ptr<WDTypedResult> WebDataService::GetAutofillProfilesImpl( |
673 WebDatabase* db) { | 601 WebDatabase* db) { |
674 std::vector<AutofillProfile*> profiles; | 602 std::vector<AutofillProfile*> profiles; |
675 db->GetAutofillTable()->GetAutofillProfiles(&profiles); | 603 AutofillTable::FromWebDatabase(db)->GetAutofillProfiles(&profiles); |
676 return scoped_ptr<WDTypedResult>( | 604 return scoped_ptr<WDTypedResult>( |
677 new WDDestroyableResult<std::vector<AutofillProfile*> >( | 605 new WDDestroyableResult<std::vector<AutofillProfile*> >( |
678 AUTOFILL_PROFILES_RESULT, | 606 AUTOFILL_PROFILES_RESULT, |
679 profiles, | 607 profiles, |
680 base::Bind(&WebDataService::DestroyAutofillProfileResult, | 608 base::Bind(&WebDataService::DestroyAutofillProfileResult, |
681 base::Unretained(this)))); | 609 base::Unretained(this)))); |
682 } | 610 } |
683 | 611 |
684 WebDatabase::State WebDataService::AddCreditCardImpl( | 612 WebDatabase::State WebDataService::AddCreditCardImpl( |
685 const CreditCard& credit_card, WebDatabase* db) { | 613 const CreditCard& credit_card, WebDatabase* db) { |
686 if (!db->GetAutofillTable()->AddCreditCard(credit_card)) { | 614 if (!AutofillTable::FromWebDatabase(db)->AddCreditCard(credit_card)) { |
687 NOTREACHED(); | 615 NOTREACHED(); |
688 return WebDatabase::COMMIT_NOT_NEEDED; | 616 return WebDatabase::COMMIT_NOT_NEEDED; |
689 } | 617 } |
690 | 618 |
691 return WebDatabase::COMMIT_NEEDED; | 619 return WebDatabase::COMMIT_NEEDED; |
692 } | 620 } |
693 | 621 |
694 WebDatabase::State WebDataService::UpdateCreditCardImpl( | 622 WebDatabase::State WebDataService::UpdateCreditCardImpl( |
695 const CreditCard& credit_card, WebDatabase* db) { | 623 const CreditCard& credit_card, WebDatabase* db) { |
696 // It is currently valid to try to update a missing profile. We simply drop | 624 // It is currently valid to try to update a missing profile. We simply drop |
697 // the write and the caller will detect this on the next refresh. | 625 // the write and the caller will detect this on the next refresh. |
698 CreditCard* original_credit_card = NULL; | 626 CreditCard* original_credit_card = NULL; |
699 if (!db->GetAutofillTable()->GetCreditCard(credit_card.guid(), | 627 if (!AutofillTable::FromWebDatabase(db)->GetCreditCard(credit_card.guid(), |
700 &original_credit_card)) { | 628 &original_credit_card)) { |
701 return WebDatabase::COMMIT_NOT_NEEDED; | 629 return WebDatabase::COMMIT_NOT_NEEDED; |
702 } | 630 } |
703 scoped_ptr<CreditCard> scoped_credit_card(original_credit_card); | 631 scoped_ptr<CreditCard> scoped_credit_card(original_credit_card); |
704 | 632 |
705 if (!db->GetAutofillTable()->UpdateCreditCard(credit_card)) { | 633 if (!AutofillTable::FromWebDatabase(db)->UpdateCreditCard(credit_card)) { |
706 NOTREACHED(); | 634 NOTREACHED(); |
707 return WebDatabase::COMMIT_NOT_NEEDED; | 635 return WebDatabase::COMMIT_NOT_NEEDED; |
708 } | 636 } |
709 return WebDatabase::COMMIT_NEEDED; | 637 return WebDatabase::COMMIT_NEEDED; |
710 } | 638 } |
711 | 639 |
712 WebDatabase::State WebDataService::RemoveCreditCardImpl( | 640 WebDatabase::State WebDataService::RemoveCreditCardImpl( |
713 const std::string& guid, WebDatabase* db) { | 641 const std::string& guid, WebDatabase* db) { |
714 if (!db->GetAutofillTable()->RemoveCreditCard(guid)) { | 642 if (!AutofillTable::FromWebDatabase(db)->RemoveCreditCard(guid)) { |
715 NOTREACHED(); | 643 NOTREACHED(); |
716 return WebDatabase::COMMIT_NOT_NEEDED; | 644 return WebDatabase::COMMIT_NOT_NEEDED; |
717 } | 645 } |
718 return WebDatabase::COMMIT_NEEDED; | 646 return WebDatabase::COMMIT_NEEDED; |
719 } | 647 } |
720 | 648 |
721 scoped_ptr<WDTypedResult> WebDataService::GetCreditCardsImpl(WebDatabase* db) { | 649 scoped_ptr<WDTypedResult> WebDataService::GetCreditCardsImpl(WebDatabase* db) { |
722 std::vector<CreditCard*> credit_cards; | 650 std::vector<CreditCard*> credit_cards; |
723 db->GetAutofillTable()->GetCreditCards(&credit_cards); | 651 AutofillTable::FromWebDatabase(db)->GetCreditCards(&credit_cards); |
724 return scoped_ptr<WDTypedResult>( | 652 return scoped_ptr<WDTypedResult>( |
725 new WDDestroyableResult<std::vector<CreditCard*> >( | 653 new WDDestroyableResult<std::vector<CreditCard*> >( |
726 AUTOFILL_CREDITCARDS_RESULT, | 654 AUTOFILL_CREDITCARDS_RESULT, |
727 credit_cards, | 655 credit_cards, |
728 base::Bind(&WebDataService::DestroyAutofillCreditCardResult, | 656 base::Bind(&WebDataService::DestroyAutofillCreditCardResult, |
729 base::Unretained(this)))); | 657 base::Unretained(this)))); |
730 } | 658 } |
731 | 659 |
732 WebDatabase::State | 660 WebDatabase::State |
733 WebDataService::RemoveAutofillProfilesAndCreditCardsModifiedBetweenImpl( | 661 WebDataService::RemoveAutofillProfilesAndCreditCardsModifiedBetweenImpl( |
734 const base::Time& delete_begin, const base::Time& delete_end, | 662 const base::Time& delete_begin, const base::Time& delete_end, |
735 WebDatabase* db) { | 663 WebDatabase* db) { |
736 std::vector<std::string> profile_guids; | 664 std::vector<std::string> profile_guids; |
737 std::vector<std::string> credit_card_guids; | 665 std::vector<std::string> credit_card_guids; |
738 if (db->GetAutofillTable()-> | 666 if (AutofillTable::FromWebDatabase(db)-> |
739 RemoveAutofillProfilesAndCreditCardsModifiedBetween( | 667 RemoveAutofillProfilesAndCreditCardsModifiedBetween( |
740 delete_begin, | 668 delete_begin, |
741 delete_end, | 669 delete_end, |
742 &profile_guids, | 670 &profile_guids, |
743 &credit_card_guids)) { | 671 &credit_card_guids)) { |
744 for (std::vector<std::string>::iterator iter = profile_guids.begin(); | 672 for (std::vector<std::string>::iterator iter = profile_guids.begin(); |
745 iter != profile_guids.end(); ++iter) { | 673 iter != profile_guids.end(); ++iter) { |
746 AutofillProfileChange change(AutofillProfileChange::REMOVE, *iter, | 674 AutofillProfileChange change(AutofillProfileChange::REMOVE, *iter, |
747 NULL); | 675 NULL); |
748 content::NotificationService::current()->Notify( | 676 content::NotificationService::current()->Notify( |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
783 | 711 |
784 void WebDataService::DestroyAutofillCreditCardResult( | 712 void WebDataService::DestroyAutofillCreditCardResult( |
785 const WDTypedResult* result) { | 713 const WDTypedResult* result) { |
786 DCHECK(result->GetType() == AUTOFILL_CREDITCARDS_RESULT); | 714 DCHECK(result->GetType() == AUTOFILL_CREDITCARDS_RESULT); |
787 const WDResult<std::vector<CreditCard*> >* r = | 715 const WDResult<std::vector<CreditCard*> >* r = |
788 static_cast<const WDResult<std::vector<CreditCard*> >*>(result); | 716 static_cast<const WDResult<std::vector<CreditCard*> >*>(result); |
789 | 717 |
790 std::vector<CreditCard*> credit_cards = r->GetValue(); | 718 std::vector<CreditCard*> credit_cards = r->GetValue(); |
791 STLDeleteElements(&credit_cards); | 719 STLDeleteElements(&credit_cards); |
792 } | 720 } |
OLD | NEW |