| // Copyright 2013 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/signin/signin_promo.h" |
| |
| #include "base/strings/string_number_conversions.h" |
| #include "build/chromeos_buildflags.h" |
| #include "chrome/browser/browser_process.h" |
| #include "chrome/browser/google/google_brand.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/signin/account_consistency_mode_manager.h" |
| #include "chrome/browser/signin/signin_promo_util.h" |
| #include "chrome/common/pref_names.h" |
| #include "chrome/common/url_constants.h" |
| #include "components/google/core/common/google_util.h" |
| #include "components/pref_registry/pref_registry_syncable.h" |
| #include "components/prefs/pref_service.h" |
| #include "content/public/browser/browser_context.h" |
| #include "content/public/browser/storage_partition_config.h" |
| #include "extensions/browser/guest_view/web_view/web_view_guest.h" |
| #include "google_apis/gaia/gaia_urls.h" |
| #include "net/base/url_util.h" |
| #include "url/gurl.h" |
| |
| #if defined(OS_WIN) |
| #include "base/win/windows_version.h" |
| #endif |
| |
| namespace signin { |
| |
| const char kSignInPromoQueryKeyAccessPoint[] = "access_point"; |
| const char kSignInPromoQueryKeyAutoClose[] = "auto_close"; |
| const char kSignInPromoQueryKeyForceKeepData[] = "force_keep_data"; |
| const char kSignInPromoQueryKeyReason[] = "reason"; |
| |
| #if !BUILDFLAG(IS_CHROMEOS_ASH) |
| GURL GetEmbeddedPromoURL(signin_metrics::AccessPoint access_point, |
| signin_metrics::Reason reason, |
| bool auto_close) { |
| CHECK_LT(static_cast<int>(access_point), |
| static_cast<int>(signin_metrics::AccessPoint::ACCESS_POINT_MAX)); |
| CHECK_NE(static_cast<int>(access_point), |
| static_cast<int>(signin_metrics::AccessPoint::ACCESS_POINT_UNKNOWN)); |
| CHECK_LT(static_cast<int>(reason), |
| static_cast<int>(signin_metrics::Reason::REASON_MAX)); |
| CHECK_NE(static_cast<int>(reason), |
| static_cast<int>(signin_metrics::Reason::REASON_UNKNOWN_REASON)); |
| |
| GURL url(chrome::kChromeUIChromeSigninURL); |
| url = net::AppendQueryParameter( |
| url, signin::kSignInPromoQueryKeyAccessPoint, |
| base::NumberToString(static_cast<int>(access_point))); |
| url = |
| net::AppendQueryParameter(url, signin::kSignInPromoQueryKeyReason, |
| base::NumberToString(static_cast<int>(reason))); |
| if (auto_close) { |
| url = net::AppendQueryParameter(url, signin::kSignInPromoQueryKeyAutoClose, |
| "1"); |
| } |
| return url; |
| } |
| |
| GURL GetEmbeddedReauthURLWithEmail(signin_metrics::AccessPoint access_point, |
| signin_metrics::Reason reason, |
| const std::string& email) { |
| GURL url = GetEmbeddedPromoURL(access_point, reason, /*auto_close=*/true); |
| url = net::AppendQueryParameter(url, "email", email); |
| url = net::AppendQueryParameter(url, "validateEmail", "1"); |
| return net::AppendQueryParameter(url, "readOnlyEmail", "1"); |
| } |
| #endif // !BUILDFLAG(IS_CHROMEOS_ASH) |
| |
| GURL GetChromeSyncURLForDice(const std::string& email, |
| const std::string& continue_url) { |
| GURL url = GaiaUrls::GetInstance()->signin_chrome_sync_dice(); |
| if (!email.empty()) |
| url = net::AppendQueryParameter(url, "email_hint", email); |
| if (!continue_url.empty()) |
| url = net::AppendQueryParameter(url, "continue", continue_url); |
| return url; |
| } |
| |
| GURL GetAddAccountURLForDice(const std::string& email, |
| const std::string& continue_url) { |
| GURL url = GaiaUrls::GetInstance()->add_account_url(); |
| if (!email.empty()) |
| url = net::AppendQueryParameter(url, "Email", email); |
| if (!continue_url.empty()) |
| url = net::AppendQueryParameter(url, "continue", continue_url); |
| return url; |
| } |
| |
| content::StoragePartition* GetSigninPartition( |
| content::BrowserContext* browser_context) { |
| const auto signin_partition_config = content::StoragePartitionConfig::Create( |
| "chrome-signin", /* partition_name= */ "", /* in_memory= */ true); |
| return content::BrowserContext::GetStoragePartition(browser_context, |
| signin_partition_config); |
| } |
| |
| signin_metrics::AccessPoint GetAccessPointForEmbeddedPromoURL(const GURL& url) { |
| std::string value; |
| if (!net::GetValueForKeyInQuery(url, kSignInPromoQueryKeyAccessPoint, |
| &value)) { |
| return signin_metrics::AccessPoint::ACCESS_POINT_UNKNOWN; |
| } |
| |
| int access_point = -1; |
| base::StringToInt(value, &access_point); |
| if (access_point < |
| static_cast<int>( |
| signin_metrics::AccessPoint::ACCESS_POINT_START_PAGE) || |
| access_point >= |
| static_cast<int>(signin_metrics::AccessPoint::ACCESS_POINT_MAX)) { |
| return signin_metrics::AccessPoint::ACCESS_POINT_UNKNOWN; |
| } |
| |
| return static_cast<signin_metrics::AccessPoint>(access_point); |
| } |
| |
| signin_metrics::Reason GetSigninReasonForEmbeddedPromoURL(const GURL& url) { |
| std::string value; |
| if (!net::GetValueForKeyInQuery(url, kSignInPromoQueryKeyReason, &value)) |
| return signin_metrics::Reason::REASON_UNKNOWN_REASON; |
| |
| int reason = -1; |
| base::StringToInt(value, &reason); |
| if (reason < static_cast<int>( |
| signin_metrics::Reason::REASON_SIGNIN_PRIMARY_ACCOUNT) || |
| reason >= static_cast<int>(signin_metrics::Reason::REASON_MAX)) { |
| return signin_metrics::Reason::REASON_UNKNOWN_REASON; |
| } |
| |
| return static_cast<signin_metrics::Reason>(reason); |
| } |
| |
| bool IsAutoCloseEnabledInEmbeddedURL(const GURL& url) { |
| std::string value; |
| if (net::GetValueForKeyInQuery(url, kSignInPromoQueryKeyAutoClose, &value)) { |
| int enabled = 0; |
| if (base::StringToInt(value, &enabled) && enabled == 1) |
| return true; |
| } |
| return false; |
| } |
| |
| void RegisterProfilePrefs( |
| user_prefs::PrefRegistrySyncable* registry) { |
| registry->RegisterIntegerPref(prefs::kDiceSigninUserMenuPromoCount, 0); |
| } |
| |
| } // namespace signin |