OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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" | 7 #include "base/bind.h" |
8 #include "base/message_loop.h" | 8 #include "base/message_loop.h" |
9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" |
10 #include "base/threading/thread.h" | 10 #include "base/threading/thread.h" |
11 #include "chrome/browser/autofill/autofill_profile.h" | 11 #include "chrome/browser/autofill/autofill_profile.h" |
12 #include "chrome/browser/autofill/credit_card.h" | 12 #include "chrome/browser/autofill/credit_card.h" |
13 #include "chrome/browser/profiles/profile.h" | 13 #include "chrome/browser/profiles/profile.h" |
14 #include "chrome/browser/search_engines/template_url.h" | 14 #include "chrome/browser/search_engines/template_url.h" |
15 #include "chrome/browser/ui/profile_error_dialog.h" | 15 #include "chrome/browser/ui/profile_error_dialog.h" |
16 #include "chrome/browser/webdata/autofill_change.h" | 16 #include "chrome/browser/webdata/autofill_change.h" |
17 #include "chrome/browser/webdata/autofill_entry.h" | 17 #include "chrome/browser/webdata/autofill_entry.h" |
| 18 #include "chrome/browser/webdata/autofill_profile_syncable_service.h" |
18 #include "chrome/browser/webdata/autofill_table.h" | 19 #include "chrome/browser/webdata/autofill_table.h" |
19 #include "chrome/browser/webdata/keyword_table.h" | 20 #include "chrome/browser/webdata/keyword_table.h" |
20 #include "chrome/browser/webdata/logins_table.h" | 21 #include "chrome/browser/webdata/logins_table.h" |
21 #include "chrome/browser/webdata/token_service_table.h" | 22 #include "chrome/browser/webdata/token_service_table.h" |
22 #include "chrome/browser/webdata/web_apps_table.h" | 23 #include "chrome/browser/webdata/web_apps_table.h" |
23 #include "chrome/browser/webdata/web_intents_table.h" | 24 #include "chrome/browser/webdata/web_intents_table.h" |
24 #include "chrome/browser/webdata/web_database.h" | 25 #include "chrome/browser/webdata/web_database.h" |
25 #include "chrome/common/chrome_constants.h" | 26 #include "chrome/common/chrome_constants.h" |
26 #include "chrome/common/chrome_notification_types.h" | 27 #include "chrome/common/chrome_notification_types.h" |
27 #include "content/common/notification_details.h" | 28 #include "content/common/notification_details.h" |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
67 WDKeywordsResult::WDKeywordsResult() | 68 WDKeywordsResult::WDKeywordsResult() |
68 : default_search_provider_id(0), | 69 : default_search_provider_id(0), |
69 builtin_keyword_version(0) { | 70 builtin_keyword_version(0) { |
70 } | 71 } |
71 | 72 |
72 WDKeywordsResult::~WDKeywordsResult() {} | 73 WDKeywordsResult::~WDKeywordsResult() {} |
73 | 74 |
74 WebDataService::WebDataService() | 75 WebDataService::WebDataService() |
75 : is_running_(false), | 76 : is_running_(false), |
76 db_(NULL), | 77 db_(NULL), |
| 78 autofill_profile_syncable_service_(NULL), |
77 failed_init_(false), | 79 failed_init_(false), |
78 should_commit_(false), | 80 should_commit_(false), |
79 next_request_handle_(1), | 81 next_request_handle_(1), |
80 main_loop_(MessageLoop::current()) { | 82 main_loop_(MessageLoop::current()) { |
81 } | 83 } |
82 | 84 |
83 // static | 85 // static |
84 void WebDataService::NotifyOfMultipleAutofillChanges( | 86 void WebDataService::NotifyOfMultipleAutofillChanges( |
85 WebDataService* web_data_service) { | 87 WebDataService* web_data_service) { |
86 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); | 88 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); |
87 | 89 |
88 if (!web_data_service) | 90 if (!web_data_service) |
89 return; | 91 return; |
90 | 92 |
91 BrowserThread::PostTask( | 93 BrowserThread::PostTask( |
92 BrowserThread::UI, FROM_HERE, | 94 BrowserThread::UI, FROM_HERE, |
93 Bind(&NotifyOfMultipleAutofillChangesTask, | 95 Bind(&NotifyOfMultipleAutofillChangesTask, |
94 make_scoped_refptr(web_data_service))); | 96 make_scoped_refptr(web_data_service))); |
95 } | 97 } |
96 | 98 |
97 bool WebDataService::Init(const FilePath& profile_path) { | 99 bool WebDataService::Init(const FilePath& profile_path) { |
98 FilePath path = profile_path; | 100 FilePath path = profile_path; |
99 path = path.Append(chrome::kWebDataFilename); | 101 path = path.Append(chrome::kWebDataFilename); |
100 return InitWithPath(path); | 102 return InitWithPath(path); |
101 } | 103 } |
102 | 104 |
103 void WebDataService::Shutdown() { | 105 void WebDataService::Shutdown() { |
| 106 ScheduleTask(Bind(&WebDataService::ShutdownSyncableServices, this)); |
104 UnloadDatabase(); | 107 UnloadDatabase(); |
105 } | 108 } |
106 | 109 |
107 bool WebDataService::IsRunning() const { | 110 bool WebDataService::IsRunning() const { |
108 return is_running_; | 111 return is_running_; |
109 } | 112 } |
110 | 113 |
111 void WebDataService::UnloadDatabase() { | 114 void WebDataService::UnloadDatabase() { |
112 ScheduleTask(Bind(&WebDataService::ShutdownDatabase, this)); | 115 ScheduleTask(Bind(&WebDataService::ShutdownDatabase, this)); |
113 } | 116 } |
(...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
531 WebDataService::~WebDataService() { | 534 WebDataService::~WebDataService() { |
532 if (is_running_ && db_) { | 535 if (is_running_ && db_) { |
533 DLOG_ASSERT("WebDataService dtor called without Shutdown"); | 536 DLOG_ASSERT("WebDataService dtor called without Shutdown"); |
534 } | 537 } |
535 } | 538 } |
536 | 539 |
537 bool WebDataService::InitWithPath(const FilePath& path) { | 540 bool WebDataService::InitWithPath(const FilePath& path) { |
538 path_ = path; | 541 path_ = path; |
539 is_running_ = true; | 542 is_running_ = true; |
540 ScheduleTask(Bind(&WebDataService::InitializeDatabaseIfNecessary, this)); | 543 ScheduleTask(Bind(&WebDataService::InitializeDatabaseIfNecessary, this)); |
| 544 ScheduleTask(Bind(&WebDataService::InitializeSyncableServices, this)); |
541 return true; | 545 return true; |
542 } | 546 } |
543 | 547 |
544 void WebDataService::RequestCompleted(Handle h) { | 548 void WebDataService::RequestCompleted(Handle h) { |
545 pending_lock_.Acquire(); | 549 pending_lock_.Acquire(); |
546 RequestMap::iterator i = pending_requests_.find(h); | 550 RequestMap::iterator i = pending_requests_.find(h); |
547 if (i == pending_requests_.end()) { | 551 if (i == pending_requests_.end()) { |
548 NOTREACHED() << "Request completed called for an unknown request"; | 552 NOTREACHED() << "Request completed called for an unknown request"; |
549 pending_lock_.Release(); | 553 pending_lock_.Release(); |
550 return; | 554 return; |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
621 } | 625 } |
622 | 626 |
623 BrowserThread::PostTask( | 627 BrowserThread::PostTask( |
624 BrowserThread::UI, FROM_HERE, | 628 BrowserThread::UI, FROM_HERE, |
625 NewRunnableMethod(this, &WebDataService::NotifyDatabaseLoadedOnUIThread)); | 629 NewRunnableMethod(this, &WebDataService::NotifyDatabaseLoadedOnUIThread)); |
626 | 630 |
627 db_ = db; | 631 db_ = db; |
628 db_->BeginTransaction(); | 632 db_->BeginTransaction(); |
629 } | 633 } |
630 | 634 |
| 635 void WebDataService::InitializeSyncableServices() { |
| 636 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); |
| 637 DCHECK(!autofill_profile_syncable_service_); |
| 638 |
| 639 autofill_profile_syncable_service_ = new AutofillProfileSyncableService(this); |
| 640 } |
| 641 |
631 void WebDataService::NotifyDatabaseLoadedOnUIThread() { | 642 void WebDataService::NotifyDatabaseLoadedOnUIThread() { |
632 // Notify that the database has been initialized. | 643 // Notify that the database has been initialized. |
633 NotificationService::current()->Notify( | 644 NotificationService::current()->Notify( |
634 chrome::NOTIFICATION_WEB_DATABASE_LOADED, Source<WebDataService>(this), | 645 chrome::NOTIFICATION_WEB_DATABASE_LOADED, Source<WebDataService>(this), |
635 NotificationService::NoDetails()); | 646 NotificationService::NoDetails()); |
636 } | 647 } |
637 | 648 |
638 void WebDataService::ShutdownDatabase() { | 649 void WebDataService::ShutdownDatabase() { |
639 should_commit_ = false; | 650 should_commit_ = false; |
640 | 651 |
641 if (db_) { | 652 if (db_) { |
642 db_->CommitTransaction(); | 653 db_->CommitTransaction(); |
643 delete db_; | 654 delete db_; |
644 db_ = NULL; | 655 db_ = NULL; |
645 } | 656 } |
646 } | 657 } |
647 | 658 |
| 659 void WebDataService::ShutdownSyncableServices() { |
| 660 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); |
| 661 |
| 662 delete autofill_profile_syncable_service_; |
| 663 autofill_profile_syncable_service_ = NULL; |
| 664 } |
| 665 |
648 void WebDataService::Commit() { | 666 void WebDataService::Commit() { |
649 if (should_commit_) { | 667 if (should_commit_) { |
650 should_commit_ = false; | 668 should_commit_ = false; |
651 | 669 |
652 if (db_) { | 670 if (db_) { |
653 db_->CommitTransaction(); | 671 db_->CommitTransaction(); |
654 db_->BeginTransaction(); | 672 db_->BeginTransaction(); |
655 } | 673 } |
656 } | 674 } |
657 } | 675 } |
(...skipping 695 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1353 Details<AutofillCreditCardChange>(&change)); | 1371 Details<AutofillCreditCardChange>(&change)); |
1354 } | 1372 } |
1355 // Note: It is the caller's responsibility to post notifications for any | 1373 // Note: It is the caller's responsibility to post notifications for any |
1356 // changes, e.g. by calling the Refresh() method of PersonalDataManager. | 1374 // changes, e.g. by calling the Refresh() method of PersonalDataManager. |
1357 ScheduleCommit(); | 1375 ScheduleCommit(); |
1358 } | 1376 } |
1359 } | 1377 } |
1360 request->RequestComplete(); | 1378 request->RequestComplete(); |
1361 } | 1379 } |
1362 | 1380 |
| 1381 AutofillProfileSyncableService* |
| 1382 WebDataService::GetAutofillProfileSyncableService() const { |
| 1383 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); |
| 1384 DCHECK(autofill_profile_syncable_service_); // Make sure we're initialized. |
| 1385 |
| 1386 return autofill_profile_syncable_service_; |
| 1387 } |
| 1388 |
1363 //////////////////////////////////////////////////////////////////////////////// | 1389 //////////////////////////////////////////////////////////////////////////////// |
1364 // | 1390 // |
1365 // WebDataRequest implementation. | 1391 // WebDataRequest implementation. |
1366 // | 1392 // |
1367 //////////////////////////////////////////////////////////////////////////////// | 1393 //////////////////////////////////////////////////////////////////////////////// |
1368 | 1394 |
1369 WebDataService::WebDataRequest::WebDataRequest(WebDataService* service, | 1395 WebDataService::WebDataRequest::WebDataRequest(WebDataService* service, |
1370 Handle handle, | 1396 Handle handle, |
1371 WebDataServiceConsumer* consumer) | 1397 WebDataServiceConsumer* consumer) |
1372 : service_(service), | 1398 : service_(service), |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1404 } | 1430 } |
1405 | 1431 |
1406 const WDTypedResult* WebDataService::WebDataRequest::GetResult() const { | 1432 const WDTypedResult* WebDataService::WebDataRequest::GetResult() const { |
1407 return result_; | 1433 return result_; |
1408 } | 1434 } |
1409 | 1435 |
1410 void WebDataService::WebDataRequest::RequestComplete() { | 1436 void WebDataService::WebDataRequest::RequestComplete() { |
1411 message_loop_->PostTask(FROM_HERE, Bind(&WebDataService::RequestCompleted, | 1437 message_loop_->PostTask(FROM_HERE, Bind(&WebDataService::RequestCompleted, |
1412 service_.get(), handle_)); | 1438 service_.get(), handle_)); |
1413 } | 1439 } |
OLD | NEW |