1a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// found in the LICENSE file.
4a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
5a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/signin/signin_promo.h"
6a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
7a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/prefs/pref_service.h"
8a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
9a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/strings/string_util.h"
10a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/strings/stringprintf.h"
11a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
12a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/browser_process.h"
13a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/first_run/first_run.h"
1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/google/google_brand.h"
15a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
16a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/profiles/profile_info_cache.h"
17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h"
18a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h"
19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/ui/webui/options/core_options_handler.h"
20a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/ui/webui/theme_source.h"
21a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/common/net/url_util.h"
22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/common/pref_names.h"
23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/common/url_constants.h"
246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "components/google/core/browser/google_util.h"
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/pref_registry/pref_registry_syncable.h"
26e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "components/signin/core/browser/signin_manager.h"
270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/signin/core/common/profile_management_switches.h"
28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/public/browser/url_data_source.h"
29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/public/browser/web_contents.h"
30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/public/browser/web_ui.h"
31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/public/browser/web_ui_data_source.h"
32a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "google_apis/gaia/gaia_urls.h"
33a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "grit/browser_resources.h"
34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "grit/generated_resources.h"
35a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "grit/theme_resources.h"
36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "net/base/escape.h"
37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "net/base/network_change_notifier.h"
38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "net/base/url_util.h"
39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
40c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "url/gurl.h"
41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using content::WebContents;
43c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochusing net::GetValueForKeyInQuery;
44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace {
46a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
47a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Gaia cannot support about:blank as a continue URL, so using a hosted blank
48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// page instead.
49a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)const char kSignInLandingUrlPrefix[] =
50a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    "https://www.google.com/intl/%s/chrome/blank.html";
51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// The maximum number of times we want to show the sign in promo at startup.
53a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)const int kSignInPromoShowAtStartupMaximum = 10;
54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Forces the web based signin flow when set.
56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool g_force_web_based_signin_flow = false;
57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Checks we want to show the sign in promo for the given brand.
59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool AllowPromoAtStartupForCurrentBrand() {
60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::string brand;
6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  google_brand::GetBrand(&brand);
62a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (brand.empty())
64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return true;
65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (google_brand::IsInternetCafeBrandCode(brand))
67a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return false;
68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
69a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Enable for both organic and distribution.
70a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return true;
71a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
72a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Returns true if a user has seen the sign in promo at startup previously.
74a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool HasShownPromoAtStartup(Profile* profile) {
75bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  return profile->GetPrefs()->HasPrefPath(prefs::kSignInPromoStartupCount);
76a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
77a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Returns true if the user has previously skipped the sign in promo.
79a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool HasUserSkippedPromo(Profile* profile) {
80bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  return profile->GetPrefs()->GetBoolean(prefs::kSignInPromoUserSkipped);
81a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
82a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
83a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}  // namespace
84a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
85a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace signin {
86a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
87a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool ShouldShowPromo(Profile* profile) {
88a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#if defined(OS_CHROMEOS)
89a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // There's no need to show the sign in promo on cros since cros users are
90a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // already logged in.
91a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return false;
92a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#else
93a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
94a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Don't bother if we don't have any kind of network connection.
95a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (net::NetworkChangeNotifier::IsOffline())
96a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return false;
97a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Don't show for supervised profiles.
99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (profile->IsSupervised())
100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return false;
101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Display the signin promo if the user is not signed in.
103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SigninManager* signin = SigninManagerFactory::GetForProfile(
104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      profile->GetOriginalProfile());
105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return !signin->AuthInProgress() && signin->IsSigninAllowed() &&
106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      signin->GetAuthenticatedUsername().empty();
107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif
108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
109a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
110a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool ShouldShowPromoAtStartup(Profile* profile, bool is_new_profile) {
111a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DCHECK(profile);
112a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
113a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Don't show if the profile is an incognito.
114a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (profile->IsOffTheRecord())
115a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return false;
116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!ShouldShowPromo(profile))
118a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return false;
119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
120a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!is_new_profile) {
121a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    if (!HasShownPromoAtStartup(profile))
122a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      return false;
123a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
124a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
125a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (HasUserSkippedPromo(profile))
126a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return false;
127a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
128a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // For Chinese users skip the sign in promo.
129a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (g_browser_process->GetApplicationLocale() == "zh-CN")
130a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return false;
131a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
132a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  PrefService* prefs = profile->GetPrefs();
133bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  int show_count = prefs->GetInteger(prefs::kSignInPromoStartupCount);
134a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (show_count >= kSignInPromoShowAtStartupMaximum)
135a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return false;
136a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
137a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // This pref can be set in the master preferences file to allow or disallow
138a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // showing the sign in promo at startup.
139bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  if (prefs->HasPrefPath(prefs::kSignInPromoShowOnFirstRunAllowed))
140bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    return prefs->GetBoolean(prefs::kSignInPromoShowOnFirstRunAllowed);
141a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
142a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // For now don't show the promo for some brands.
143a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!AllowPromoAtStartupForCurrentBrand())
144a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return false;
145a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
146a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Default to show the promo for Google Chrome builds.
147a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#if defined(GOOGLE_CHROME_BUILD)
148a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return true;
149a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#else
150a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return false;
151a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif
152a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
153a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
154a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void DidShowPromoAtStartup(Profile* profile) {
155a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  int show_count = profile->GetPrefs()->GetInteger(
156bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      prefs::kSignInPromoStartupCount);
157a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  show_count++;
158bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  profile->GetPrefs()->SetInteger(prefs::kSignInPromoStartupCount, show_count);
159a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
160a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
161a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void SetUserSkippedPromo(Profile* profile) {
162bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  profile->GetPrefs()->SetBoolean(prefs::kSignInPromoUserSkipped, true);
163a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
164a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
165a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)GURL GetLandingURL(const char* option, int value) {
166a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const std::string& locale = g_browser_process->GetApplicationLocale();
167a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::string url = base::StringPrintf(kSignInLandingUrlPrefix, locale.c_str());
168a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  base::StringAppendF(&url, "?%s=%d", option, value);
169a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return GURL(url);
170a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
171a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
172a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)GURL GetPromoURL(Source source, bool auto_close) {
173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return GetPromoURL(source, auto_close, false /* is_constrained */);
174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)GURL GetPromoURL(Source source, bool auto_close, bool is_constrained) {
177c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return GetPromoURLWithContinueURL(source, auto_close, is_constrained, GURL());
178c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
179c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
180c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochGURL GetPromoURLWithContinueURL(Source source,
181c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                bool auto_close,
182c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                bool is_constrained,
183c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                GURL continue_url) {
184a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DCHECK_NE(SOURCE_UNKNOWN, source);
185a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!switches::IsEnableWebBasedSignin()) {
187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    std::string url(chrome::kChromeUIChromeSigninURL);
1888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    base::StringAppendF(&url, "?%s=%d", kSignInPromoQueryKeySource, source);
1898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    if (auto_close)
190a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      base::StringAppendF(&url, "&%s=1", kSignInPromoQueryKeyAutoClose);
191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (is_constrained)
192a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      base::StringAppendF(&url, "&%s=1", kSignInPromoQueryKeyConstrained);
193c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    if (!continue_url.is_empty()) {
194c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      DCHECK(continue_url.is_valid());
195c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      std::string escaped_continue_url =
196c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          net::EscapeQueryParamValue(continue_url.spec(), false);
197c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      base::StringAppendF(&url,
198c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                          "&%s=%s",
199c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                          kSignInPromoQueryKeyContinue,
200c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                          escaped_continue_url.c_str());
201c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    }
2028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return GURL(url);
2038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
205a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Build a Gaia-based URL that can be used to sign the user into chrome.
206a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // There are required request parameters:
207a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  //
208a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  //  - tell Gaia which service the user is signing into.  In this case,
209a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  //    a chrome sign in uses the service "chromiumsync"
210a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  //  - provide a continue URL.  This is the URL that Gaia will redirect to
211a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  //    once the sign is complete.
212a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  //
213a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // The continue URL includes a source parameter that can be extracted using
214a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // the function GetSourceForSignInPromoURL() below.  This is used to know
215a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // which of the chrome sign in access points was used to sign the user in.
216a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // It is also parsed for the |auto_close| flag, which indicates that the tab
217a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // must be closed after sync setup is successful.
218a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // See OneClickSigninHelper for details.
219d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  std::string query_string = "?service=chromiumsync&sarp=1";
220a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
221c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DCHECK(continue_url.is_empty());
222c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  std::string continue_url_str = GetLandingURL(kSignInPromoQueryKeySource,
223c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                               static_cast<int>(source)).spec();
224c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (auto_close) {
225c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    base::StringAppendF(
226c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        &continue_url_str, "&%s=1", kSignInPromoQueryKeyAutoClose);
227c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
228a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
229c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  base::StringAppendF(
230c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      &query_string,
231c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "&%s=%s",
232c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      kSignInPromoQueryKeyContinue,
233c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      net::EscapeQueryParamValue(continue_url_str, false).c_str());
234a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
235d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return GaiaUrls::GetInstance()->service_login_url().Resolve(query_string);
236a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
237a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)GURL GetReauthURL(Profile* profile, const std::string& account_id) {
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (switches::IsEnableWebBasedSignin()) {
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return net::AppendQueryParameter(
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        signin::GetPromoURL(signin::SOURCE_SETTINGS, true),
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        "Email",
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        account_id);
2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  signin::Source source = switches::IsNewProfileManagement() ?
247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      signin::SOURCE_REAUTH : signin::SOURCE_SETTINGS;
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GURL url = signin::GetPromoURL(
250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      source, true /* auto_close */,
251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      switches::IsNewProfileManagement() /* is_constrained */);
2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  url = net::AppendQueryParameter(url, "email", account_id);
2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  url = net::AppendQueryParameter(url, "validateEmail", "1");
2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return net::AppendQueryParameter(url, "readOnlyEmail", "1");
2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
257a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)GURL GetNextPageURLForPromoURL(const GURL& url) {
258a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::string value;
259c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (GetValueForKeyInQuery(url, kSignInPromoQueryKeyContinue, &value)) {
260c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    GURL continue_url = GURL(value);
261c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    if (continue_url.is_valid())
262c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      return continue_url;
263c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
264a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
265a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return GURL();
266a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
267a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
268a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)Source GetSourceForPromoURL(const GURL& url) {
269a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::string value;
270c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (GetValueForKeyInQuery(url, kSignInPromoQueryKeySource, &value)) {
271a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    int source = 0;
272a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    if (base::StringToInt(value, &source) && source >= SOURCE_START_PAGE &&
273a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        source < SOURCE_UNKNOWN) {
274a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      return static_cast<Source>(source);
275a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
276a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
277a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return SOURCE_UNKNOWN;
278a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
279a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
280a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool IsAutoCloseEnabledInURL(const GURL& url) {
281a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::string value;
282c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (GetValueForKeyInQuery(url, kSignInPromoQueryKeyAutoClose, &value)) {
283a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    int enabled = 0;
284a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    if (base::StringToInt(value, &enabled) && enabled == 1)
285a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      return true;
286a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
287a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return false;
288a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
289a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
290f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool ShouldShowAccountManagement(const GURL& url) {
291f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string value;
292f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (GetValueForKeyInQuery(
293f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          url, kSignInPromoQueryKeyShowAccountManagement, &value)) {
294f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    int enabled = 0;
295f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (base::StringToInt(value, &enabled) && enabled == 1)
296f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return true;
297f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
298f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return false;
299f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
300f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
301a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool IsContinueUrlForWebBasedSigninFlow(const GURL& url) {
302a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  GURL::Replacements replacements;
303a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  replacements.ClearQuery();
304a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const std::string& locale = g_browser_process->GetApplicationLocale();
3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GURL continue_url =
306a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      GURL(base::StringPrintf(kSignInLandingUrlPrefix, locale.c_str()));
3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return (
3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      google_util::IsGoogleDomainUrl(
3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          url,
3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          google_util::ALLOW_SUBDOMAIN,
3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          google_util::DISALLOW_NON_STANDARD_PORTS) &&
3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      url.ReplaceComponents(replacements).path() ==
3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        continue_url.ReplaceComponents(replacements).path());
314a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
315a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
316a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void ForceWebBasedSigninFlowForTesting(bool force) {
317a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  g_force_web_based_signin_flow = force;
318a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
319a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
320a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void RegisterProfilePrefs(
321a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    user_prefs::PrefRegistrySyncable* registry) {
322a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  registry->RegisterIntegerPref(
323bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      prefs::kSignInPromoStartupCount,
324a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      0,
325a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
326a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  registry->RegisterBooleanPref(
327bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      prefs::kSignInPromoUserSkipped,
328a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      false,
329a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
330a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  registry->RegisterBooleanPref(
331bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      prefs::kSignInPromoShowOnFirstRunAllowed,
332a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      true,
333a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
334a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  registry->RegisterBooleanPref(
335bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      prefs::kSignInPromoShowNTPBubble,
336a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      false,
337a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
338a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
339a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
340a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}  // namespace signin
341