// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef COMPONENTS_SEARCH_ENGINES_KEYWORD_WEB_DATA_SERVICE_H__ #define COMPONENTS_SEARCH_ENGINES_KEYWORD_WEB_DATA_SERVICE_H__ #include "base/memory/ref_counted.h" #include "components/search_engines/keyword_table.h" #include "components/search_engines/template_url_id.h" #include "components/webdata/common/web_data_service_base.h" #include "components/webdata/common/web_database.h" namespace base { class SingleThreadTaskRunner; } class WDTypedResult; class WebDatabaseService; struct TemplateURLData; struct WDKeywordsResult { WDKeywordsResult(); ~WDKeywordsResult(); KeywordTable::Keywords keywords; // Identifies the ID of the TemplateURL that is the default search. A value of // 0 indicates there is no default search provider. int64 default_search_provider_id; // Version of the built-in keywords. A value of 0 indicates a first run. int builtin_keyword_version; }; class WebDataServiceConsumer; class KeywordWebDataService : public WebDataServiceBase { public: // Instantiate this to turn on batch mode on the provided |service| // until the scoper is destroyed. When batch mode is on, calls to any of the // three keyword table modification functions below will result in locally // queueing the operation; on setting this back to false, all the // modifications will be performed at once. This is a performance // optimization; see comments on KeywordTable::PerformOperations(). // // If multiple scopers are in-scope simultaneously, batch mode will only be // exited when all are destroyed. If |service| is NULL, the object will do // nothing. class BatchModeScoper { public: explicit BatchModeScoper(KeywordWebDataService* service); ~BatchModeScoper(); private: KeywordWebDataService* service_; DISALLOW_COPY_AND_ASSIGN(BatchModeScoper); }; KeywordWebDataService(scoped_refptr wdbs, scoped_refptr ui_thread, const ProfileErrorCallback& callback); // As the database processes requests at a later date, all deletion is // done on the background thread. // // Many of the keyword related methods do not return a handle. This is because // the caller (TemplateURLService) does not need to know when the request is // done. void AddKeyword(const TemplateURLData& data); void RemoveKeyword(TemplateURLID id); void UpdateKeyword(const TemplateURLData& data); // Fetches the keywords. // On success, consumer is notified with WDResult. Handle GetKeywords(WebDataServiceConsumer* consumer); // Sets the ID of the default search provider. void SetDefaultSearchProviderID(TemplateURLID id); // Sets the version of the builtin keywords. void SetBuiltinKeywordVersion(int version); protected: ~KeywordWebDataService() override; private: // Called by the BatchModeScoper (see comments there). void AdjustBatchModeLevel(bool entering_batch_mode); ////////////////////////////////////////////////////////////////////////////// // // The following methods are only invoked on the DB thread. // ////////////////////////////////////////////////////////////////////////////// WebDatabase::State PerformKeywordOperationsImpl( const KeywordTable::Operations& operations, WebDatabase* db); scoped_ptr GetKeywordsImpl(WebDatabase* db); WebDatabase::State SetDefaultSearchProviderIDImpl(TemplateURLID id, WebDatabase* db); WebDatabase::State SetBuiltinKeywordVersionImpl(int version, WebDatabase* db); size_t batch_mode_level_; KeywordTable::Operations queued_keyword_operations_; DISALLOW_COPY_AND_ASSIGN(KeywordWebDataService); }; #endif // COMPONENTS_SEARCH_ENGINES_KEYWORD_WEB_DATA_SERVICE_H__