blob: 28a3f673eb53fcd77dbe3874dbdcbdbc2778fe1f [file] [log] [blame]
sdefresnecb955cd2014-12-15 23:21:561// 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 "components/webdata_services/web_data_service_wrapper.h"
6
Gyuyoung Kim8b084c02018-01-23 13:34:377#include <memory>
8
sdefresnecb955cd2014-12-15 23:21:569#include "base/bind.h"
10#include "base/callback.h"
pnolandaa02c722016-11-29 00:21:0811#include "base/feature_list.h"
sdefresnecb955cd2014-12-15 23:21:5612#include "base/files/file_path.h"
skyostilb0daa012015-06-02 19:03:4813#include "base/single_thread_task_runner.h"
Gabriel Charette44db1422018-08-06 11:19:3314#include "base/task/post_task.h"
avi5dd91f82015-12-25 22:30:4615#include "build/build_config.h"
pnolandaa02c722016-11-29 00:21:0816#include "components/autofill/core/browser/webdata/autocomplete_sync_bridge.h"
Jan Krcal7d2b56d2018-07-04 20:48:2417#include "components/autofill/core/browser/webdata/autofill_profile_sync_bridge.h"
sdefresnef8cf5be2014-12-16 20:08:0918#include "components/autofill/core/browser/webdata/autofill_profile_syncable_service.h"
sdefresnecb955cd2014-12-15 23:21:5619#include "components/autofill/core/browser/webdata/autofill_table.h"
Jan Krcal7873f472018-07-25 14:13:4420#include "components/autofill/core/browser/webdata/autofill_wallet_metadata_sync_bridge.h"
rouslanfd7f4642015-06-23 22:10:1521#include "components/autofill/core/browser/webdata/autofill_wallet_metadata_syncable_service.h"
Mikel Astizf7ea3382018-07-24 16:19:1722#include "components/autofill/core/browser/webdata/autofill_wallet_sync_bridge.h"
brettw43eadb632015-02-12 18:44:3923#include "components/autofill/core/browser/webdata/autofill_wallet_syncable_service.h"
sdefresnecb955cd2014-12-15 23:21:5624#include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
Florian Uunkbb7ccd82018-07-20 15:53:3625#include "components/autofill/core/common/autofill_features.h"
sdefresnecb955cd2014-12-15 23:21:5626#include "components/search_engines/keyword_table.h"
27#include "components/search_engines/keyword_web_data_service.h"
28#include "components/signin/core/browser/webdata/token_service_table.h"
29#include "components/signin/core/browser/webdata/token_web_data.h"
pnolandaa02c722016-11-29 00:21:0830#include "components/sync/driver/sync_driver_switches.h"
sdefresnecb955cd2014-12-15 23:21:5631#include "components/webdata/common/web_database_service.h"
32#include "components/webdata/common/webdata_constants.h"
33
Rouslan Solomakhinde012532017-09-20 15:18:3434#if !defined(OS_IOS)
35#include "components/payments/content/payment_manifest_web_data_service.h"
36#include "components/payments/content/payment_method_manifest_table.h"
37#include "components/payments/content/web_app_manifest_section_table.h"
gogerald753494c72017-04-12 17:15:3438#endif
39
sdefresnef8cf5be2014-12-16 20:08:0940namespace {
41
Jan Krcal7d2b56d2018-07-04 20:48:2442// TODO(jkrcal): Rename this function when the last webdata sync type get
43// converted to USS, e.g. to InitSyncBridgesOnDBSequence(). Check also other
44// related functions.
Florian Uunkbb7ccd82018-07-20 15:53:3645void InitSyncableProfileServicesOnDBSequence(
Peter Kasting19750672017-08-04 05:24:0946 scoped_refptr<base::SingleThreadTaskRunner> db_task_runner,
sdefresnef8cf5be2014-12-16 20:08:0947 const syncer::SyncableService::StartSyncFlare& sync_flare,
48 const scoped_refptr<autofill::AutofillWebDataService>& autofill_web_data,
49 const base::FilePath& context_path,
50 const std::string& app_locale,
51 autofill::AutofillWebDataBackend* autofill_backend) {
Peter Kasting19750672017-08-04 05:24:0952 DCHECK(db_task_runner->RunsTasksInCurrentSequence());
sdefresnef8cf5be2014-12-16 20:08:0953
54 // Currently only Autocomplete and Autofill profiles use the new Sync API, but
55 // all the database data should migrate to this API over time.
Jan Krcal99152702018-02-23 09:21:4256 autofill::AutocompleteSyncBridge::CreateForWebDataServiceAndBackend(
57 autofill_web_data.get(), autofill_backend);
brettw43eadb632015-02-12 18:44:3958
Jan Krcal7d2b56d2018-07-04 20:48:2459 if (base::FeatureList::IsEnabled(switches::kSyncUSSAutofillProfile)) {
60 autofill::AutofillProfileSyncBridge::CreateForWebDataServiceAndBackend(
61 app_locale, autofill_backend, autofill_web_data.get());
62 } else {
63 autofill::AutofillProfileSyncableService::CreateForWebDataServiceAndBackend(
64 autofill_web_data.get(), autofill_backend, app_locale);
65 autofill::AutofillProfileSyncableService::FromWebDataService(
66 autofill_web_data.get())
67 ->InjectStartSyncFlare(sync_flare);
68 }
Florian Uunkbb7ccd82018-07-20 15:53:3669}
Jan Krcal7d2b56d2018-07-04 20:48:2470
Mikel Astizf7ea3382018-07-24 16:19:1771// TODO(jkrcal): Rename this function when the last webdata sync type get
72// converted to USS, e.g. to InitSyncBridgesOnDBSequence(). Check also other
73// related functions.
Florian Uunkbb7ccd82018-07-20 15:53:3674void InitSyncableAccountServicesOnDBSequence(
75 scoped_refptr<base::SingleThreadTaskRunner> db_task_runner,
76 const syncer::SyncableService::StartSyncFlare& sync_flare,
77 const scoped_refptr<autofill::AutofillWebDataService>& autofill_web_data,
78 const base::FilePath& context_path,
79 const std::string& app_locale,
Jan Krcalbebe60c2018-08-30 09:16:0180 bool is_full_sync,
Florian Uunkbb7ccd82018-07-20 15:53:3681 autofill::AutofillWebDataBackend* autofill_backend) {
82 DCHECK(db_task_runner->RunsTasksInCurrentSequence());
Mikel Astizf7ea3382018-07-24 16:19:1783
Florian Uunk8bb9f4d2018-10-22 15:52:5884 base::RepeatingCallback<void(bool)> wallet_active_callback;
85 if (base::FeatureList::IsEnabled(switches::kSyncUSSAutofillWalletMetadata)) {
86 autofill::AutofillWalletMetadataSyncBridge::
87 CreateForWebDataServiceAndBackend(app_locale, autofill_backend,
88 autofill_web_data.get());
89 wallet_active_callback = base::BindRepeating(
90 &autofill::AutofillWalletMetadataSyncBridge::
91 OnWalletDataTrackingStateChanged,
92 autofill::AutofillWalletMetadataSyncBridge::FromWebDataService(
93 autofill_web_data.get())
94 ->GetWeakPtr());
95 } else {
96 autofill::AutofillWalletMetadataSyncableService::
97 CreateForWebDataServiceAndBackend(autofill_web_data.get(),
98 autofill_backend, app_locale);
99 wallet_active_callback = base::BindRepeating(
100 &autofill::AutofillWalletMetadataSyncableService::
101 OnWalletDataTrackingStateChanged,
102 autofill::AutofillWalletMetadataSyncableService::FromWebDataService(
103 autofill_web_data.get())
104 ->GetWeakPtr());
105 }
106
Mikel Astizf7ea3382018-07-24 16:19:17107 if (base::FeatureList::IsEnabled(switches::kSyncUSSAutofillWalletData)) {
108 autofill::AutofillWalletSyncBridge::CreateForWebDataServiceAndBackend(
Florian Uunk8bb9f4d2018-10-22 15:52:58109 app_locale, wallet_active_callback, is_full_sync, autofill_backend,
110 autofill_web_data.get());
Mikel Astizf7ea3382018-07-24 16:19:17111 } else {
112 autofill::AutofillWalletSyncableService::CreateForWebDataServiceAndBackend(
113 autofill_web_data.get(), autofill_backend, app_locale);
114 autofill::AutofillWalletSyncableService::FromWebDataService(
115 autofill_web_data.get())
116 ->InjectStartSyncFlare(sync_flare);
Florian Uunk8bb9f4d2018-10-22 15:52:58117 // For non-USS wallet, the metadata is always checking the existence of
118 // wallet data to add/remove metadata entries.
119 wallet_active_callback.Run(true);
Jan Krcal7873f472018-07-25 14:13:44120 }
sdefresnef8cf5be2014-12-16 20:08:09121}
122
123} // namespace
124
Rouslan Solomakhinde012532017-09-20 15:18:34125WebDataServiceWrapper::WebDataServiceWrapper() {}
sdefresnecb955cd2014-12-15 23:21:56126
127WebDataServiceWrapper::WebDataServiceWrapper(
sdefresnef8cf5be2014-12-16 20:08:09128 const base::FilePath& context_path,
sdefresnecb955cd2014-12-15 23:21:56129 const std::string& application_locale,
Peter Kasting19750672017-08-04 05:24:09130 const scoped_refptr<base::SingleThreadTaskRunner>& ui_task_runner,
sdefresnef8cf5be2014-12-16 20:08:09131 const syncer::SyncableService::StartSyncFlare& flare,
thestig6f046752015-08-21 01:23:47132 const ShowErrorCallback& show_error_callback) {
sdefresnef8cf5be2014-12-16 20:08:09133 base::FilePath path = context_path.Append(kWebDataFilename);
Peter Kastingd3e6933a2017-07-28 07:42:28134 // TODO(pkasting): http://crbug.com/740773 This should likely be sequenced,
135 // not single-threaded; it's also possible the various uses of this below
136 // should each use their own sequences instead of sharing this one.
Peter Kasting19750672017-08-04 05:24:09137 auto db_task_runner = base::CreateSingleThreadTaskRunnerWithTraits(
Peter Kastingd3e6933a2017-07-28 07:42:28138 {base::MayBlock(), base::TaskPriority::USER_VISIBLE,
139 base::TaskShutdownBehavior::BLOCK_SHUTDOWN});
Florian Uunk75c22c92018-06-25 12:44:10140 profile_database_ =
141 new WebDatabaseService(path, ui_task_runner, db_task_runner);
sdefresnecb955cd2014-12-15 23:21:56142
143 // All tables objects that participate in managing the database must
144 // be added here.
Florian Uunk75c22c92018-06-25 12:44:10145 profile_database_->AddTable(std::make_unique<autofill::AutofillTable>());
146 profile_database_->AddTable(std::make_unique<KeywordTable>());
Florian Uunk75c22c92018-06-25 12:44:10147 profile_database_->AddTable(std::make_unique<TokenServiceTable>());
Rouslan Solomakhinde012532017-09-20 15:18:34148#if !defined(OS_IOS)
Florian Uunk75c22c92018-06-25 12:44:10149 profile_database_->AddTable(
Gyuyoung Kim8b084c02018-01-23 13:34:37150 std::make_unique<payments::PaymentMethodManifestTable>());
Florian Uunk75c22c92018-06-25 12:44:10151 profile_database_->AddTable(
Gyuyoung Kim8b084c02018-01-23 13:34:37152 std::make_unique<payments::WebAppManifestSectionTable>());
gogerald753494c72017-04-12 17:15:34153#endif
Florian Uunk75c22c92018-06-25 12:44:10154 profile_database_->LoadDatabase();
sdefresnecb955cd2014-12-15 23:21:56155
Florian Uunk75c22c92018-06-25 12:44:10156 profile_autofill_web_data_ = new autofill::AutofillWebDataService(
157 profile_database_, ui_task_runner, db_task_runner,
sdefresnecb955cd2014-12-15 23:21:56158 base::Bind(show_error_callback, ERROR_LOADING_AUTOFILL));
Florian Uunk75c22c92018-06-25 12:44:10159 profile_autofill_web_data_->Init();
sdefresnecb955cd2014-12-15 23:21:56160
161 keyword_web_data_ = new KeywordWebDataService(
Florian Uunk75c22c92018-06-25 12:44:10162 profile_database_, ui_task_runner,
sdefresnecb955cd2014-12-15 23:21:56163 base::Bind(show_error_callback, ERROR_LOADING_KEYWORD));
164 keyword_web_data_->Init();
165
Peter Kasting19750672017-08-04 05:24:09166 token_web_data_ =
Florian Uunk75c22c92018-06-25 12:44:10167 new TokenWebData(profile_database_, ui_task_runner, db_task_runner,
Peter Kasting19750672017-08-04 05:24:09168 base::Bind(show_error_callback, ERROR_LOADING_TOKEN));
sdefresnecb955cd2014-12-15 23:21:56169 token_web_data_->Init();
170
Rouslan Solomakhinde012532017-09-20 15:18:34171#if !defined(OS_IOS)
gogerald79472092017-04-27 15:38:16172 payment_manifest_web_data_ = new payments::PaymentManifestWebDataService(
Florian Uunk75c22c92018-06-25 12:44:10173 profile_database_,
gogerald79472092017-04-27 15:38:16174 base::Bind(show_error_callback, ERROR_LOADING_PAYMENT_MANIFEST),
Peter Kasting19750672017-08-04 05:24:09175 ui_task_runner);
gogerald79472092017-04-27 15:38:16176#endif
177
Florian Uunkbb7ccd82018-07-20 15:53:36178 profile_autofill_web_data_->GetAutofillBackend(base::Bind(
179 &InitSyncableProfileServicesOnDBSequence, db_task_runner, flare,
180 profile_autofill_web_data_, context_path, application_locale));
Jan Krcalbebe60c2018-08-30 09:16:01181 profile_autofill_web_data_->GetAutofillBackend(
182 base::Bind(&InitSyncableAccountServicesOnDBSequence, db_task_runner,
183 flare, profile_autofill_web_data_, context_path,
184 application_locale, /*is_full_sync=*/true));
Florian Uunk75c22c92018-06-25 12:44:10185
Florian Uunkbb7ccd82018-07-20 15:53:36186 if (base::FeatureList::IsEnabled(
187 autofill::features::kAutofillEnableAccountWalletStorage)) {
188 account_database_ =
189 new WebDatabaseService(base::FilePath(WebDatabase::kInMemoryPath),
190 ui_task_runner, db_task_runner);
191 account_database_->AddTable(std::make_unique<autofill::AutofillTable>());
192 account_database_->LoadDatabase();
Florian Uunk75c22c92018-06-25 12:44:10193
Florian Uunkbb7ccd82018-07-20 15:53:36194 account_autofill_web_data_ = new autofill::AutofillWebDataService(
195 account_database_, ui_task_runner, db_task_runner,
196 base::Bind(show_error_callback, ERROR_LOADING_ACCOUNT_AUTOFILL));
197 account_autofill_web_data_->Init();
Jan Krcalbebe60c2018-08-30 09:16:01198 account_autofill_web_data_->GetAutofillBackend(
199 base::Bind(&InitSyncableAccountServicesOnDBSequence, db_task_runner,
200 flare, account_autofill_web_data_, context_path,
201 application_locale, /*is_full_sync=*/false));
Florian Uunkbb7ccd82018-07-20 15:53:36202 }
sdefresnecb955cd2014-12-15 23:21:56203}
204
Rouslan Solomakhinde012532017-09-20 15:18:34205WebDataServiceWrapper::~WebDataServiceWrapper() {}
sdefresnecb955cd2014-12-15 23:21:56206
207void WebDataServiceWrapper::Shutdown() {
Florian Uunk75c22c92018-06-25 12:44:10208 profile_autofill_web_data_->ShutdownOnUISequence();
Florian Uunkbb7ccd82018-07-20 15:53:36209 if (account_autofill_web_data_)
210 account_autofill_web_data_->ShutdownOnUISequence();
Peter Kasting19750672017-08-04 05:24:09211 keyword_web_data_->ShutdownOnUISequence();
212 token_web_data_->ShutdownOnUISequence();
sdefresnecb955cd2014-12-15 23:21:56213
Rouslan Solomakhinde012532017-09-20 15:18:34214#if !defined(OS_IOS)
Peter Kasting19750672017-08-04 05:24:09215 payment_manifest_web_data_->ShutdownOnUISequence();
gogerald79472092017-04-27 15:38:16216#endif
217
Florian Uunk75c22c92018-06-25 12:44:10218 profile_database_->ShutdownDatabase();
Florian Uunkbb7ccd82018-07-20 15:53:36219 if (account_database_)
220 account_database_->ShutdownDatabase();
sdefresnecb955cd2014-12-15 23:21:56221}
222
223scoped_refptr<autofill::AutofillWebDataService>
Florian Uunk75c22c92018-06-25 12:44:10224WebDataServiceWrapper::GetProfileAutofillWebData() {
225 return profile_autofill_web_data_.get();
226}
227
228scoped_refptr<autofill::AutofillWebDataService>
229WebDataServiceWrapper::GetAccountAutofillWebData() {
230 return account_autofill_web_data_.get();
sdefresnecb955cd2014-12-15 23:21:56231}
232
233scoped_refptr<KeywordWebDataService>
234WebDataServiceWrapper::GetKeywordWebData() {
235 return keyword_web_data_.get();
236}
237
238scoped_refptr<TokenWebData> WebDataServiceWrapper::GetTokenWebData() {
239 return token_web_data_.get();
240}
241
Rouslan Solomakhinde012532017-09-20 15:18:34242#if !defined(OS_IOS)
gogerald79472092017-04-27 15:38:16243scoped_refptr<payments::PaymentManifestWebDataService>
244WebDataServiceWrapper::GetPaymentManifestWebData() {
245 return payment_manifest_web_data_.get();
246}
247#endif