15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/webdata/web_data_service_factory.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/browser_process.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/profiles/incognito_helpers.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/sync/glue/sync_start_util.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/profile_error_dialog.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/webdata/autocomplete_syncable_service.h"
1403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/grit/chromium_strings.h"
1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/grit/generated_resources.h"
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_country.h"
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/autofill/core/browser/webdata/autofill_profile_syncable_service.h"
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/webdata/autofill_table.h"
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/keyed_service/content/browser_context_dependency_manager.h"
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/password_manager/core/browser/webdata/logins_table.h"
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/keyword_table.h"
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/keyword_web_data_service.h"
24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/webdata/token_service_table.h"
25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/webdata/token_web_data.h"
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "components/webdata/common/webdata_constants.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/browser_thread.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_WIN)
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/password_manager/core/browser/webdata/password_web_data_service_win.h"
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using autofill::AutofillWebDataService;
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using autofill::AutofillProfileSyncableService;
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::BrowserThread;
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Callback to show error dialog on profile load error.
40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void ProfileErrorCallback(ProfileErrorType type, sql::InitStatus status) {
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ShowProfileErrorDialog(
42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      type,
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (status == sql::INIT_FAILURE) ?
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          IDS_COULDNT_OPEN_PROFILE_ERROR : IDS_PROFILE_TOO_NEW_ERROR);
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void InitSyncableServicesOnDBThread(
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_refptr<AutofillWebDataService> autofill_web_data,
4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const base::FilePath& profile_path,
5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const std::string& app_locale,
5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    autofill::AutofillWebDataBackend* autofill_backend) {
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Currently only Autocomplete and Autofill profiles use the new Sync API, but
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // all the database data should migrate to this API over time.
5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AutocompleteSyncableService::CreateForWebDataServiceAndBackend(
57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      autofill_web_data.get(), autofill_backend);
58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  AutocompleteSyncableService::FromWebDataService(autofill_web_data.get())
59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ->InjectStartSyncFlare(
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          sync_start_util::GetFlareForSyncableService(profile_path));
6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AutofillProfileSyncableService::CreateForWebDataServiceAndBackend(
62868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      autofill_web_data.get(), autofill_backend, app_locale);
63868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  AutofillProfileSyncableService::FromWebDataService(autofill_web_data.get())
64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ->InjectStartSyncFlare(
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          sync_start_util::GetFlareForSyncableService(profile_path));
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
70116680a4aac90f2aa7413d9095a592090648e557Ben MurdochWebDataServiceWrapper::WebDataServiceWrapper() {
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebDataServiceWrapper::WebDataServiceWrapper(Profile* profile) {
7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::FilePath profile_path = profile->GetPath();
7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::FilePath path = profile_path.Append(kWebDataFilename);
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<base::MessageLoopProxy> ui_thread =
784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI);
794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<base::MessageLoopProxy> db_thread =
804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB);
814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_database_ = new WebDatabaseService(path, ui_thread, db_thread);
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // All tables objects that participate in managing the database must
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // be added here.
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  web_database_->AddTable(scoped_ptr<WebDatabaseTable>(
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      new autofill::AutofillTable(g_browser_process->GetApplicationLocale())));
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  web_database_->AddTable(scoped_ptr<WebDatabaseTable>(new KeywordTable()));
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(mdm): We only really need the LoginsTable on Windows for IE7 password
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // access, but for now, we still create it on all platforms since it deletes
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the old logins table. We can remove this after a while, e.g. in M22 or so.
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  web_database_->AddTable(scoped_ptr<WebDatabaseTable>(new LoginsTable()));
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_database_->AddTable(
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_ptr<WebDatabaseTable>(new TokenServiceTable()));
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  web_database_->LoadDatabase();
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  autofill_web_data_ = new AutofillWebDataService(
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      web_database_,
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ui_thread,
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      db_thread,
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Bind(&ProfileErrorCallback, PROFILE_ERROR_DB_AUTOFILL_WEB_DATA));
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  autofill_web_data_->Init();
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  keyword_web_data_ = new KeywordWebDataService(
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      web_database_,
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ui_thread,
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Bind(&ProfileErrorCallback, PROFILE_ERROR_DB_KEYWORD_WEB_DATA));
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  keyword_web_data_->Init();
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  token_web_data_ = new TokenWebData(
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      web_database_,
112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ui_thread,
113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      db_thread,
114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Bind(&ProfileErrorCallback, PROFILE_ERROR_DB_TOKEN_WEB_DATA));
11590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  token_web_data_->Init();
11690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_WIN)
118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  password_web_data_ = new PasswordWebDataService(
119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      web_database_,
120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ui_thread,
121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Bind(&ProfileErrorCallback, PROFILE_ERROR_DB_WEB_DATA));
122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  password_web_data_->Init();
123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  autofill_web_data_->GetAutofillBackend(
126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Bind(&InitSyncableServicesOnDBThread,
127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 autofill_web_data_,
128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 profile_path,
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 g_browser_process->GetApplicationLocale()));
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebDataServiceWrapper::~WebDataServiceWrapper() {
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebDataServiceWrapper::Shutdown() {
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  autofill_web_data_->ShutdownOnUIThread();
137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  keyword_web_data_->ShutdownOnUIThread();
13890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  token_web_data_->ShutdownOnUIThread();
139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_WIN)
141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  password_web_data_->ShutdownOnUIThread();
142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_database_->ShutdownDatabase();
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_refptr<AutofillWebDataService>
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebDataServiceWrapper::GetAutofillWebData() {
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return autofill_web_data_.get();
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
151116680a4aac90f2aa7413d9095a592090648e557Ben Murdochscoped_refptr<KeywordWebDataService>
152116680a4aac90f2aa7413d9095a592090648e557Ben MurdochWebDataServiceWrapper::GetKeywordWebData() {
153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return keyword_web_data_.get();
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)scoped_refptr<TokenWebData> WebDataServiceWrapper::GetTokenWebData() {
15790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return token_web_data_.get();
15890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
15990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_WIN)
161116680a4aac90f2aa7413d9095a592090648e557Ben Murdochscoped_refptr<PasswordWebDataService>
162116680a4aac90f2aa7413d9095a592090648e557Ben MurdochWebDataServiceWrapper::GetPasswordWebData() {
163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return password_web_data_.get();
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebDataServiceFactory::WebDataServiceFactory()
16890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    : BrowserContextKeyedServiceFactory(
169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          "WebDataService",
170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          BrowserContextDependencyManager::GetInstance()) {
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WebDataServiceFactory has no dependecies.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
174116680a4aac90f2aa7413d9095a592090648e557Ben MurdochWebDataServiceFactory::~WebDataServiceFactory() {
175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebDataServiceWrapper* WebDataServiceFactory::GetForProfile(
179a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Profile* profile,
180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Profile::ServiceAccessType access_type) {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If |access_type| starts being used for anything other than this
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DCHECK, we need to start taking it as a parameter to
183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // the *WebDataService::FromBrowserContext() functions (see above).
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(access_type != Profile::IMPLICIT_ACCESS || !profile->IsOffTheRecord());
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return static_cast<WebDataServiceWrapper*>(
186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      GetInstance()->GetServiceForBrowserContext(profile, true));
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebDataServiceWrapper* WebDataServiceFactory::GetForProfileIfExists(
191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Profile* profile,
192a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Profile::ServiceAccessType access_type) {
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If |access_type| starts being used for anything other than this
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // DCHECK, we need to start taking it as a parameter to
195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // the *WebDataService::FromBrowserContext() functions (see above).
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(access_type != Profile::IMPLICIT_ACCESS || !profile->IsOffTheRecord());
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return static_cast<WebDataServiceWrapper*>(
198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      GetInstance()->GetServiceForBrowserContext(profile, false));
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)scoped_refptr<AutofillWebDataService>
203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)WebDataServiceFactory::GetAutofillWebDataForProfile(
204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Profile* profile,
205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Profile::ServiceAccessType access_type) {
206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  WebDataServiceWrapper* wrapper =
207a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      WebDataServiceFactory::GetForProfile(profile, access_type);
208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // |wrapper| can be NULL in Incognito mode.
209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return wrapper ?
210a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      wrapper->GetAutofillWebData() :
211a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      scoped_refptr<AutofillWebDataService>(NULL);
212a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
213a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
214a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// static
215116680a4aac90f2aa7413d9095a592090648e557Ben Murdochscoped_refptr<KeywordWebDataService>
216116680a4aac90f2aa7413d9095a592090648e557Ben MurdochWebDataServiceFactory::GetKeywordWebDataForProfile(
217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    Profile* profile,
218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    Profile::ServiceAccessType access_type) {
219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  WebDataServiceWrapper* wrapper =
220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      WebDataServiceFactory::GetForProfile(profile, access_type);
221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // |wrapper| can be NULL in Incognito mode.
222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return wrapper ?
223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      wrapper->GetKeywordWebData() : scoped_refptr<KeywordWebDataService>(NULL);
224116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// static
227116680a4aac90f2aa7413d9095a592090648e557Ben Murdochscoped_refptr<TokenWebData> WebDataServiceFactory::GetTokenWebDataForProfile(
228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    Profile* profile,
229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    Profile::ServiceAccessType access_type) {
230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  WebDataServiceWrapper* wrapper =
231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      WebDataServiceFactory::GetForProfile(profile, access_type);
232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // |wrapper| can be NULL in Incognito mode.
233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return wrapper ?
234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      wrapper->GetTokenWebData() : scoped_refptr<TokenWebData>(NULL);
235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_WIN)
238116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// static
239116680a4aac90f2aa7413d9095a592090648e557Ben Murdochscoped_refptr<PasswordWebDataService>
240116680a4aac90f2aa7413d9095a592090648e557Ben MurdochWebDataServiceFactory::GetPasswordWebDataForProfile(
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Profile* profile,
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Profile::ServiceAccessType access_type) {
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  WebDataServiceWrapper* wrapper =
2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      WebDataServiceFactory::GetForProfile(profile, access_type);
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // |wrapper| can be NULL in Incognito mode.
246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return wrapper ?
247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      wrapper->GetPasswordWebData() :
248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      scoped_refptr<PasswordWebDataService>(NULL);
2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebDataServiceFactory* WebDataServiceFactory::GetInstance() {
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Singleton<WebDataServiceFactory>::get();
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)content::BrowserContext* WebDataServiceFactory::GetBrowserContextToUse(
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::BrowserContext* context) const {
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return chrome::GetBrowserContextRedirectedInIncognito(context);
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)KeyedService* WebDataServiceFactory::BuildServiceInstanceFor(
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::BrowserContext* profile) const {
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return new WebDataServiceWrapper(static_cast<Profile*>(profile));
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebDataServiceFactory::ServiceIsNULLWhileTesting() const {
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
270