| OLD | NEW |
| (Empty) | |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "chrome/browser/webdata/keyword_web_data_service.h" |
| 6 |
| 7 #include "base/bind.h" |
| 8 #include "chrome/browser/webdata/keyword_table.h" |
| 9 #include "components/search_engines/template_url_data.h" |
| 10 #include "components/webdata/common/web_data_results.h" |
| 11 #include "components/webdata/common/web_database_service.h" |
| 12 |
| 13 using base::Bind; |
| 14 |
| 15 WDKeywordsResult::WDKeywordsResult() |
| 16 : default_search_provider_id(0), |
| 17 builtin_keyword_version(0) { |
| 18 } |
| 19 |
| 20 WDKeywordsResult::~WDKeywordsResult() {} |
| 21 |
| 22 KeywordWebDataService::BatchModeScoper::BatchModeScoper( |
| 23 KeywordWebDataService* service) |
| 24 : service_(service) { |
| 25 if (service_) |
| 26 service_->AdjustBatchModeLevel(true); |
| 27 } |
| 28 |
| 29 KeywordWebDataService::BatchModeScoper::~BatchModeScoper() { |
| 30 if (service_) |
| 31 service_->AdjustBatchModeLevel(false); |
| 32 } |
| 33 |
| 34 KeywordWebDataService::KeywordWebDataService( |
| 35 scoped_refptr<WebDatabaseService> wdbs, |
| 36 scoped_refptr<base::MessageLoopProxy> ui_thread, |
| 37 const ProfileErrorCallback& callback) |
| 38 : WebDataServiceBase(wdbs, callback, ui_thread), |
| 39 batch_mode_level_(0) { |
| 40 } |
| 41 |
| 42 void KeywordWebDataService::AddKeyword(const TemplateURLData& data) { |
| 43 if (batch_mode_level_) { |
| 44 queued_keyword_operations_.push_back( |
| 45 KeywordTable::Operation(KeywordTable::ADD, data)); |
| 46 } else { |
| 47 AdjustBatchModeLevel(true); |
| 48 AddKeyword(data); |
| 49 AdjustBatchModeLevel(false); |
| 50 } |
| 51 } |
| 52 |
| 53 void KeywordWebDataService::RemoveKeyword(TemplateURLID id) { |
| 54 if (batch_mode_level_) { |
| 55 TemplateURLData data; |
| 56 data.id = id; |
| 57 queued_keyword_operations_.push_back( |
| 58 KeywordTable::Operation(KeywordTable::REMOVE, data)); |
| 59 } else { |
| 60 AdjustBatchModeLevel(true); |
| 61 RemoveKeyword(id); |
| 62 AdjustBatchModeLevel(false); |
| 63 } |
| 64 } |
| 65 |
| 66 void KeywordWebDataService::UpdateKeyword(const TemplateURLData& data) { |
| 67 if (batch_mode_level_) { |
| 68 queued_keyword_operations_.push_back( |
| 69 KeywordTable::Operation(KeywordTable::UPDATE, data)); |
| 70 } else { |
| 71 AdjustBatchModeLevel(true); |
| 72 UpdateKeyword(data); |
| 73 AdjustBatchModeLevel(false); |
| 74 } |
| 75 } |
| 76 |
| 77 WebDataServiceBase::Handle KeywordWebDataService::GetKeywords( |
| 78 WebDataServiceConsumer* consumer) { |
| 79 return wdbs_->ScheduleDBTaskWithResult( |
| 80 FROM_HERE, Bind(&KeywordWebDataService::GetKeywordsImpl, this), consumer); |
| 81 } |
| 82 |
| 83 void KeywordWebDataService::SetDefaultSearchProviderID(TemplateURLID id) { |
| 84 wdbs_->ScheduleDBTask( |
| 85 FROM_HERE, |
| 86 Bind(&KeywordWebDataService::SetDefaultSearchProviderIDImpl, this, id)); |
| 87 } |
| 88 |
| 89 void KeywordWebDataService::SetBuiltinKeywordVersion(int version) { |
| 90 wdbs_->ScheduleDBTask( |
| 91 FROM_HERE, |
| 92 Bind(&KeywordWebDataService::SetBuiltinKeywordVersionImpl, |
| 93 this, version)); |
| 94 } |
| 95 |
| 96 KeywordWebDataService::~KeywordWebDataService() { |
| 97 DCHECK(!batch_mode_level_); |
| 98 } |
| 99 |
| 100 void KeywordWebDataService::AdjustBatchModeLevel(bool entering_batch_mode) { |
| 101 if (entering_batch_mode) { |
| 102 ++batch_mode_level_; |
| 103 } else { |
| 104 DCHECK(batch_mode_level_); |
| 105 --batch_mode_level_; |
| 106 if (!batch_mode_level_ && !queued_keyword_operations_.empty()) { |
| 107 wdbs_->ScheduleDBTask( |
| 108 FROM_HERE, |
| 109 Bind(&KeywordWebDataService::PerformKeywordOperationsImpl, this, |
| 110 queued_keyword_operations_)); |
| 111 queued_keyword_operations_.clear(); |
| 112 } |
| 113 } |
| 114 } |
| 115 |
| 116 WebDatabase::State KeywordWebDataService::PerformKeywordOperationsImpl( |
| 117 const KeywordTable::Operations& operations, |
| 118 WebDatabase* db) { |
| 119 return KeywordTable::FromWebDatabase(db)->PerformOperations(operations) ? |
| 120 WebDatabase::COMMIT_NEEDED : WebDatabase::COMMIT_NOT_NEEDED; |
| 121 } |
| 122 |
| 123 scoped_ptr<WDTypedResult> KeywordWebDataService::GetKeywordsImpl( |
| 124 WebDatabase* db) { |
| 125 scoped_ptr<WDTypedResult> result_ptr; |
| 126 WDKeywordsResult result; |
| 127 if (KeywordTable::FromWebDatabase(db)->GetKeywords(&result.keywords)) { |
| 128 result.default_search_provider_id = |
| 129 KeywordTable::FromWebDatabase(db)->GetDefaultSearchProviderID(); |
| 130 result.builtin_keyword_version = |
| 131 KeywordTable::FromWebDatabase(db)->GetBuiltinKeywordVersion(); |
| 132 result_ptr.reset(new WDResult<WDKeywordsResult>(KEYWORDS_RESULT, result)); |
| 133 } |
| 134 return result_ptr.Pass(); |
| 135 } |
| 136 |
| 137 WebDatabase::State KeywordWebDataService::SetDefaultSearchProviderIDImpl( |
| 138 TemplateURLID id, |
| 139 WebDatabase* db) { |
| 140 return KeywordTable::FromWebDatabase(db)->SetDefaultSearchProviderID(id) ? |
| 141 WebDatabase::COMMIT_NEEDED : WebDatabase::COMMIT_NOT_NEEDED; |
| 142 } |
| 143 |
| 144 WebDatabase::State KeywordWebDataService::SetBuiltinKeywordVersionImpl( |
| 145 int version, |
| 146 WebDatabase* db) { |
| 147 return KeywordTable::FromWebDatabase(db)->SetBuiltinKeywordVersion(version) ? |
| 148 WebDatabase::COMMIT_NEEDED : WebDatabase::COMMIT_NOT_NEEDED; |
| 149 } |
| OLD | NEW |