summaryrefslogtreecommitdiff
path: root/chromium/components/password_manager/content/browser/password_requirements_service_factory.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/components/password_manager/content/browser/password_requirements_service_factory.cc')
-rw-r--r--chromium/components/password_manager/content/browser/password_requirements_service_factory.cc120
1 files changed, 120 insertions, 0 deletions
diff --git a/chromium/components/password_manager/content/browser/password_requirements_service_factory.cc b/chromium/components/password_manager/content/browser/password_requirements_service_factory.cc
new file mode 100644
index 00000000000..cfa39766d47
--- /dev/null
+++ b/chromium/components/password_manager/content/browser/password_requirements_service_factory.cc
@@ -0,0 +1,120 @@
+// Copyright 2018 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 "components/password_manager/content/browser/password_requirements_service_factory.h"
+
+#include <map>
+#include <memory>
+#include <string>
+
+#include "base/memory/singleton.h"
+#include "base/metrics/field_trial_params.h"
+#include "base/strings/string_number_conversions.h"
+#include "components/autofill/core/browser/password_requirements_spec_fetcher.h"
+#include "components/autofill/core/browser/password_requirements_spec_fetcher_impl.h"
+#include "components/keyed_service/content/browser_context_dependency_manager.h"
+#include "components/keyed_service/core/keyed_service.h"
+#include "components/password_manager/core/browser/password_requirements_service.h"
+#include "components/password_manager/core/common/password_manager_features.h"
+#include "content/public/browser/browser_context.h"
+#include "content/public/browser/storage_partition.h"
+#include "ui/base/ui_base_features.h"
+
+namespace password_manager {
+
+// static
+PasswordRequirementsServiceFactory*
+PasswordRequirementsServiceFactory::GetInstance() {
+ return base::Singleton<PasswordRequirementsServiceFactory>::get();
+}
+
+// static
+PasswordRequirementsService*
+PasswordRequirementsServiceFactory::GetForBrowserContext(
+ content::BrowserContext* context) {
+ return static_cast<PasswordRequirementsService*>(
+ GetInstance()->GetServiceForBrowserContext(context, true /* create */));
+}
+
+PasswordRequirementsServiceFactory::PasswordRequirementsServiceFactory()
+ : BrowserContextKeyedServiceFactory(
+ "PasswordRequirementsServiceFactory",
+ BrowserContextDependencyManager::GetInstance()) {}
+
+PasswordRequirementsServiceFactory::~PasswordRequirementsServiceFactory() {}
+
+KeyedService* PasswordRequirementsServiceFactory::BuildServiceInstanceFor(
+ content::BrowserContext* context) const {
+ if (context->IsOffTheRecord())
+ return nullptr;
+
+ VLOG(1) << "PasswordGenerationRequirements experiment enabled? "
+ << base::FeatureList::IsEnabled(
+ features::kPasswordGenerationRequirements);
+
+ if (!base::FeatureList::IsEnabled(
+ features::kPasswordGenerationRequirements) &&
+ !base::FeatureList::IsEnabled(::features::kExperimentalUi)) {
+ return nullptr;
+ }
+
+ bool enable_domain_overrides =
+ base::FeatureList::IsEnabled(
+ features::kPasswordGenerationRequirementsDomainOverrides) ||
+ base::FeatureList::IsEnabled(::features::kExperimentalUi);
+
+ VLOG(1)
+ << "PasswordGenerationRequirementsDomainOverrides experiment enabled? "
+ << enable_domain_overrides;
+
+ if (!enable_domain_overrides)
+ return new PasswordRequirementsService(nullptr);
+
+ // Default parameters.
+ int version = 0;
+ int prefix_length = 0;
+ int timeout_in_ms = 5000;
+
+ // Override defaults with parameters from field trial if defined.
+ std::map<std::string, std::string> field_trial_params;
+ base::GetFieldTrialParams(features::kGenerationRequirementsFieldTrial,
+ &field_trial_params);
+ // base::StringToInt modifies the target even if it fails to parse the input.
+ // |tmp| is used to protect the default values above.
+ int tmp = 0;
+ if (base::StringToInt(
+ field_trial_params[features::kGenerationRequirementsVersion], &tmp)) {
+ version = tmp;
+ }
+ if (base::StringToInt(
+ field_trial_params[features::kGenerationRequirementsPrefixLength],
+ &tmp)) {
+ prefix_length = tmp;
+ }
+ if (base::StringToInt(
+ field_trial_params[features::kGenerationRequirementsTimeout], &tmp)) {
+ timeout_in_ms = tmp;
+ }
+
+ // If no experiment configuration is set to a user with experimental-ui flag,
+ // set a default that exercises the full new code.
+ if (version == 0 &&
+ base::FeatureList::IsEnabled(::features::kExperimentalUi)) {
+ version = 1;
+ prefix_length = 0;
+ timeout_in_ms = 5000;
+ }
+
+ VLOG(1) << "PasswordGenerationRequirements parameters: " << version << ", "
+ << prefix_length << ", " << timeout_in_ms << " ms";
+
+ std::unique_ptr<autofill::PasswordRequirementsSpecFetcher> fetcher =
+ std::make_unique<autofill::PasswordRequirementsSpecFetcherImpl>(
+ content::BrowserContext::GetDefaultStoragePartition(context)
+ ->GetURLLoaderFactoryForBrowserProcess(),
+ version, prefix_length, timeout_in_ms);
+ return new PasswordRequirementsService(std::move(fetcher));
+}
+
+} // namespace password_manager