blob: 69ec79f8ea355a8e67a361710e84709cdfd285e2 [file] [log] [blame]
// Copyright 2014 The Chromium Authors
// 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 <stddef.h>
#include <stdint.h>
#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted.h"
#include "base/timer/timer.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"
namespace base {
class SequencedTaskRunner;
}
class WebDatabaseService;
struct TemplateURLData;
struct WDKeywordsResult {
WDKeywordsResult();
WDKeywordsResult(const WDKeywordsResult&);
WDKeywordsResult& operator=(const 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_t default_search_provider_id = 0;
// Context qualifying the built-in keywords and starter pack engines data.
struct Metadata {
// Version number of the most recent prepopulate data that has been merged
// into the current keyword data.
int builtin_keyword_data_version = 0;
// Version number of Chrome milestone when the keyword data has been last
// merged into the database.
int builtin_keyword_milestone = 0;
// Country associated with the keywords data, stored as a country ID,
// see `country_codes::CountryStringToCountryID()`.
int builtin_keyword_country = 0;
// Version number of the most recent starter pack data that has been merged
// into the current keyword data.
int starter_pack_version = 0;
// Whether any metadata associated with the keywords bundle is set.
bool HasBuiltinKeywordData() const {
return builtin_keyword_data_version != 0 ||
builtin_keyword_milestone != 0 || builtin_keyword_country != 0;
}
// Whether any metadata associated with the starter pack bundle is set.
bool HasStarterPackData() const { return starter_pack_version != 0; }
};
Metadata metadata;
};
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, after a short delay,
// 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(const BatchModeScoper&) = delete;
BatchModeScoper& operator=(const BatchModeScoper&) = delete;
~BatchModeScoper();
private:
raw_ptr<KeywordWebDataService> service_;
};
KeywordWebDataService(
scoped_refptr<WebDatabaseService> wdbs,
scoped_refptr<base::SequencedTaskRunner> ui_task_runner);
KeywordWebDataService(const KeywordWebDataService&) = delete;
KeywordWebDataService& operator=(const KeywordWebDataService&) = delete;
// As the database processes requests at a later date, all deletion is done on
// the background sequence.
//
// 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<KeywordTable::Keywords>.
Handle GetKeywords(WebDataServiceConsumer* consumer);
// Sets the ID of the default search provider.
void SetDefaultSearchProviderID(TemplateURLID id);
// Sets the version of the builtin keyword data.
void SetBuiltinKeywordDataVersion(int version);
// Sets the Chrome milestone associated with the builtin keyword data.
void SetBuiltinKeywordMilestone(int milestone_version);
// Sets the country ID associated with the builtin keyword data.
void SetBuiltinKeywordCountry(int country_id);
// Sets the version of the starter pack keywords.
void SetStarterPackKeywordVersion(int version);
// WebDataServiceBase:
void ShutdownOnUISequence() override;
protected:
~KeywordWebDataService() override;
private:
// Called by the BatchModeScoper (see comments there).
void AdjustBatchModeLevel(bool entering_batch_mode);
// Schedules a task to commit any |queued_keyword_operations_| immediately.
void CommitQueuedOperations();
size_t batch_mode_level_ = 0;
KeywordTable::Operations queued_keyword_operations_;
base::RetainingOneShotTimer timer_; // Used to commit updates no more often
// than every five seconds.
};
#endif // COMPONENTS_SEARCH_ENGINES_KEYWORD_WEB_DATA_SERVICE_H__