| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/signin/core/browser/account_reconcilor.h" | 5 #include "components/signin/core/browser/account_reconcilor.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/json/json_reader.h" | 10 #include "base/json/json_reader.h" |
| 11 #include "base/logging.h" | 11 #include "base/logging.h" |
| 12 #include "base/message_loop/message_loop.h" | 12 #include "base/message_loop/message_loop.h" |
| 13 #include "base/message_loop/message_loop_proxy.h" | 13 #include "base/message_loop/message_loop_proxy.h" |
| 14 #include "base/strings/string_number_conversions.h" | 14 #include "base/strings/string_number_conversions.h" |
| 15 #include "base/time/time.h" | 15 #include "base/time/time.h" |
| 16 #include "components/signin/core/browser/profile_oauth2_token_service.h" | 16 #include "components/signin/core/browser/profile_oauth2_token_service.h" |
| 17 #include "components/signin/core/browser/signin_client.h" | 17 #include "components/signin/core/browser/signin_client.h" |
| 18 #include "components/signin/core/browser/signin_metrics.h" |
| 18 #include "components/signin/core/browser/signin_oauth_helper.h" | 19 #include "components/signin/core/browser/signin_oauth_helper.h" |
| 19 #include "google_apis/gaia/gaia_auth_fetcher.h" | 20 #include "google_apis/gaia/gaia_auth_fetcher.h" |
| 20 #include "google_apis/gaia/gaia_auth_util.h" | 21 #include "google_apis/gaia/gaia_auth_util.h" |
| 21 #include "google_apis/gaia/gaia_constants.h" | 22 #include "google_apis/gaia/gaia_constants.h" |
| 22 #include "google_apis/gaia/gaia_oauth_client.h" | 23 #include "google_apis/gaia/gaia_oauth_client.h" |
| 23 #include "google_apis/gaia/gaia_urls.h" | 24 #include "google_apis/gaia/gaia_urls.h" |
| 24 #include "net/cookies/canonical_cookie.h" | 25 #include "net/cookies/canonical_cookie.h" |
| 25 | 26 |
| 26 | 27 |
| 27 namespace { | 28 namespace { |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 191 SigninClient* client) | 192 SigninClient* client) |
| 192 : OAuth2TokenService::Consumer("account_reconcilor"), | 193 : OAuth2TokenService::Consumer("account_reconcilor"), |
| 193 token_service_(token_service), | 194 token_service_(token_service), |
| 194 signin_manager_(signin_manager), | 195 signin_manager_(signin_manager), |
| 195 client_(client), | 196 client_(client), |
| 196 merge_session_helper_(token_service_, | 197 merge_session_helper_(token_service_, |
| 197 client->GetURLRequestContext(), | 198 client->GetURLRequestContext(), |
| 198 this), | 199 this), |
| 199 registered_with_token_service_(false), | 200 registered_with_token_service_(false), |
| 200 is_reconcile_started_(false), | 201 is_reconcile_started_(false), |
| 202 first_execution_(true), |
| 201 are_gaia_accounts_set_(false), | 203 are_gaia_accounts_set_(false), |
| 202 requests_(NULL) { | 204 requests_(NULL) { |
| 203 VLOG(1) << "AccountReconcilor::AccountReconcilor"; | 205 VLOG(1) << "AccountReconcilor::AccountReconcilor"; |
| 204 } | 206 } |
| 205 | 207 |
| 206 AccountReconcilor::~AccountReconcilor() { | 208 AccountReconcilor::~AccountReconcilor() { |
| 207 VLOG(1) << "AccountReconcilor::~AccountReconcilor"; | 209 VLOG(1) << "AccountReconcilor::~AccountReconcilor"; |
| 208 // Make sure shutdown was called first. | 210 // Make sure shutdown was called first. |
| 209 DCHECK(!registered_with_token_service_); | 211 DCHECK(!registered_with_token_service_); |
| 210 DCHECK(!requests_); | 212 DCHECK(!requests_); |
| (...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 602 ++i) { | 604 ++i) { |
| 603 if (*i != primary_account_) | 605 if (*i != primary_account_) |
| 604 add_to_cookie_.push_back(*i); | 606 add_to_cookie_.push_back(*i); |
| 605 } | 607 } |
| 606 | 608 |
| 607 // For each account known to chrome, PerformMergeAction() if the account is | 609 // For each account known to chrome, PerformMergeAction() if the account is |
| 608 // not already in the cookie jar or its state is invalid, or signal merge | 610 // not already in the cookie jar or its state is invalid, or signal merge |
| 609 // completed otherwise. Make a copy of |add_to_cookie_| since calls to | 611 // completed otherwise. Make a copy of |add_to_cookie_| since calls to |
| 610 // SignalComplete() will change the array. | 612 // SignalComplete() will change the array. |
| 611 std::vector<std::string> add_to_cookie_copy = add_to_cookie_; | 613 std::vector<std::string> add_to_cookie_copy = add_to_cookie_; |
| 614 int added_to_cookie = 0; |
| 612 for (size_t i = 0; i < add_to_cookie_copy.size(); ++i) { | 615 for (size_t i = 0; i < add_to_cookie_copy.size(); ++i) { |
| 613 if (gaia_accounts_.end() != | 616 if (gaia_accounts_.end() != |
| 614 std::find_if(gaia_accounts_.begin(), | 617 std::find_if(gaia_accounts_.begin(), |
| 615 gaia_accounts_.end(), | 618 gaia_accounts_.end(), |
| 616 std::bind1st(EmailEqualToFunc(), | 619 std::bind1st(EmailEqualToFunc(), |
| 617 std::make_pair(add_to_cookie_copy[i], | 620 std::make_pair(add_to_cookie_copy[i], |
| 618 true)))) { | 621 true)))) { |
| 619 merge_session_helper_.SignalComplete( | 622 merge_session_helper_.SignalComplete( |
| 620 add_to_cookie_copy[i], | 623 add_to_cookie_copy[i], |
| 621 GoogleServiceAuthError::AuthErrorNone()); | 624 GoogleServiceAuthError::AuthErrorNone()); |
| 622 } else { | 625 } else { |
| 623 PerformMergeAction(add_to_cookie_copy[i]); | 626 PerformMergeAction(add_to_cookie_copy[i]); |
| 627 added_to_cookie++; |
| 624 } | 628 } |
| 625 } | 629 } |
| 626 | 630 |
| 627 // For each account in the gaia cookie not known to chrome, | 631 // For each account in the gaia cookie not known to chrome, |
| 628 // PerformAddToChromeAction. | 632 // PerformAddToChromeAction. |
| 629 for (std::vector<std::pair<std::string, int> >::const_iterator i = | 633 for (std::vector<std::pair<std::string, int> >::const_iterator i = |
| 630 add_to_chrome_.begin(); | 634 add_to_chrome_.begin(); |
| 631 i != add_to_chrome_.end(); | 635 i != add_to_chrome_.end(); |
| 632 ++i) { | 636 ++i) { |
| 633 PerformAddToChromeAction(i->first, i->second); | 637 PerformAddToChromeAction(i->first, i->second); |
| 634 } | 638 } |
| 635 | 639 |
| 640 signin_metrics::LogSigninAccountReconciliation(valid_chrome_accounts_.size(), |
| 641 added_to_cookie, |
| 642 add_to_chrome_.size(), |
| 643 are_primaries_equal, |
| 644 first_execution_); |
| 645 first_execution_ = false; |
| 636 CalculateIfReconcileIsDone(); | 646 CalculateIfReconcileIsDone(); |
| 637 ScheduleStartReconcileIfChromeAccountsChanged(); | 647 ScheduleStartReconcileIfChromeAccountsChanged(); |
| 638 } | 648 } |
| 639 | 649 |
| 640 void AccountReconcilor::AbortReconcile() { | 650 void AccountReconcilor::AbortReconcile() { |
| 641 VLOG(1) << "AccountReconcilor::AbortReconcile: we'll try again later"; | 651 VLOG(1) << "AccountReconcilor::AbortReconcile: we'll try again later"; |
| 642 DeleteFetchers(); | 652 DeleteFetchers(); |
| 643 add_to_cookie_.clear(); | 653 add_to_cookie_.clear(); |
| 644 add_to_chrome_.clear(); | 654 add_to_chrome_.clear(); |
| 645 CalculateIfReconcileIsDone(); | 655 CalculateIfReconcileIsDone(); |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 713 i != add_to_chrome_.end(); | 723 i != add_to_chrome_.end(); |
| 714 ++i) { | 724 ++i) { |
| 715 if (gaia::AreEmailsSame(account_id, i->first)) { | 725 if (gaia::AreEmailsSame(account_id, i->first)) { |
| 716 add_to_chrome_.erase(i); | 726 add_to_chrome_.erase(i); |
| 717 break; | 727 break; |
| 718 } | 728 } |
| 719 } | 729 } |
| 720 | 730 |
| 721 CalculateIfReconcileIsDone(); | 731 CalculateIfReconcileIsDone(); |
| 722 } | 732 } |
| OLD | NEW |