OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/about_signin_internals.h" | 5 #include "components/signin/core/browser/about_signin_internals.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
| 9 #include <tuple> |
9 #include <utility> | 10 #include <utility> |
10 | 11 |
11 #include "base/command_line.h" | 12 #include "base/command_line.h" |
12 #include "base/hash.h" | 13 #include "base/hash.h" |
13 #include "base/i18n/time_formatting.h" | 14 #include "base/i18n/time_formatting.h" |
14 #include "base/logging.h" | 15 #include "base/logging.h" |
| 16 #include "base/memory/ptr_util.h" |
15 #include "base/profiler/scoped_tracker.h" | 17 #include "base/profiler/scoped_tracker.h" |
16 #include "base/strings/stringprintf.h" | 18 #include "base/strings/stringprintf.h" |
17 #include "base/strings/utf_string_conversions.h" | 19 #include "base/strings/utf_string_conversions.h" |
18 #include "base/trace_event/trace_event.h" | 20 #include "base/trace_event/trace_event.h" |
19 #include "build/build_config.h" | 21 #include "build/build_config.h" |
20 #include "components/pref_registry/pref_registry_syncable.h" | 22 #include "components/pref_registry/pref_registry_syncable.h" |
21 #include "components/prefs/pref_service.h" | 23 #include "components/prefs/pref_service.h" |
22 #include "components/signin/core/browser/account_tracker_service.h" | 24 #include "components/signin/core/browser/account_tracker_service.h" |
23 #include "components/signin/core/browser/profile_oauth2_token_service.h" | 25 #include "components/signin/core/browser/profile_oauth2_token_service.h" |
24 #include "components/signin/core/browser/signin_client.h" | 26 #include "components/signin/core/browser/signin_client.h" |
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
299 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/422460 is | 301 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/422460 is |
300 // fixed. | 302 // fixed. |
301 tracked_objects::ScopedTracker tracking_profile( | 303 tracked_objects::ScopedTracker tracking_profile( |
302 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 304 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
303 "422460 AboutSigninInternals::OnAccessTokenRequested")); | 305 "422460 AboutSigninInternals::OnAccessTokenRequested")); |
304 | 306 |
305 TokenInfo* token = signin_status_.FindToken(account_id, consumer_id, scopes); | 307 TokenInfo* token = signin_status_.FindToken(account_id, consumer_id, scopes); |
306 if (token) { | 308 if (token) { |
307 *token = TokenInfo(consumer_id, scopes); | 309 *token = TokenInfo(consumer_id, scopes); |
308 } else { | 310 } else { |
309 token = new TokenInfo(consumer_id, scopes); | 311 signin_status_.token_info_map[account_id].push_back( |
310 signin_status_.token_info_map[account_id].push_back(token); | 312 base::MakeUnique<TokenInfo>(consumer_id, scopes)); |
311 } | 313 } |
312 | 314 |
313 NotifyObservers(); | 315 NotifyObservers(); |
314 } | 316 } |
315 | 317 |
316 void AboutSigninInternals::OnFetchAccessTokenComplete( | 318 void AboutSigninInternals::OnFetchAccessTokenComplete( |
317 const std::string& account_id, | 319 const std::string& account_id, |
318 const std::string& consumer_id, | 320 const std::string& consumer_id, |
319 const OAuth2TokenService::ScopeSet& scopes, | 321 const OAuth2TokenService::ScopeSet& scopes, |
320 GoogleServiceAuthError error, | 322 GoogleServiceAuthError error, |
321 base::Time expiration_time) { | 323 base::Time expiration_time) { |
322 TokenInfo* token = signin_status_.FindToken(account_id, consumer_id, scopes); | 324 TokenInfo* token = signin_status_.FindToken(account_id, consumer_id, scopes); |
323 if (!token) { | 325 if (!token) { |
324 DVLOG(1) << "Can't find token: " << account_id << ", " << consumer_id; | 326 DVLOG(1) << "Can't find token: " << account_id << ", " << consumer_id; |
325 return; | 327 return; |
326 } | 328 } |
327 | 329 |
328 token->receive_time = base::Time::Now(); | 330 token->receive_time = base::Time::Now(); |
329 token->error = error; | 331 token->error = error; |
330 token->expiration_time = expiration_time; | 332 token->expiration_time = expiration_time; |
331 | 333 |
332 NotifyObservers(); | 334 NotifyObservers(); |
333 } | 335 } |
334 | 336 |
335 void AboutSigninInternals::OnTokenRemoved( | 337 void AboutSigninInternals::OnTokenRemoved( |
336 const std::string& account_id, | 338 const std::string& account_id, |
337 const OAuth2TokenService::ScopeSet& scopes) { | 339 const OAuth2TokenService::ScopeSet& scopes) { |
338 for (size_t i = 0; i < signin_status_.token_info_map[account_id].size(); | 340 for (const std::unique_ptr<TokenInfo>& token : |
339 ++i) { | 341 signin_status_.token_info_map[account_id]) { |
340 TokenInfo* token = signin_status_.token_info_map[account_id][i]; | |
341 if (token->scopes == scopes) | 342 if (token->scopes == scopes) |
342 token->Invalidate(); | 343 token->Invalidate(); |
343 } | 344 } |
344 NotifyObservers(); | 345 NotifyObservers(); |
345 } | 346 } |
346 | 347 |
347 void AboutSigninInternals::OnRefreshTokenReceived(const std::string& status) { | 348 void AboutSigninInternals::OnRefreshTokenReceived(const std::string& status) { |
348 NotifySigninValueChanged(REFRESH_TOKEN_RECEIVED, status); | 349 NotifySigninValueChanged(REFRESH_TOKEN_RECEIVED, status); |
349 } | 350 } |
350 | 351 |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
407 const std::string& consumer_id, | 408 const std::string& consumer_id, |
408 const OAuth2TokenService::ScopeSet& scopes) | 409 const OAuth2TokenService::ScopeSet& scopes) |
409 : consumer_id(consumer_id), | 410 : consumer_id(consumer_id), |
410 scopes(scopes), | 411 scopes(scopes), |
411 request_time(base::Time::Now()), | 412 request_time(base::Time::Now()), |
412 error(GoogleServiceAuthError::AuthErrorNone()), | 413 error(GoogleServiceAuthError::AuthErrorNone()), |
413 removed_(false) {} | 414 removed_(false) {} |
414 | 415 |
415 AboutSigninInternals::TokenInfo::~TokenInfo() {} | 416 AboutSigninInternals::TokenInfo::~TokenInfo() {} |
416 | 417 |
417 bool AboutSigninInternals::TokenInfo::LessThan(const TokenInfo* a, | 418 bool AboutSigninInternals::TokenInfo::LessThan( |
418 const TokenInfo* b) { | 419 const std::unique_ptr<TokenInfo>& a, |
419 if (a->request_time == b->request_time) { | 420 const std::unique_ptr<TokenInfo>& b) { |
420 if (a->consumer_id == b->consumer_id) { | 421 return std::tie(a->request_time, a->consumer_id, a->scopes) < |
421 return a->scopes < b->scopes; | 422 std::tie(b->request_time, b->consumer_id, b->scopes); |
422 } | |
423 return a->consumer_id < b->consumer_id; | |
424 } | |
425 return a->request_time < b->request_time; | |
426 } | 423 } |
427 | 424 |
428 void AboutSigninInternals::TokenInfo::Invalidate() { removed_ = true; } | 425 void AboutSigninInternals::TokenInfo::Invalidate() { removed_ = true; } |
429 | 426 |
430 std::unique_ptr<base::DictionaryValue> | 427 std::unique_ptr<base::DictionaryValue> |
431 AboutSigninInternals::TokenInfo::ToValue() const { | 428 AboutSigninInternals::TokenInfo::ToValue() const { |
432 std::unique_ptr<base::DictionaryValue> token_info( | 429 std::unique_ptr<base::DictionaryValue> token_info( |
433 new base::DictionaryValue()); | 430 new base::DictionaryValue()); |
434 token_info->SetString("service", consumer_id); | 431 token_info->SetString("service", consumer_id); |
435 | 432 |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
469 } else { | 466 } else { |
470 token_info->SetString("status", "Waiting for response"); | 467 token_info->SetString("status", "Waiting for response"); |
471 } | 468 } |
472 | 469 |
473 return token_info; | 470 return token_info; |
474 } | 471 } |
475 | 472 |
476 AboutSigninInternals::SigninStatus::SigninStatus() | 473 AboutSigninInternals::SigninStatus::SigninStatus() |
477 : timed_signin_fields(TIMED_FIELDS_COUNT) {} | 474 : timed_signin_fields(TIMED_FIELDS_COUNT) {} |
478 | 475 |
479 AboutSigninInternals::SigninStatus::~SigninStatus() { | 476 AboutSigninInternals::SigninStatus::~SigninStatus() {} |
480 for (TokenInfoMap::iterator it = token_info_map.begin(); | |
481 it != token_info_map.end(); | |
482 ++it) { | |
483 base::STLDeleteElements(&it->second); | |
484 } | |
485 } | |
486 | 477 |
487 AboutSigninInternals::TokenInfo* AboutSigninInternals::SigninStatus::FindToken( | 478 AboutSigninInternals::TokenInfo* AboutSigninInternals::SigninStatus::FindToken( |
488 const std::string& account_id, | 479 const std::string& account_id, |
489 const std::string& consumer_id, | 480 const std::string& consumer_id, |
490 const OAuth2TokenService::ScopeSet& scopes) { | 481 const OAuth2TokenService::ScopeSet& scopes) { |
491 for (size_t i = 0; i < token_info_map[account_id].size(); ++i) { | 482 for (const std::unique_ptr<TokenInfo>& token : token_info_map[account_id]) { |
492 TokenInfo* tmp = token_info_map[account_id][i]; | 483 if (token->consumer_id == consumer_id && token->scopes == scopes) |
493 if (tmp->consumer_id == consumer_id && tmp->scopes == scopes) | 484 return token.get(); |
494 return tmp; | |
495 } | 485 } |
496 return NULL; | 486 return nullptr; |
497 } | 487 } |
498 | 488 |
499 std::unique_ptr<base::DictionaryValue> | 489 std::unique_ptr<base::DictionaryValue> |
500 AboutSigninInternals::SigninStatus::ToValue( | 490 AboutSigninInternals::SigninStatus::ToValue( |
501 AccountTrackerService* account_tracker, | 491 AccountTrackerService* account_tracker, |
502 SigninManagerBase* signin_manager, | 492 SigninManagerBase* signin_manager, |
503 SigninErrorController* signin_error_controller, | 493 SigninErrorController* signin_error_controller, |
504 ProfileOAuth2TokenService* token_service, | 494 ProfileOAuth2TokenService* token_service, |
505 GaiaCookieManagerService* cookie_manager_service_, | 495 GaiaCookieManagerService* cookie_manager_service_, |
506 const std::string& product_version) { | 496 const std::string& product_version) { |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
618 | 608 |
619 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/422460 is | 609 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/422460 is |
620 // fixed. | 610 // fixed. |
621 tracked_objects::ScopedTracker tracking_profile4( | 611 tracked_objects::ScopedTracker tracking_profile4( |
622 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 612 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
623 "422460 AboutSigninInternals::SigninStatus::ToValue4")); | 613 "422460 AboutSigninInternals::SigninStatus::ToValue4")); |
624 | 614 |
625 // Token information for all services. | 615 // Token information for all services. |
626 base::ListValue* token_info = new base::ListValue(); | 616 base::ListValue* token_info = new base::ListValue(); |
627 signin_status->Set("token_info", token_info); | 617 signin_status->Set("token_info", token_info); |
628 for (TokenInfoMap::iterator it = token_info_map.begin(); | 618 for (auto it = token_info_map.begin(); it != token_info_map.end(); ++it) { |
629 it != token_info_map.end(); | |
630 ++it) { | |
631 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/422460 | 619 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/422460 |
632 // is fixed. | 620 // is fixed. |
633 tracked_objects::ScopedTracker tracking_profile41( | 621 tracked_objects::ScopedTracker tracking_profile41( |
634 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 622 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
635 "422460 AboutSigninInternals::SigninStatus::ToValue41")); | 623 "422460 AboutSigninInternals::SigninStatus::ToValue41")); |
636 | 624 |
637 base::ListValue* token_details = AddSection(token_info, it->first); | 625 base::ListValue* token_details = AddSection(token_info, it->first); |
638 | 626 |
639 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/422460 | 627 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/422460 |
640 // is fixed. | 628 // is fixed. |
641 tracked_objects::ScopedTracker tracking_profile42( | 629 tracked_objects::ScopedTracker tracking_profile42( |
642 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 630 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
643 "422460 AboutSigninInternals::SigninStatus::ToValue42")); | 631 "422460 AboutSigninInternals::SigninStatus::ToValue42")); |
644 | 632 |
645 std::sort(it->second.begin(), it->second.end(), TokenInfo::LessThan); | 633 std::sort(it->second.begin(), it->second.end(), TokenInfo::LessThan); |
646 const std::vector<TokenInfo*>& tokens = it->second; | 634 const auto& tokens = it->second; |
647 | 635 |
648 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/422460 | 636 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/422460 |
649 // is fixed. | 637 // is fixed. |
650 tracked_objects::ScopedTracker tracking_profile43( | 638 tracked_objects::ScopedTracker tracking_profile43( |
651 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 639 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
652 "422460 AboutSigninInternals::SigninStatus::ToValue43")); | 640 "422460 AboutSigninInternals::SigninStatus::ToValue43")); |
653 | 641 |
654 for (size_t i = 0; i < tokens.size(); ++i) { | 642 for (const std::unique_ptr<TokenInfo>& token : tokens) { |
655 token_details->Append(tokens[i]->ToValue()); | 643 token_details->Append(token->ToValue()); |
656 } | 644 } |
657 } | 645 } |
658 | 646 |
659 base::ListValue* account_info = new base::ListValue(); | 647 base::ListValue* account_info = new base::ListValue(); |
660 signin_status->Set("accountInfo", account_info); | 648 signin_status->Set("accountInfo", account_info); |
661 const std::vector<std::string>& accounts_in_token_service = | 649 const std::vector<std::string>& accounts_in_token_service = |
662 token_service->GetAccounts(); | 650 token_service->GetAccounts(); |
663 | 651 |
664 if(accounts_in_token_service.size() == 0) { | 652 if(accounts_in_token_service.size() == 0) { |
665 std::unique_ptr<base::DictionaryValue> no_token_entry( | 653 std::unique_ptr<base::DictionaryValue> no_token_entry( |
666 new base::DictionaryValue()); | 654 new base::DictionaryValue()); |
667 no_token_entry->SetString("accountId", "No token in Token Service."); | 655 no_token_entry->SetString("accountId", "No token in Token Service."); |
668 account_info->Append(std::move(no_token_entry)); | 656 account_info->Append(std::move(no_token_entry)); |
669 } | 657 } |
670 | 658 |
671 for(const std::string& account_id : accounts_in_token_service) { | 659 for(const std::string& account_id : accounts_in_token_service) { |
672 std::unique_ptr<base::DictionaryValue> entry(new base::DictionaryValue()); | 660 std::unique_ptr<base::DictionaryValue> entry(new base::DictionaryValue()); |
673 entry->SetString("accountId", account_id); | 661 entry->SetString("accountId", account_id); |
674 account_info->Append(std::move(entry)); | 662 account_info->Append(std::move(entry)); |
675 } | 663 } |
676 | 664 |
677 return signin_status; | 665 return signin_status; |
678 } | 666 } |
OLD | NEW |