| Index: chrome/browser/ui/sync/one_click_signin_helper.cc
|
| ===================================================================
|
| --- chrome/browser/ui/sync/one_click_signin_helper.cc (revision 148749)
|
| +++ chrome/browser/ui/sync/one_click_signin_helper.cc (working copy)
|
| @@ -12,13 +12,13 @@
|
| #include "chrome/browser/browser_process.h"
|
| #include "chrome/browser/infobars/infobar_tab_helper.h"
|
| #include "chrome/browser/prefs/pref_service.h"
|
| +#include "chrome/browser/prefs/scoped_user_pref_update.h"
|
| #include "chrome/browser/profiles/profile.h"
|
| #include "chrome/browser/profiles/profile_info_cache.h"
|
| #include "chrome/browser/profiles/profile_manager.h"
|
| #include "chrome/browser/signin/signin_manager.h"
|
| #include "chrome/browser/signin/signin_manager_factory.h"
|
| #include "chrome/browser/sync/profile_sync_service.h"
|
| -#include "chrome/browser/sync/profile_sync_service_factory.h"
|
| #include "chrome/browser/tab_contents/confirm_infobar_delegate.h"
|
| #include "chrome/browser/tab_contents/tab_util.h"
|
| #include "chrome/browser/ui/browser_finder.h"
|
| @@ -72,6 +72,10 @@
|
| // show again in this profile.
|
| void DisableOneClickSignIn();
|
|
|
| + // Add a specific email to the list of emails rejected for one-click
|
| + // sign-in, for this profile.
|
| + void AddEmailToOneClickRejectedList(const std::string& email);
|
| +
|
| // Record the specified action in the histogram for one-click sign in.
|
| void RecordHistogramAction(int action);
|
|
|
| @@ -146,6 +150,8 @@
|
| } // namespace
|
|
|
| bool OneClickLoginInfoBarDelegate::Accept() {
|
| + // User has accepted one-click sign-in for this account. Never ask again for
|
| + // this profile.
|
| DisableOneClickSignIn();
|
| content::WebContents* web_contents = owner()->web_contents();
|
| RecordHistogramAction(one_click_signin::HISTOGRAM_ACCEPTED);
|
| @@ -157,7 +163,7 @@
|
| }
|
|
|
| bool OneClickLoginInfoBarDelegate::Cancel() {
|
| - DisableOneClickSignIn();
|
| + AddEmailToOneClickRejectedList(email_);
|
| RecordHistogramAction(one_click_signin::HISTOGRAM_REJECTED);
|
| button_pressed_ = true;
|
| return true;
|
| @@ -190,6 +196,16 @@
|
| pref_service->SetBoolean(prefs::kReverseAutologinEnabled, false);
|
| }
|
|
|
| +void OneClickLoginInfoBarDelegate::AddEmailToOneClickRejectedList(
|
| + const std::string& email) {
|
| + PrefService* pref_service =
|
| + TabContents::FromWebContents(owner()->web_contents())->
|
| + profile()->GetPrefs();
|
| + ListPrefUpdate updater(pref_service,
|
| + prefs::kReverseAutologinRejectedEmailList);
|
| + updater->AppendIfNotPresent(base::Value::CreateStringValue(email));
|
| +}
|
| +
|
| void OneClickLoginInfoBarDelegate::RecordHistogramAction(int action) {
|
| UMA_HISTOGRAM_ENUMERATION("AutoLogin.Reverse", action,
|
| one_click_signin::HISTOGRAM_MAX);
|
| @@ -197,6 +213,7 @@
|
|
|
| // static
|
| bool OneClickSigninHelper::CanOffer(content::WebContents* web_contents,
|
| + const std::string& email,
|
| bool check_connected) {
|
| if (!web_contents)
|
| return false;
|
| @@ -227,20 +244,37 @@
|
| if (!manager->GetAuthenticatedUsername().empty())
|
| return false;
|
|
|
| - // If we're about to show a one-click infobar but the user has started
|
| - // a concurrent signin flow (perhaps via the promo), we may not have yet
|
| - // established an authenticated username but we still shouldn't move
|
| - // forward with two simultaneous signin processes. This is a bit
|
| - // contentious as the one-click flow is a much smoother flow from the user
|
| - // perspective, but it's much more difficult to hijack the other flow from
|
| - // here as it is to bail.
|
| - ProfileSyncService* service =
|
| - ProfileSyncServiceFactory::GetForProfile(profile);
|
| - if (!service)
|
| + // Make sure this username is not prohibited by policy.
|
| + if (!manager->IsAllowedUsername(email))
|
| return false;
|
|
|
| - if (service->FirstSetupInProgress())
|
| - return false;
|
| + // If some profile, not just the current one, is already connected to this
|
| + // account, don't show the infobar.
|
| + if (g_browser_process) {
|
| + ProfileManager* manager = g_browser_process->profile_manager();
|
| + if (manager) {
|
| + string16 email16 = UTF8ToUTF16(email);
|
| + ProfileInfoCache& cache = manager->GetProfileInfoCache();
|
| +
|
| + for (size_t i = 0; i < cache.GetNumberOfProfiles(); ++i) {
|
| + if (email16 == cache.GetUserNameOfProfileAtIndex(i))
|
| + return false;
|
| + }
|
| + }
|
| + }
|
| +
|
| + // If email was already rejected by this profile for one-click sign-in.
|
| + if (!email.empty()) {
|
| + const ListValue* rejected_emails = profile->GetPrefs()->GetList(
|
| + prefs::kReverseAutologinRejectedEmailList);
|
| + if (!rejected_emails->empty()) {
|
| + const Value* email_value = Value::CreateStringValue(email);
|
| + ListValue::const_iterator iter = rejected_emails->Find(
|
| + *email_value);
|
| + if (iter != rejected_emails->end())
|
| + return false;
|
| + }
|
| + }
|
| }
|
|
|
| return true;
|
| @@ -298,29 +332,10 @@
|
|
|
| content::WebContents* web_contents = tab_util::GetWebContentsByID(child_id,
|
| route_id);
|
| - if (!web_contents || !CanOffer(web_contents, true))
|
| - return;
|
|
|
| - // If some profile, not just the current one, is already connected to this
|
| - // account, don't show the infobar.
|
| - if (g_browser_process) {
|
| - ProfileManager* manager = g_browser_process->profile_manager();
|
| - if (manager) {
|
| - string16 email16 = UTF8ToUTF16(email);
|
| - ProfileInfoCache& cache = manager->GetProfileInfoCache();
|
| -
|
| - for (size_t i = 0; i < cache.GetNumberOfProfiles(); ++i) {
|
| - if (email16 == cache.GetUserNameOfProfileAtIndex(i))
|
| - return;
|
| - }
|
| - }
|
| - }
|
| -
|
| - // Make sure this username is not prohibited by policy.
|
| - Profile* profile =
|
| - Profile::FromBrowserContext(web_contents->GetBrowserContext());
|
| - SigninManager* signin = SigninManagerFactory::GetForProfile(profile);
|
| - if (!signin->IsAllowedUsername(email))
|
| + // TODO(mathp): The appearance of this infobar should be tested using a
|
| + // browser_test.
|
| + if (!web_contents || !CanOffer(web_contents, email, true))
|
| return;
|
|
|
| TabContents* tab_contents = TabContents::FromWebContents(web_contents);
|
|
|