summaryrefslogtreecommitdiffstats
path: root/chrome/browser/web_data_service_factory.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/web_data_service_factory.cc')
-rw-r--r--chrome/browser/web_data_service_factory.cc177
1 files changed, 177 insertions, 0 deletions
diff --git a/chrome/browser/web_data_service_factory.cc b/chrome/browser/web_data_service_factory.cc
new file mode 100644
index 0000000..3dd86a1
--- /dev/null
+++ b/chrome/browser/web_data_service_factory.cc
@@ -0,0 +1,177 @@
+// Copyright (c) 2012 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.
+
+#include "chrome/browser/web_data_service_factory.h"
+
+#include "base/bind.h"
+#include "base/files/file_path.h"
+#include "base/memory/singleton.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/profiles/incognito_helpers.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/sync/glue/sync_start_util.h"
+#include "chrome/browser/ui/profile_error_dialog.h"
+#include "chrome/grit/chromium_strings.h"
+#include "chrome/grit/generated_resources.h"
+#include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
+#include "components/keyed_service/content/browser_context_dependency_manager.h"
+#include "components/search_engines/keyword_web_data_service.h"
+#include "components/signin/core/browser/webdata/token_web_data.h"
+#include "components/webdata_services/web_data_service_wrapper.h"
+#include "content/public/browser/browser_thread.h"
+
+#if defined(OS_WIN)
+#include "components/password_manager/core/browser/webdata/password_web_data_service_win.h"
+#endif
+
+using content::BrowserThread;
+
+namespace {
+
+// Converts a WebDataServiceWrapper::ErrorType to ProfileErrorType.
+ProfileErrorType ProfileErrorFromWebDataServiceWrapperError(
+ WebDataServiceWrapper::ErrorType error_type) {
+ switch (error_type) {
+ case WebDataServiceWrapper::ERROR_LOADING_AUTOFILL:
+ return PROFILE_ERROR_DB_AUTOFILL_WEB_DATA;
+
+ case WebDataServiceWrapper::ERROR_LOADING_KEYWORD:
+ return PROFILE_ERROR_DB_KEYWORD_WEB_DATA;
+
+ case WebDataServiceWrapper::ERROR_LOADING_TOKEN:
+ return PROFILE_ERROR_DB_TOKEN_WEB_DATA;
+
+ case WebDataServiceWrapper::ERROR_LOADING_PASSWORD:
+ return PROFILE_ERROR_DB_WEB_DATA;
+
+ default:
+ NOTREACHED()
+ << "Unknown WebDataServiceWrapper::ErrorType: " << error_type;
+ return PROFILE_ERROR_DB_WEB_DATA;
+ }
+}
+
+// Callback to show error dialog on profile load error.
+void ProfileErrorCallback(WebDataServiceWrapper::ErrorType error_type,
+ sql::InitStatus status) {
+ ShowProfileErrorDialog(
+ ProfileErrorFromWebDataServiceWrapperError(error_type),
+ (status == sql::INIT_FAILURE) ?
+ IDS_COULDNT_OPEN_PROFILE_ERROR : IDS_PROFILE_TOO_NEW_ERROR);
+}
+
+} // namespace
+
+WebDataServiceFactory::WebDataServiceFactory()
+ : BrowserContextKeyedServiceFactory(
+ "WebDataService",
+ BrowserContextDependencyManager::GetInstance()) {
+ // WebDataServiceFactory has no dependecies.
+}
+
+WebDataServiceFactory::~WebDataServiceFactory() {
+}
+
+// static
+WebDataServiceWrapper* WebDataServiceFactory::GetForProfile(
+ Profile* profile,
+ ServiceAccessType access_type) {
+ // If |access_type| starts being used for anything other than this
+ // DCHECK, we need to start taking it as a parameter to
+ // the *WebDataService::FromBrowserContext() functions (see above).
+ DCHECK(access_type != ServiceAccessType::IMPLICIT_ACCESS ||
+ !profile->IsOffTheRecord());
+ return static_cast<WebDataServiceWrapper*>(
+ GetInstance()->GetServiceForBrowserContext(profile, true));
+}
+
+// static
+WebDataServiceWrapper* WebDataServiceFactory::GetForProfileIfExists(
+ Profile* profile,
+ ServiceAccessType access_type) {
+ // If |access_type| starts being used for anything other than this
+ // DCHECK, we need to start taking it as a parameter to
+ // the *WebDataService::FromBrowserContext() functions (see above).
+ DCHECK(access_type != ServiceAccessType::IMPLICIT_ACCESS ||
+ !profile->IsOffTheRecord());
+ return static_cast<WebDataServiceWrapper*>(
+ GetInstance()->GetServiceForBrowserContext(profile, false));
+}
+
+// static
+scoped_refptr<autofill::AutofillWebDataService>
+WebDataServiceFactory::GetAutofillWebDataForProfile(
+ Profile* profile,
+ ServiceAccessType access_type) {
+ WebDataServiceWrapper* wrapper =
+ WebDataServiceFactory::GetForProfile(profile, access_type);
+ // |wrapper| can be null in Incognito mode.
+ return wrapper ?
+ wrapper->GetAutofillWebData() :
+ scoped_refptr<autofill::AutofillWebDataService>(nullptr);
+}
+
+// static
+scoped_refptr<KeywordWebDataService>
+WebDataServiceFactory::GetKeywordWebDataForProfile(
+ Profile* profile,
+ ServiceAccessType access_type) {
+ WebDataServiceWrapper* wrapper =
+ WebDataServiceFactory::GetForProfile(profile, access_type);
+ // |wrapper| can be null in Incognito mode.
+ return wrapper ?
+ wrapper->GetKeywordWebData() :
+ scoped_refptr<KeywordWebDataService>(nullptr);
+}
+
+// static
+scoped_refptr<TokenWebData> WebDataServiceFactory::GetTokenWebDataForProfile(
+ Profile* profile,
+ ServiceAccessType access_type) {
+ WebDataServiceWrapper* wrapper =
+ WebDataServiceFactory::GetForProfile(profile, access_type);
+ // |wrapper| can be null in Incognito mode.
+ return wrapper ?
+ wrapper->GetTokenWebData() : scoped_refptr<TokenWebData>(nullptr);
+}
+
+#if defined(OS_WIN)
+// static
+scoped_refptr<PasswordWebDataService>
+WebDataServiceFactory::GetPasswordWebDataForProfile(
+ Profile* profile,
+ ServiceAccessType access_type) {
+ WebDataServiceWrapper* wrapper =
+ WebDataServiceFactory::GetForProfile(profile, access_type);
+ // |wrapper| can be null in Incognito mode.
+ return wrapper ?
+ wrapper->GetPasswordWebData() :
+ scoped_refptr<PasswordWebDataService>(nullptr);
+}
+#endif
+
+// static
+WebDataServiceFactory* WebDataServiceFactory::GetInstance() {
+ return Singleton<WebDataServiceFactory>::get();
+}
+
+content::BrowserContext* WebDataServiceFactory::GetBrowserContextToUse(
+ content::BrowserContext* context) const {
+ return chrome::GetBrowserContextRedirectedInIncognito(context);
+}
+
+KeyedService* WebDataServiceFactory::BuildServiceInstanceFor(
+ content::BrowserContext* context) const {
+ const base::FilePath& profile_path = context->GetPath();
+ return new WebDataServiceWrapper(
+ profile_path, g_browser_process->GetApplicationLocale(),
+ BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI),
+ BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB),
+ sync_start_util::GetFlareForSyncableService(profile_path),
+ &ProfileErrorCallback);
+}
+
+bool WebDataServiceFactory::ServiceIsNULLWhileTesting() const {
+ return true;
+}