| Index: chrome/browser/webdata/web_data_service.cc
|
| diff --git a/chrome/browser/webdata/web_data_service.cc b/chrome/browser/webdata/web_data_service.cc
|
| index c5976afa88b2e9b76bb6dc4e820a091f7511ad6c..edf882768248bb8724985558d5f3d5fe39f33394 100644
|
| --- a/chrome/browser/webdata/web_data_service.cc
|
| +++ b/chrome/browser/webdata/web_data_service.cc
|
| @@ -22,7 +22,7 @@
|
| #include "chrome/browser/webdata/logins_table.h"
|
| #include "chrome/browser/webdata/token_service_table.h"
|
| #include "chrome/browser/webdata/web_apps_table.h"
|
| -#include "chrome/browser/webdata/web_database.h"
|
| +#include "chrome/browser/webdata/web_database_service.h"
|
| #include "chrome/browser/webdata/web_intents_table.h"
|
| #include "chrome/common/chrome_constants.h"
|
| #include "chrome/common/chrome_notification_types.h"
|
| @@ -78,15 +78,9 @@ WDKeywordsResult::WDKeywordsResult()
|
| WDKeywordsResult::~WDKeywordsResult() {}
|
|
|
| WebDataService::WebDataService()
|
| - : is_running_(false),
|
| - db_(NULL),
|
| - request_manager_(new WebDataRequestManager()),
|
| - app_locale_(AutofillCountry::ApplicationLocale()),
|
| + : db_loaded_(false),
|
| autocomplete_syncable_service_(NULL),
|
| - autofill_profile_syncable_service_(NULL),
|
| - failed_init_(false),
|
| - should_commit_(false),
|
| - main_loop_(MessageLoop::current()) {
|
| + autofill_profile_syncable_service_(NULL) {
|
| // WebDataService requires DB thread if instantiated.
|
| // Set WebDataServiceFactory::GetInstance()->SetTestingFactory(&profile, NULL)
|
| // if you do not want to instantiate WebDataService in your test.
|
| @@ -108,27 +102,36 @@ void WebDataService::NotifyOfMultipleAutofillChanges(
|
| }
|
|
|
| void WebDataService::ShutdownOnUIThread() {
|
| - ScheduleTask(FROM_HERE,
|
| - Bind(&WebDataService::ShutdownSyncableServices, this));
|
| - UnloadDatabase();
|
| + db_loaded_ = false;
|
| + ShutdownDatabase();
|
| + BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
|
| + Bind(&WebDataService::ShutdownSyncableServices, this));
|
| }
|
|
|
| -bool WebDataService::Init(const base::FilePath& profile_path) {
|
| - base::FilePath path = profile_path;
|
| - path = path.Append(chrome::kWebDataFilename);
|
| - return InitWithPath(path);
|
| -}
|
| +void WebDataService::Init(const base::FilePath& path) {
|
| + wdbs_.reset(new WebDatabaseService(path));
|
| + wdbs_->LoadDatabase(Bind(&WebDataService::DatabaseInitOnDB, this));
|
|
|
| -bool WebDataService::IsRunning() const {
|
| - return is_running_;
|
| + BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
|
| + Bind(&WebDataService::InitializeSyncableServices, this));
|
| }
|
|
|
| void WebDataService::UnloadDatabase() {
|
| - ScheduleTask(FROM_HERE, Bind(&WebDataService::ShutdownDatabase, this));
|
| + if (!wdbs_)
|
| + return;
|
| + wdbs_->UnloadDatabase();
|
| +}
|
| +
|
| +void WebDataService::ShutdownDatabase() {
|
| + if (!wdbs_)
|
| + return;
|
| + wdbs_->ShutdownDatabase();
|
| }
|
|
|
| void WebDataService::CancelRequest(Handle h) {
|
| - request_manager_->CancelRequest(h);
|
| + if (!wdbs_)
|
| + return;
|
| + wdbs_->CancelRequest(h);
|
| }
|
|
|
| content::NotificationSource WebDataService::GetNotificationSource() {
|
| @@ -136,12 +139,13 @@ content::NotificationSource WebDataService::GetNotificationSource() {
|
| }
|
|
|
| bool WebDataService::IsDatabaseLoaded() {
|
| - return db_ != NULL;
|
| + return db_loaded_;
|
| }
|
|
|
| WebDatabase* WebDataService::GetDatabase() {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
|
| - return db_;
|
| + if (!wdbs_)
|
| + return NULL;
|
| + return wdbs_->GetDatabaseOnDB();
|
| }
|
|
|
| //////////////////////////////////////////////////////////////////////////////
|
| @@ -151,34 +155,34 @@ WebDatabase* WebDataService::GetDatabase() {
|
| //////////////////////////////////////////////////////////////////////////////
|
|
|
| void WebDataService::AddKeyword(const TemplateURLData& data) {
|
| - ScheduleDBTask(
|
| + wdbs_->ScheduleDBTask(
|
| FROM_HERE, Bind(&WebDataService::AddKeywordImpl, this, data));
|
| }
|
|
|
| void WebDataService::RemoveKeyword(TemplateURLID id) {
|
| - ScheduleDBTask(
|
| + wdbs_->ScheduleDBTask(
|
| FROM_HERE, Bind(&WebDataService::RemoveKeywordImpl, this, id));
|
| }
|
|
|
| void WebDataService::UpdateKeyword(const TemplateURLData& data) {
|
| - ScheduleDBTask(
|
| + wdbs_->ScheduleDBTask(
|
| FROM_HERE, Bind(&WebDataService::UpdateKeywordImpl, this, data));
|
| }
|
|
|
| WebDataService::Handle WebDataService::GetKeywords(
|
| WebDataServiceConsumer* consumer) {
|
| - return ScheduleDBTaskWithResult(FROM_HERE,
|
| + return wdbs_->ScheduleDBTaskWithResult(FROM_HERE,
|
| Bind(&WebDataService::GetKeywordsImpl, this), consumer);
|
| }
|
|
|
| void WebDataService::SetDefaultSearchProvider(const TemplateURL* url) {
|
| - ScheduleDBTask(FROM_HERE,
|
| + wdbs_->ScheduleDBTask(FROM_HERE,
|
| Bind(&WebDataService::SetDefaultSearchProviderImpl, this,
|
| url ? url->id() : 0));
|
| }
|
|
|
| void WebDataService::SetBuiltinKeywordVersion(int version) {
|
| - ScheduleDBTask(FROM_HERE,
|
| + wdbs_->ScheduleDBTask(FROM_HERE,
|
| Bind(&WebDataService::SetBuiltinKeywordVersionImpl, this, version));
|
| }
|
|
|
| @@ -190,26 +194,25 @@ void WebDataService::SetBuiltinKeywordVersion(int version) {
|
|
|
| void WebDataService::SetWebAppImage(const GURL& app_url,
|
| const SkBitmap& image) {
|
| - ScheduleDBTask(FROM_HERE,
|
| + wdbs_->ScheduleDBTask(FROM_HERE,
|
| Bind(&WebDataService::SetWebAppImageImpl, this, app_url, image));
|
| }
|
|
|
| void WebDataService::SetWebAppHasAllImages(const GURL& app_url,
|
| bool has_all_images) {
|
| - ScheduleDBTask(FROM_HERE,
|
| + wdbs_->ScheduleDBTask(FROM_HERE,
|
| Bind(&WebDataService::SetWebAppHasAllImagesImpl, this, app_url,
|
| has_all_images));
|
| }
|
|
|
| void WebDataService::RemoveWebApp(const GURL& app_url) {
|
| - ScheduleDBTask(FROM_HERE,
|
| + wdbs_->ScheduleDBTask(FROM_HERE,
|
| Bind(&WebDataService::RemoveWebAppImpl, this, app_url));
|
| }
|
|
|
| WebDataService::Handle WebDataService::GetWebAppImages(
|
| - const GURL& app_url,
|
| - WebDataServiceConsumer* consumer) {
|
| - return ScheduleDBTaskWithResult(FROM_HERE,
|
| + const GURL& app_url, WebDataServiceConsumer* consumer) {
|
| + return wdbs_->ScheduleDBTaskWithResult(FROM_HERE,
|
| Bind(&WebDataService::GetWebAppImagesImpl, this, app_url), consumer);
|
| }
|
|
|
| @@ -221,18 +224,19 @@ WebDataService::Handle WebDataService::GetWebAppImages(
|
|
|
| void WebDataService::SetTokenForService(const std::string& service,
|
| const std::string& token) {
|
| - ScheduleDBTask(FROM_HERE,
|
| + wdbs_->ScheduleDBTask(FROM_HERE,
|
| Bind(&WebDataService::SetTokenForServiceImpl, this, service, token));
|
| }
|
|
|
| void WebDataService::RemoveAllTokens() {
|
| - ScheduleDBTask(FROM_HERE, Bind(&WebDataService::RemoveAllTokensImpl, this));
|
| + wdbs_->ScheduleDBTask(FROM_HERE,
|
| + Bind(&WebDataService::RemoveAllTokensImpl, this));
|
| }
|
|
|
| // Null on failure. Success is WDResult<std::string>
|
| WebDataService::Handle WebDataService::GetAllTokens(
|
| WebDataServiceConsumer* consumer) {
|
| - return ScheduleDBTaskWithResult(FROM_HERE,
|
| + return wdbs_->ScheduleDBTaskWithResult(FROM_HERE,
|
| Bind(&WebDataService::GetAllTokensImpl, this), consumer);
|
| }
|
|
|
| @@ -244,145 +248,125 @@ WebDataService::Handle WebDataService::GetAllTokens(
|
|
|
| void WebDataService::AddFormFields(
|
| const std::vector<FormFieldData>& fields) {
|
| - ScheduleDBTask(FROM_HERE,
|
| + wdbs_->ScheduleDBTask(FROM_HERE,
|
| Bind(&WebDataService::AddFormElementsImpl, this, fields));
|
| }
|
|
|
| WebDataService::Handle WebDataService::GetFormValuesForElementName(
|
| const string16& name, const string16& prefix, int limit,
|
| WebDataServiceConsumer* consumer) {
|
| - return ScheduleDBTaskWithResult(FROM_HERE,
|
| + return wdbs_->ScheduleDBTaskWithResult(FROM_HERE,
|
| Bind(&WebDataService::GetFormValuesForElementNameImpl,
|
| - this, name, prefix, limit),
|
| - consumer);
|
| + this, name, prefix, limit), consumer);
|
| }
|
|
|
| void WebDataService::RemoveFormElementsAddedBetween(const Time& delete_begin,
|
| const Time& delete_end) {
|
| - ScheduleDBTask(FROM_HERE,
|
| + wdbs_->ScheduleDBTask(FROM_HERE,
|
| Bind(&WebDataService::RemoveFormElementsAddedBetweenImpl,
|
| this, delete_begin, delete_end));
|
| }
|
|
|
| void WebDataService::RemoveExpiredFormElements() {
|
| - ScheduleDBTask(FROM_HERE,
|
| + wdbs_->ScheduleDBTask(FROM_HERE,
|
| Bind(&WebDataService::RemoveExpiredFormElementsImpl, this));
|
| }
|
|
|
| void WebDataService::RemoveFormValueForElementName(
|
| const string16& name, const string16& value) {
|
| - ScheduleDBTask(FROM_HERE,
|
| + wdbs_->ScheduleDBTask(FROM_HERE,
|
| Bind(&WebDataService::RemoveFormValueForElementNameImpl,
|
| this, name, value));
|
| }
|
|
|
| void WebDataService::AddAutofillProfile(const AutofillProfile& profile) {
|
| - ScheduleDBTask(FROM_HERE,
|
| + wdbs_->ScheduleDBTask(FROM_HERE,
|
| Bind(&WebDataService::AddAutofillProfileImpl, this, profile));
|
| }
|
|
|
| void WebDataService::UpdateAutofillProfile(const AutofillProfile& profile) {
|
| - ScheduleDBTask(FROM_HERE,
|
| + wdbs_->ScheduleDBTask(FROM_HERE,
|
| Bind(&WebDataService::UpdateAutofillProfileImpl, this, profile));
|
| }
|
|
|
| void WebDataService::RemoveAutofillProfile(const std::string& guid) {
|
| - ScheduleDBTask(FROM_HERE,
|
| + wdbs_->ScheduleDBTask(FROM_HERE,
|
| Bind(&WebDataService::RemoveAutofillProfileImpl, this, guid));
|
| }
|
|
|
| WebDataService::Handle WebDataService::GetAutofillProfiles(
|
| WebDataServiceConsumer* consumer) {
|
| - return ScheduleDBTaskWithResult(FROM_HERE,
|
| + return wdbs_->ScheduleDBTaskWithResult(FROM_HERE,
|
| Bind(&WebDataService::GetAutofillProfilesImpl, this), consumer);
|
| }
|
|
|
| void WebDataService::AddCreditCard(const CreditCard& credit_card) {
|
| - ScheduleDBTask(FROM_HERE,
|
| + wdbs_->ScheduleDBTask(FROM_HERE,
|
| Bind(&WebDataService::AddCreditCardImpl, this, credit_card));
|
| }
|
|
|
| void WebDataService::UpdateCreditCard(const CreditCard& credit_card) {
|
| - ScheduleDBTask(FROM_HERE,
|
| + wdbs_->ScheduleDBTask(FROM_HERE,
|
| Bind(&WebDataService::UpdateCreditCardImpl, this, credit_card));
|
| }
|
|
|
| void WebDataService::RemoveCreditCard(const std::string& guid) {
|
| - ScheduleDBTask(FROM_HERE,
|
| + wdbs_->ScheduleDBTask(FROM_HERE,
|
| Bind(&WebDataService::RemoveCreditCardImpl, this, guid));
|
| }
|
|
|
| WebDataService::Handle WebDataService::GetCreditCards(
|
| WebDataServiceConsumer* consumer) {
|
| - return ScheduleDBTaskWithResult(FROM_HERE,
|
| + return wdbs_->ScheduleDBTaskWithResult(FROM_HERE,
|
| Bind(&WebDataService::GetCreditCardsImpl, this), consumer);
|
| }
|
|
|
| void WebDataService::RemoveAutofillProfilesAndCreditCardsModifiedBetween(
|
| const Time& delete_begin,
|
| const Time& delete_end) {
|
| - ScheduleDBTask(FROM_HERE, Bind(
|
| + wdbs_->ScheduleDBTask(FROM_HERE, Bind(
|
| &WebDataService::RemoveAutofillProfilesAndCreditCardsModifiedBetweenImpl,
|
| this, delete_begin, delete_end));
|
| }
|
|
|
| WebDataService::~WebDataService() {
|
| - if (is_running_ && db_) {
|
| - NOTREACHED() << "WebDataService dtor called without Shutdown";
|
| - }
|
| -}
|
| -
|
| -bool WebDataService::InitWithPath(const base::FilePath& path) {
|
| - path_ = path;
|
| - is_running_ = true;
|
| -
|
| - ScheduleTask(FROM_HERE,
|
| - Bind(&WebDataService::InitializeDatabaseIfNecessary, this));
|
| - ScheduleTask(FROM_HERE,
|
| - Bind(&WebDataService::InitializeSyncableServices, this));
|
| - return true;
|
| + wdbs_.reset();
|
| + DCHECK(!autocomplete_syncable_service_);
|
| + DCHECK(!autofill_profile_syncable_service_);
|
| }
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
| //
|
| -// The following methods are executed in Chrome_WebDataThread.
|
| +// The following methods are executed on the DB thread.
|
| //
|
| ////////////////////////////////////////////////////////////////////////////////
|
|
|
| -void WebDataService::DBInitFailed(sql::InitStatus init_status) {
|
| +void WebDataService::DBInitFailed(sql::InitStatus sql_status) {
|
| ShowProfileErrorDialog(
|
| - (init_status == sql::INIT_FAILURE) ?
|
| + (sql_status == sql::INIT_FAILURE) ?
|
| IDS_COULDNT_OPEN_PROFILE_ERROR : IDS_PROFILE_TOO_NEW_ERROR);
|
| }
|
|
|
| -void WebDataService::InitializeDatabaseIfNecessary() {
|
| - if (db_ || failed_init_ || path_.empty())
|
| - return;
|
| +void WebDataService::NotifyDatabaseLoadedOnUIThread() {
|
| + db_loaded_ = true;
|
| + // Notify that the database has been initialized.
|
| + content::NotificationService::current()->Notify(
|
| + chrome::NOTIFICATION_WEB_DATABASE_LOADED,
|
| + content::Source<WebDataService>(this),
|
| + content::NotificationService::NoDetails());
|
| +}
|
|
|
| - // In the rare case where the db fails to initialize a dialog may get shown
|
| - // that blocks the caller, yet allows other messages through. For this reason
|
| - // we only set db_ to the created database if creation is successful. That
|
| - // way other methods won't do anything as db_ is still NULL.
|
| - WebDatabase* db = new WebDatabase();
|
| - sql::InitStatus init_status = db->Init(path_, app_locale_);
|
| - if (init_status != sql::INIT_OK) {
|
| - LOG(ERROR) << "Cannot initialize the web database: " << init_status;
|
| - failed_init_ = true;
|
| - delete db;
|
| - if (main_loop_) {
|
| - main_loop_->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&WebDataService::DBInitFailed, this, init_status));
|
| - }
|
| - return;
|
| +void WebDataService::DatabaseInitOnDB(sql::InitStatus status) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
|
| + if (status == sql::INIT_OK) {
|
| + BrowserThread::PostTask(
|
| + BrowserThread::UI, FROM_HERE,
|
| + base::Bind(&WebDataService::NotifyDatabaseLoadedOnUIThread, this));
|
| + } else {
|
| + BrowserThread::PostTask(
|
| + BrowserThread::UI, FROM_HERE,
|
| + base::Bind(&WebDataService::DBInitFailed, this, status));
|
| }
|
| -
|
| - BrowserThread::PostTask(
|
| - BrowserThread::UI, FROM_HERE,
|
| - base::Bind(&WebDataService::NotifyDatabaseLoadedOnUIThread, this));
|
| -
|
| - db_ = db;
|
| - db_->BeginTransaction();
|
| }
|
|
|
| void WebDataService::InitializeSyncableServices() {
|
| @@ -394,24 +378,6 @@ void WebDataService::InitializeSyncableServices() {
|
| autofill_profile_syncable_service_ = new AutofillProfileSyncableService(this);
|
| }
|
|
|
| -void WebDataService::NotifyDatabaseLoadedOnUIThread() {
|
| - // Notify that the database has been initialized.
|
| - content::NotificationService::current()->Notify(
|
| - chrome::NOTIFICATION_WEB_DATABASE_LOADED,
|
| - content::Source<WebDataService>(this),
|
| - content::NotificationService::NoDetails());
|
| -}
|
| -
|
| -void WebDataService::ShutdownDatabase() {
|
| - should_commit_ = false;
|
| -
|
| - if (db_) {
|
| - db_->CommitTransaction();
|
| - delete db_;
|
| - db_ = NULL;
|
| - }
|
| -}
|
| -
|
| void WebDataService::ShutdownSyncableServices() {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
|
|
|
| @@ -421,132 +387,61 @@ void WebDataService::ShutdownSyncableServices() {
|
| autofill_profile_syncable_service_ = NULL;
|
| }
|
|
|
| -void WebDataService::Commit() {
|
| - if (should_commit_) {
|
| - should_commit_ = false;
|
| -
|
| - if (db_) {
|
| - db_->CommitTransaction();
|
| - db_->BeginTransaction();
|
| - }
|
| - }
|
| -}
|
| -
|
| -void WebDataService::ScheduleTask(const tracked_objects::Location& from_here,
|
| - const base::Closure& task) {
|
| - if (is_running_)
|
| - BrowserThread::PostTask(BrowserThread::DB, from_here, task);
|
| - else
|
| - NOTREACHED() << "Task scheduled after Shutdown()";
|
| -}
|
| -
|
| -void WebDataService::ScheduleDBTask(
|
| - const tracked_objects::Location& from_here,
|
| - const base::Closure& task) {
|
| - scoped_ptr<WebDataRequest> request(
|
| - new WebDataRequest(NULL, request_manager_.get()));
|
| - if (is_running_) {
|
| - BrowserThread::PostTask(BrowserThread::DB, from_here,
|
| - base::Bind(&WebDataService::DBTaskWrapper, this, task,
|
| - base::Passed(&request)));
|
| - } else {
|
| - NOTREACHED() << "Task scheduled after Shutdown()";
|
| - }
|
| -}
|
| -
|
| -WebDataService::Handle WebDataService::ScheduleDBTaskWithResult(
|
| - const tracked_objects::Location& from_here,
|
| - const ResultTask& task,
|
| - WebDataServiceConsumer* consumer) {
|
| - DCHECK(consumer);
|
| - scoped_ptr<WebDataRequest> request(
|
| - new WebDataRequest(consumer, request_manager_.get()));
|
| - WebDataService::Handle handle = request->GetHandle();
|
| - if (is_running_) {
|
| - BrowserThread::PostTask(BrowserThread::DB, from_here,
|
| - base::Bind(&WebDataService::DBResultTaskWrapper, this, task,
|
| - base::Passed(&request)));
|
| - } else {
|
| - NOTREACHED() << "Task scheduled after Shutdown()";
|
| - }
|
| - return handle;
|
| -}
|
| -
|
| -void WebDataService::DBTaskWrapper(const base::Closure& task,
|
| - scoped_ptr<WebDataRequest> request) {
|
| - InitializeDatabaseIfNecessary();
|
| - if (db_ && !request->IsCancelled()) {
|
| - task.Run();
|
| - }
|
| - request_manager_->RequestCompleted(request.Pass());
|
| -}
|
| -
|
| -void WebDataService::DBResultTaskWrapper(const ResultTask& task,
|
| - scoped_ptr<WebDataRequest> request) {
|
| - InitializeDatabaseIfNecessary();
|
| - if (db_ && !request->IsCancelled()) {
|
| - request->SetResult(task.Run());
|
| - }
|
| - request_manager_->RequestCompleted(request.Pass());
|
| -}
|
| -
|
| -void WebDataService::ScheduleCommit() {
|
| - if (should_commit_ == false) {
|
| - should_commit_ = true;
|
| - ScheduleTask(FROM_HERE, Bind(&WebDataService::Commit, this));
|
| - }
|
| -}
|
| -
|
| ////////////////////////////////////////////////////////////////////////////////
|
| //
|
| // Keywords implementation.
|
| //
|
| ////////////////////////////////////////////////////////////////////////////////
|
|
|
| -void WebDataService::AddKeywordImpl(const TemplateURLData& data) {
|
| - db_->GetKeywordTable()->AddKeyword(data);
|
| - ScheduleCommit();
|
| +WebDatabase::State WebDataService::AddKeywordImpl(
|
| + const TemplateURLData& data, WebDatabase* db) {
|
| + db->GetKeywordTable()->AddKeyword(data);
|
| + return WebDatabase::COMMIT_NEEDED;
|
| }
|
|
|
| -void WebDataService::RemoveKeywordImpl(TemplateURLID id) {
|
| +WebDatabase::State WebDataService::RemoveKeywordImpl(
|
| + TemplateURLID id, WebDatabase* db) {
|
| DCHECK(id);
|
| - db_->GetKeywordTable()->RemoveKeyword(id);
|
| - ScheduleCommit();
|
| + db->GetKeywordTable()->RemoveKeyword(id);
|
| + return WebDatabase::COMMIT_NEEDED;
|
| }
|
|
|
| -void WebDataService::UpdateKeywordImpl(const TemplateURLData& data) {
|
| - if (!db_->GetKeywordTable()->UpdateKeyword(data)) {
|
| +WebDatabase::State WebDataService::UpdateKeywordImpl(
|
| + const TemplateURLData& data, WebDatabase* db) {
|
| + if (!db->GetKeywordTable()->UpdateKeyword(data)) {
|
| NOTREACHED();
|
| - return;
|
| + return WebDatabase::COMMIT_NOT_NEEDED;
|
| }
|
| - ScheduleCommit();
|
| + return WebDatabase::COMMIT_NEEDED;
|
| }
|
|
|
| -scoped_ptr<WDTypedResult> WebDataService::GetKeywordsImpl() {
|
| +scoped_ptr<WDTypedResult> WebDataService::GetKeywordsImpl(WebDatabase* db) {
|
| WDKeywordsResult result;
|
| - db_->GetKeywordTable()->GetKeywords(&result.keywords);
|
| + db->GetKeywordTable()->GetKeywords(&result.keywords);
|
| result.default_search_provider_id =
|
| - db_->GetKeywordTable()->GetDefaultSearchProviderID();
|
| + db->GetKeywordTable()->GetDefaultSearchProviderID();
|
| result.builtin_keyword_version =
|
| - db_->GetKeywordTable()->GetBuiltinKeywordVersion();
|
| + db->GetKeywordTable()->GetBuiltinKeywordVersion();
|
| return scoped_ptr<WDTypedResult>(
|
| new WDResult<WDKeywordsResult>(KEYWORDS_RESULT, result));
|
| }
|
|
|
| -void WebDataService::SetDefaultSearchProviderImpl(TemplateURLID id) {
|
| - if (!db_->GetKeywordTable()->SetDefaultSearchProviderID(id)) {
|
| +WebDatabase::State WebDataService::SetDefaultSearchProviderImpl(
|
| + TemplateURLID id, WebDatabase* db) {
|
| + if (!db->GetKeywordTable()->SetDefaultSearchProviderID(id)) {
|
| NOTREACHED();
|
| - return;
|
| + return WebDatabase::COMMIT_NOT_NEEDED;
|
| }
|
| - ScheduleCommit();
|
| + return WebDatabase::COMMIT_NEEDED;
|
| }
|
|
|
| -void WebDataService::SetBuiltinKeywordVersionImpl(int version) {
|
| - if (!db_->GetKeywordTable()->SetBuiltinKeywordVersion(version)) {
|
| +WebDatabase::State WebDataService::SetBuiltinKeywordVersionImpl(
|
| + int version, WebDatabase* db) {
|
| + if (!db->GetKeywordTable()->SetBuiltinKeywordVersion(version)) {
|
| NOTREACHED();
|
| - return;
|
| + return WebDatabase::COMMIT_NOT_NEEDED;
|
| }
|
| - ScheduleCommit();
|
| + return WebDatabase::COMMIT_NEEDED;
|
| }
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
| @@ -555,29 +450,30 @@ void WebDataService::SetBuiltinKeywordVersionImpl(int version) {
|
| //
|
| ////////////////////////////////////////////////////////////////////////////////
|
|
|
| -void WebDataService::SetWebAppImageImpl(
|
| - const GURL& app_url, const SkBitmap& image) {
|
| - db_->GetWebAppsTable()->SetWebAppImage(app_url, image);
|
| - ScheduleCommit();
|
| +WebDatabase::State WebDataService::SetWebAppImageImpl(
|
| + const GURL& app_url, const SkBitmap& image, WebDatabase* db) {
|
| + db->GetWebAppsTable()->SetWebAppImage(app_url, image);
|
| + return WebDatabase::COMMIT_NEEDED;
|
| }
|
|
|
| -void WebDataService::SetWebAppHasAllImagesImpl(
|
| - const GURL& app_url, bool has_all_images) {
|
| - db_->GetWebAppsTable()->SetWebAppHasAllImages(app_url, has_all_images);
|
| - ScheduleCommit();
|
| +WebDatabase::State WebDataService::SetWebAppHasAllImagesImpl(
|
| + const GURL& app_url, bool has_all_images, WebDatabase* db) {
|
| + db->GetWebAppsTable()->
|
| + SetWebAppHasAllImages(app_url, has_all_images);
|
| + return WebDatabase::COMMIT_NEEDED;
|
| }
|
|
|
| -void WebDataService::RemoveWebAppImpl(const GURL& app_url) {
|
| - db_->GetWebAppsTable()->RemoveWebApp(app_url);
|
| - ScheduleCommit();
|
| +WebDatabase::State WebDataService::RemoveWebAppImpl(
|
| + const GURL& app_url, WebDatabase* db) {
|
| + db->GetWebAppsTable()->RemoveWebApp(app_url);
|
| + return WebDatabase::COMMIT_NEEDED;
|
| }
|
|
|
| scoped_ptr<WDTypedResult> WebDataService::GetWebAppImagesImpl(
|
| - const GURL& app_url) {
|
| + const GURL& app_url, WebDatabase* db) {
|
| WDAppImagesResult result;
|
| - result.has_all_images =
|
| - db_->GetWebAppsTable()->GetWebAppHasAllImages(app_url);
|
| - db_->GetWebAppsTable()->GetWebAppImages(app_url, &result.images);
|
| + result.has_all_images = db->GetWebAppsTable()->GetWebAppHasAllImages(app_url);
|
| + db->GetWebAppsTable()->GetWebAppImages(app_url, &result.images);
|
| return scoped_ptr<WDTypedResult>(
|
| new WDResult<WDAppImagesResult>(WEB_APP_IMAGES, result));
|
| }
|
| @@ -588,22 +484,24 @@ scoped_ptr<WDTypedResult> WebDataService::GetWebAppImagesImpl(
|
| //
|
| ////////////////////////////////////////////////////////////////////////////////
|
|
|
| -void WebDataService::RemoveAllTokensImpl() {
|
| - if (db_->GetTokenServiceTable()->RemoveAllTokens()) {
|
| - ScheduleCommit();
|
| +WebDatabase::State WebDataService::RemoveAllTokensImpl(WebDatabase* db) {
|
| + if (db->GetTokenServiceTable()->RemoveAllTokens()) {
|
| + return WebDatabase::COMMIT_NEEDED;
|
| }
|
| + return WebDatabase::COMMIT_NOT_NEEDED;
|
| }
|
|
|
| -void WebDataService::SetTokenForServiceImpl(const std::string& service,
|
| - const std::string& token) {
|
| - if (db_->GetTokenServiceTable()->SetTokenForService(service, token)) {
|
| - ScheduleCommit();
|
| +WebDatabase::State WebDataService::SetTokenForServiceImpl(
|
| + const std::string& service, const std::string& token, WebDatabase* db) {
|
| + if (db->GetTokenServiceTable()->SetTokenForService(service, token)) {
|
| + return WebDatabase::COMMIT_NEEDED;
|
| }
|
| + return WebDatabase::COMMIT_NOT_NEEDED;
|
| }
|
|
|
| -scoped_ptr<WDTypedResult> WebDataService::GetAllTokensImpl() {
|
| +scoped_ptr<WDTypedResult> WebDataService::GetAllTokensImpl(WebDatabase* db) {
|
| std::map<std::string, std::string> map;
|
| - db_->GetTokenServiceTable()->GetAllTokens(&map);
|
| + db->GetTokenServiceTable()->GetAllTokens(&map);
|
| return scoped_ptr<WDTypedResult>(
|
| new WDResult<std::map<std::string, std::string> >(TOKEN_RESULT, map));
|
| }
|
| @@ -614,14 +512,13 @@ scoped_ptr<WDTypedResult> WebDataService::GetAllTokensImpl() {
|
| //
|
| ////////////////////////////////////////////////////////////////////////////////
|
|
|
| -void WebDataService::AddFormElementsImpl(
|
| - const std::vector<FormFieldData>& fields) {
|
| +WebDatabase::State WebDataService::AddFormElementsImpl(
|
| + const std::vector<FormFieldData>& fields, WebDatabase* db) {
|
| AutofillChangeList changes;
|
| - if (!db_->GetAutofillTable()->AddFormFieldValues(fields, &changes)) {
|
| + if (!db->GetAutofillTable()->AddFormFieldValues(fields, &changes)) {
|
| NOTREACHED();
|
| - return;
|
| + return WebDatabase::COMMIT_NOT_NEEDED;
|
| }
|
| - ScheduleCommit();
|
|
|
| // Post the notifications including the list of affected keys.
|
| // This is sent here so that work resulting from this notification will be
|
| @@ -630,21 +527,25 @@ void WebDataService::AddFormElementsImpl(
|
| chrome::NOTIFICATION_AUTOFILL_ENTRIES_CHANGED,
|
| content::Source<WebDataService>(this),
|
| content::Details<AutofillChangeList>(&changes));
|
| +
|
| + return WebDatabase::COMMIT_NEEDED;
|
| }
|
|
|
| scoped_ptr<WDTypedResult> WebDataService::GetFormValuesForElementNameImpl(
|
| - const string16& name, const string16& prefix, int limit) {
|
| + const string16& name, const string16& prefix, int limit, WebDatabase* db) {
|
| std::vector<string16> values;
|
| - db_->GetAutofillTable()->GetFormValuesForElementName(
|
| + db->GetAutofillTable()->GetFormValuesForElementName(
|
| name, prefix, &values, limit);
|
| return scoped_ptr<WDTypedResult>(
|
| new WDResult<std::vector<string16> >(AUTOFILL_VALUE_RESULT, values));
|
| }
|
|
|
| -void WebDataService::RemoveFormElementsAddedBetweenImpl(
|
| - const base::Time& delete_begin, const base::Time& delete_end) {
|
| +WebDatabase::State WebDataService::RemoveFormElementsAddedBetweenImpl(
|
| + const base::Time& delete_begin, const base::Time& delete_end,
|
| + WebDatabase* db) {
|
| AutofillChangeList changes;
|
| - if (db_->GetAutofillTable()->RemoveFormElementsAddedBetween(
|
| +
|
| + if (db->GetAutofillTable()->RemoveFormElementsAddedBetween(
|
| delete_begin, delete_end, &changes)) {
|
| if (!changes.empty()) {
|
| // Post the notifications including the list of affected keys.
|
| @@ -655,14 +556,16 @@ void WebDataService::RemoveFormElementsAddedBetweenImpl(
|
| content::Source<WebDataService>(this),
|
| content::Details<AutofillChangeList>(&changes));
|
| }
|
| - ScheduleCommit();
|
| + return WebDatabase::COMMIT_NEEDED;
|
| }
|
| + return WebDatabase::COMMIT_NOT_NEEDED;
|
| }
|
|
|
| -void WebDataService::RemoveExpiredFormElementsImpl() {
|
| +WebDatabase::State WebDataService::RemoveExpiredFormElementsImpl(
|
| + WebDatabase* db) {
|
| AutofillChangeList changes;
|
|
|
| - if (db_->GetAutofillTable()->RemoveExpiredFormElements(&changes)) {
|
| + if (db->GetAutofillTable()->RemoveExpiredFormElements(&changes)) {
|
| if (!changes.empty()) {
|
| // Post the notifications including the list of affected keys.
|
| // This is sent here so that work resulting from this notification
|
| @@ -672,33 +575,36 @@ void WebDataService::RemoveExpiredFormElementsImpl() {
|
| content::Source<WebDataService>(this),
|
| content::Details<AutofillChangeList>(&changes));
|
| }
|
| - ScheduleCommit();
|
| + return WebDatabase::COMMIT_NEEDED;
|
| }
|
| + return WebDatabase::COMMIT_NOT_NEEDED;
|
| }
|
|
|
| -void WebDataService::RemoveFormValueForElementNameImpl(
|
| - const string16& name, const string16& value) {
|
| +WebDatabase::State WebDataService::RemoveFormValueForElementNameImpl(
|
| + const string16& name, const string16& value, WebDatabase* db) {
|
|
|
| - if (db_->GetAutofillTable()->RemoveFormElement(name, value)) {
|
| + if (db->GetAutofillTable()->RemoveFormElement(name, value)) {
|
| AutofillChangeList changes;
|
| changes.push_back(AutofillChange(AutofillChange::REMOVE,
|
| AutofillKey(name, value)));
|
| - ScheduleCommit();
|
|
|
| // Post the notifications including the list of affected keys.
|
| content::NotificationService::current()->Notify(
|
| chrome::NOTIFICATION_AUTOFILL_ENTRIES_CHANGED,
|
| content::Source<WebDataService>(this),
|
| content::Details<AutofillChangeList>(&changes));
|
| +
|
| + return WebDatabase::COMMIT_NEEDED;
|
| }
|
| + return WebDatabase::COMMIT_NOT_NEEDED;
|
| }
|
|
|
| -void WebDataService::AddAutofillProfileImpl(const AutofillProfile& profile) {
|
| - if (!db_->GetAutofillTable()->AddAutofillProfile(profile)) {
|
| +WebDatabase::State WebDataService::AddAutofillProfileImpl(
|
| + const AutofillProfile& profile, WebDatabase* db) {
|
| + if (!db->GetAutofillTable()->AddAutofillProfile(profile)) {
|
| NOTREACHED();
|
| - return;
|
| + return WebDatabase::COMMIT_NOT_NEEDED;
|
| }
|
| - ScheduleCommit();
|
|
|
| // Send GUID-based notification.
|
| AutofillProfileChange change(AutofillProfileChange::ADD,
|
| @@ -707,24 +613,26 @@ void WebDataService::AddAutofillProfileImpl(const AutofillProfile& profile) {
|
| chrome::NOTIFICATION_AUTOFILL_PROFILE_CHANGED,
|
| content::Source<WebDataService>(this),
|
| content::Details<AutofillProfileChange>(&change));
|
| +
|
| + return WebDatabase::COMMIT_NEEDED;
|
| }
|
|
|
| -void WebDataService::UpdateAutofillProfileImpl(const AutofillProfile& profile) {
|
| +WebDatabase::State WebDataService::UpdateAutofillProfileImpl(
|
| + const AutofillProfile& profile, WebDatabase* db) {
|
| // Only perform the update if the profile exists. It is currently
|
| // valid to try to update a missing profile. We simply drop the write and
|
| // the caller will detect this on the next refresh.
|
| AutofillProfile* original_profile = NULL;
|
| - if (!db_->GetAutofillTable()->GetAutofillProfile(profile.guid(),
|
| - &original_profile)) {
|
| - return;
|
| + if (!db->GetAutofillTable()->GetAutofillProfile(profile.guid(),
|
| + &original_profile)) {
|
| + return WebDatabase::COMMIT_NOT_NEEDED;
|
| }
|
| scoped_ptr<AutofillProfile> scoped_profile(original_profile);
|
|
|
| - if (!db_->GetAutofillTable()->UpdateAutofillProfileMulti(profile)) {
|
| + if (!db->GetAutofillTable()->UpdateAutofillProfileMulti(profile)) {
|
| NOTREACHED();
|
| - return;
|
| + return WebDatabase::COMMIT_NEEDED;
|
| }
|
| - ScheduleCommit();
|
|
|
| // Send GUID-based notification.
|
| AutofillProfileChange change(AutofillProfileChange::UPDATE,
|
| @@ -733,21 +641,23 @@ void WebDataService::UpdateAutofillProfileImpl(const AutofillProfile& profile) {
|
| chrome::NOTIFICATION_AUTOFILL_PROFILE_CHANGED,
|
| content::Source<WebDataService>(this),
|
| content::Details<AutofillProfileChange>(&change));
|
| +
|
| + return WebDatabase::COMMIT_NEEDED;
|
| }
|
|
|
| -void WebDataService::RemoveAutofillProfileImpl(const std::string& guid) {
|
| +WebDatabase::State WebDataService::RemoveAutofillProfileImpl(
|
| + const std::string& guid, WebDatabase* db) {
|
| AutofillProfile* profile = NULL;
|
| - if (!db_->GetAutofillTable()->GetAutofillProfile(guid, &profile)) {
|
| + if (!db->GetAutofillTable()->GetAutofillProfile(guid, &profile)) {
|
| NOTREACHED();
|
| - return;
|
| + return WebDatabase::COMMIT_NOT_NEEDED;
|
| }
|
| scoped_ptr<AutofillProfile> scoped_profile(profile);
|
|
|
| - if (!db_->GetAutofillTable()->RemoveAutofillProfile(guid)) {
|
| + if (!db->GetAutofillTable()->RemoveAutofillProfile(guid)) {
|
| NOTREACHED();
|
| - return;
|
| + return WebDatabase::COMMIT_NOT_NEEDED;
|
| }
|
| - ScheduleCommit();
|
|
|
| // Send GUID-based notification.
|
| AutofillProfileChange change(AutofillProfileChange::REMOVE, guid, NULL);
|
| @@ -755,11 +665,14 @@ void WebDataService::RemoveAutofillProfileImpl(const std::string& guid) {
|
| chrome::NOTIFICATION_AUTOFILL_PROFILE_CHANGED,
|
| content::Source<WebDataService>(this),
|
| content::Details<AutofillProfileChange>(&change));
|
| +
|
| + return WebDatabase::COMMIT_NEEDED;
|
| }
|
|
|
| -scoped_ptr<WDTypedResult> WebDataService::GetAutofillProfilesImpl() {
|
| +scoped_ptr<WDTypedResult> WebDataService::GetAutofillProfilesImpl(
|
| + WebDatabase* db) {
|
| std::vector<AutofillProfile*> profiles;
|
| - db_->GetAutofillTable()->GetAutofillProfiles(&profiles);
|
| + db->GetAutofillTable()->GetAutofillProfiles(&profiles);
|
| return scoped_ptr<WDTypedResult>(
|
| new WDDestroyableResult<std::vector<AutofillProfile*> >(
|
| AUTOFILL_PROFILES_RESULT,
|
| @@ -768,42 +681,46 @@ scoped_ptr<WDTypedResult> WebDataService::GetAutofillProfilesImpl() {
|
| base::Unretained(this))));
|
| }
|
|
|
| -void WebDataService::AddCreditCardImpl(const CreditCard& credit_card) {
|
| - if (!db_->GetAutofillTable()->AddCreditCard(credit_card)) {
|
| +WebDatabase::State WebDataService::AddCreditCardImpl(
|
| + const CreditCard& credit_card, WebDatabase* db) {
|
| + if (!db->GetAutofillTable()->AddCreditCard(credit_card)) {
|
| NOTREACHED();
|
| - return;
|
| + return WebDatabase::COMMIT_NOT_NEEDED;
|
| }
|
| - ScheduleCommit();
|
| +
|
| + return WebDatabase::COMMIT_NEEDED;
|
| }
|
|
|
| -void WebDataService::UpdateCreditCardImpl(const CreditCard& credit_card) {
|
| +WebDatabase::State WebDataService::UpdateCreditCardImpl(
|
| + const CreditCard& credit_card, WebDatabase* db) {
|
| // It is currently valid to try to update a missing profile. We simply drop
|
| // the write and the caller will detect this on the next refresh.
|
| CreditCard* original_credit_card = NULL;
|
| - if (!db_->GetAutofillTable()->GetCreditCard(credit_card.guid(),
|
| - &original_credit_card)) {
|
| - return;
|
| + if (!db->GetAutofillTable()->GetCreditCard(credit_card.guid(),
|
| + &original_credit_card)) {
|
| + return WebDatabase::COMMIT_NOT_NEEDED;
|
| }
|
| scoped_ptr<CreditCard> scoped_credit_card(original_credit_card);
|
|
|
| - if (!db_->GetAutofillTable()->UpdateCreditCard(credit_card)) {
|
| + if (!db->GetAutofillTable()->UpdateCreditCard(credit_card)) {
|
| NOTREACHED();
|
| - return;
|
| + return WebDatabase::COMMIT_NOT_NEEDED;
|
| }
|
| - ScheduleCommit();
|
| + return WebDatabase::COMMIT_NEEDED;
|
| }
|
|
|
| -void WebDataService::RemoveCreditCardImpl(const std::string& guid) {
|
| - if (!db_->GetAutofillTable()->RemoveCreditCard(guid)) {
|
| +WebDatabase::State WebDataService::RemoveCreditCardImpl(
|
| + const std::string& guid, WebDatabase* db) {
|
| + if (!db->GetAutofillTable()->RemoveCreditCard(guid)) {
|
| NOTREACHED();
|
| - return;
|
| + return WebDatabase::COMMIT_NOT_NEEDED;
|
| }
|
| - ScheduleCommit();
|
| + return WebDatabase::COMMIT_NEEDED;
|
| }
|
|
|
| -scoped_ptr<WDTypedResult> WebDataService::GetCreditCardsImpl() {
|
| +scoped_ptr<WDTypedResult> WebDataService::GetCreditCardsImpl(WebDatabase* db) {
|
| std::vector<CreditCard*> credit_cards;
|
| - db_->GetAutofillTable()->GetCreditCards(&credit_cards);
|
| + db->GetAutofillTable()->GetCreditCards(&credit_cards);
|
| return scoped_ptr<WDTypedResult>(
|
| new WDDestroyableResult<std::vector<CreditCard*> >(
|
| AUTOFILL_CREDITCARDS_RESULT,
|
| @@ -812,11 +729,13 @@ scoped_ptr<WDTypedResult> WebDataService::GetCreditCardsImpl() {
|
| base::Unretained(this))));
|
| }
|
|
|
| -void WebDataService::RemoveAutofillProfilesAndCreditCardsModifiedBetweenImpl(
|
| - const base::Time& delete_begin, const base::Time& delete_end) {
|
| +WebDatabase::State
|
| +WebDataService::RemoveAutofillProfilesAndCreditCardsModifiedBetweenImpl(
|
| + const base::Time& delete_begin, const base::Time& delete_end,
|
| + WebDatabase* db) {
|
| std::vector<std::string> profile_guids;
|
| std::vector<std::string> credit_card_guids;
|
| - if (db_->GetAutofillTable()->
|
| + if (db->GetAutofillTable()->
|
| RemoveAutofillProfilesAndCreditCardsModifiedBetween(
|
| delete_begin,
|
| delete_end,
|
| @@ -833,8 +752,9 @@ void WebDataService::RemoveAutofillProfilesAndCreditCardsModifiedBetweenImpl(
|
| }
|
| // Note: It is the caller's responsibility to post notifications for any
|
| // changes, e.g. by calling the Refresh() method of PersonalDataManager.
|
| - ScheduleCommit();
|
| + return WebDatabase::COMMIT_NEEDED;
|
| }
|
| + return WebDatabase::COMMIT_NOT_NEEDED;
|
| }
|
|
|
| AutofillProfileSyncableService*
|
|
|