about_signin_internals.cc revision 5f1c94371a64b3196d4be9466099bb892df9b88e
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "components/signin/core/browser/about_signin_internals.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 70529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/command_line.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/debug/trace_event.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/hash.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/i18n/time_formatting.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/stringprintf.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/profile_oauth2_token_service.h" 16e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "components/signin/core/browser/signin_client.h" 17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/signin_internals_util.h" 18e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "components/signin/core/browser/signin_manager.h" 190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/signin/core/common/profile_management_switches.h" 200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/signin/core/common/signin_switches.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "google_apis/gaia/gaia_constants.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using base::Time; 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using namespace signin_internals_util; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace { 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::string GetTimeStr(base::Time time) { 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::UTF16ToUTF8(base::TimeFormatShortDateAndTime(time)); 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::ListValue* AddSection(base::ListValue* parent_list, 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& title) { 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::DictionaryValue> section(new base::DictionaryValue()); 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ListValue* section_contents = new base::ListValue(); 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) section->SetString("title", title); 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) section->Set("data", section_contents); 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) parent_list->Append(section.release()); 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return section_contents; 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AddSectionEntry(base::ListValue* section_list, 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& field_name, 455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const std::string& field_status, 465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const std::string& field_time = "") { 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::DictionaryValue> entry(new base::DictionaryValue()); 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) entry->SetString("label", field_name); 495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu entry->SetString("status", field_status); 505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu entry->SetString("time", field_time); 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) section_list->Append(entry.release()); 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::string SigninStatusFieldToLabel(UntimedSigninStatusField field) { 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (field) { 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case USERNAME: 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return "User Id"; 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case UNTIMED_FIELDS_END: 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTREACHED(); 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return std::string(); 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTREACHED(); 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return std::string(); 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if !defined (OS_CHROMEOS) 675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustd::string SigninStatusFieldToLabel(TimedSigninStatusField field) { 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (field) { 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case SIGNIN_TYPE: 705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return "Type"; 71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) case AUTHENTICATION_RESULT_RECEIVED: 72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return "Last Authentication Result Received"; 73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) case REFRESH_TOKEN_RECEIVED: 74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return "Last RefreshToken Received"; 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case GET_USER_INFO_STATUS: 76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return "Last OnGetUserInfo Received"; 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case UBER_TOKEN_STATUS: 78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return "Last OnUberToken Received"; 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case MERGE_SESSION_STATUS: 80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return "Last OnMergeSession Received"; 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case TIMED_FIELDS_END: 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTREACHED(); 835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return "Error"; 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTREACHED(); 865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return "Error"; 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif // !defined (OS_CHROMEOS) 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // anonymous namespace 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 92e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochAboutSigninInternals::AboutSigninInternals( 93e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ProfileOAuth2TokenService* token_service, 94e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch SigninManagerBase* signin_manager) 95e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch : token_service_(token_service), 96e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch signin_manager_(signin_manager), 97e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch client_(NULL) {} 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 99e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochAboutSigninInternals::~AboutSigninInternals() {} 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AboutSigninInternals::AddSigninObserver( 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AboutSigninInternals::Observer* observer) { 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) signin_observers_.AddObserver(observer); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AboutSigninInternals::RemoveSigninObserver( 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AboutSigninInternals::Observer* observer) { 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) signin_observers_.RemoveObserver(observer); 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AboutSigninInternals::NotifySigninValueChanged( 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const UntimedSigninStatusField& field, 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& value) { 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned int field_index = field - UNTIMED_FIELDS_BEGIN; 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(field_index >= 0 && 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) field_index < signin_status_.untimed_signin_fields.size()); 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) signin_status_.untimed_signin_fields[field_index] = value; 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Also persist these values in the prefs. 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string pref_path = SigninStatusFieldToString(field); 122e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch client_->GetPrefs()->SetString(pref_path.c_str(), value); 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NotifyObservers(); 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AboutSigninInternals::NotifySigninValueChanged( 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const TimedSigninStatusField& field, 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& value) { 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned int field_index = field - TIMED_FIELDS_BEGIN; 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(field_index >= 0 && 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) field_index < signin_status_.timed_signin_fields.size()); 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Time now = Time::NowFromSystemTime(); 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string time_as_str = 136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::UTF16ToUTF8(base::TimeFormatShortDateAndTime(now)); 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TimedSigninStatusValue timed_value(value, time_as_str); 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) signin_status_.timed_signin_fields[field_index] = timed_value; 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Also persist these values in the prefs. 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string value_pref = SigninStatusFieldToString(field) + ".value"; 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string time_pref = SigninStatusFieldToString(field) + ".time"; 144e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch client_->GetPrefs()->SetString(value_pref.c_str(), value); 145e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch client_->GetPrefs()->SetString(time_pref.c_str(), time_as_str); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NotifyObservers(); 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AboutSigninInternals::RefreshSigninPrefs() { 151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Since the AboutSigninInternals has a dependency on the SigninManager 152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // (as seen in the AboutSigninInternalsFactory) the SigninManager can have 153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // the AuthenticatedUsername set before AboutSigninInternals can observe it. 154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // For that scenario, read the AuthenticatedUsername if it exists. 155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!signin_manager_->GetAuthenticatedUsername().empty()) { 156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch signin_status_.untimed_signin_fields[USERNAME] = 157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch signin_manager_->GetAuthenticatedUsername(); 158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 160e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Return if no client exists. Can occur in unit tests. 161e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (!client_) 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 164e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch PrefService* pref_service = client_->GetPrefs(); 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = UNTIMED_FIELDS_BEGIN; i < UNTIMED_FIELDS_END; ++i) { 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string pref_path = 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SigninStatusFieldToString(static_cast<UntimedSigninStatusField>(i)); 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) signin_status_.untimed_signin_fields[i - UNTIMED_FIELDS_BEGIN] = 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_service->GetString(pref_path.c_str()); 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 172e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch for (int i = TIMED_FIELDS_BEGIN; i < TIMED_FIELDS_END; ++i) { 173e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const std::string value_pref = 174e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch SigninStatusFieldToString(static_cast<TimedSigninStatusField>(i)) + 175e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ".value"; 176e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const std::string time_pref = 177e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch SigninStatusFieldToString(static_cast<TimedSigninStatusField>(i)) + 178e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ".time"; 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TimedSigninStatusValue value(pref_service->GetString(value_pref.c_str()), 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_service->GetString(time_pref.c_str())); 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) signin_status_.timed_signin_fields[i - TIMED_FIELDS_BEGIN] = value; 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(rogerta): Get status and timestamps for oauth2 tokens. 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NotifyObservers(); 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 190e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid AboutSigninInternals::Initialize(SigninClient* client) { 191e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch DCHECK(!client_); 192e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch client_ = client; 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RefreshSigninPrefs(); 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 196e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch signin_manager_->AddSigninDiagnosticsObserver(this); 197e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch token_service_->AddDiagnosticsObserver(this); 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AboutSigninInternals::Shutdown() { 201e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch signin_manager_->RemoveSigninDiagnosticsObserver(this); 202e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch token_service_->RemoveDiagnosticsObserver(this); 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AboutSigninInternals::NotifyObservers() { 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(AboutSigninInternals::Observer, 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) signin_observers_, 208e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch OnSigninStateChanged( 209e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch signin_status_.ToValue(client_->GetProductVersion()))); 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<base::DictionaryValue> AboutSigninInternals::GetSigninStatus() { 213e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return signin_status_.ToValue(client_->GetProductVersion()).Pass(); 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AboutSigninInternals::OnAccessTokenRequested( 2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& account_id, 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& consumer_id, 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const OAuth2TokenService::ScopeSet& scopes) { 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TokenInfo* token = signin_status_.FindToken(account_id, consumer_id, scopes); 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (token) { 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *token = TokenInfo(consumer_id, scopes); 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token = new TokenInfo(consumer_id, scopes); 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) signin_status_.token_info_map[account_id].push_back(token); 2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NotifyObservers(); 2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AboutSigninInternals::OnFetchAccessTokenComplete( 2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& account_id, 2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& consumer_id, 2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const OAuth2TokenService::ScopeSet& scopes, 2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GoogleServiceAuthError error, 2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Time expiration_time) { 2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TokenInfo* token = signin_status_.FindToken(account_id, consumer_id, scopes); 2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!token) { 2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DVLOG(1) << "Can't find token: " << account_id << ", " << consumer_id; 2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token->receive_time = base::Time::Now(); 2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token->error = error; 2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token->expiration_time = expiration_time; 2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NotifyObservers(); 2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AboutSigninInternals::OnTokenRemoved( 2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& account_id, 2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const OAuth2TokenService::ScopeSet& scopes) { 2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < signin_status_.token_info_map[account_id].size(); 254e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ++i) { 2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TokenInfo* token = signin_status_.token_info_map[account_id][i]; 2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (token->scopes == scopes) 2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token->Invalidate(); 2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NotifyObservers(); 2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 262010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void AboutSigninInternals::OnRefreshTokenReceived(std::string status) { 263010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) NotifySigninValueChanged(REFRESH_TOKEN_RECEIVED, status); 264010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 265010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 266010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void AboutSigninInternals::OnAuthenticationResultReceived(std::string status) { 267010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) NotifySigninValueChanged(AUTHENTICATION_RESULT_RECEIVED, status); 268010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 269010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)AboutSigninInternals::TokenInfo::TokenInfo( 2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& consumer_id, 2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const OAuth2TokenService::ScopeSet& scopes) 2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : consumer_id(consumer_id), 2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scopes(scopes), 2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_time(base::Time::Now()), 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) error(GoogleServiceAuthError::AuthErrorNone()), 277e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch removed_(false) {} 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)AboutSigninInternals::TokenInfo::~TokenInfo() {} 2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool AboutSigninInternals::TokenInfo::LessThan(const TokenInfo* a, 2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const TokenInfo* b) { 2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return a->consumer_id < b->consumer_id || a->scopes < b->scopes; 2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 286e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid AboutSigninInternals::TokenInfo::Invalidate() { removed_ = true; } 2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::DictionaryValue* AboutSigninInternals::TokenInfo::ToValue() const { 2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::DictionaryValue> token_info(new base::DictionaryValue()); 2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_info->SetString("service", consumer_id); 2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string scopes_str; 2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (OAuth2TokenService::ScopeSet::const_iterator it = scopes.begin(); 294e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch it != scopes.end(); 295e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ++it) { 2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scopes_str += *it + "<br/>"; 2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_info->SetString("scopes", scopes_str); 2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_info->SetString("request_time", GetTimeStr(request_time).c_str()); 3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (removed_) { 3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_info->SetString("status", "Token was revoked."); 3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else if (!receive_time.is_null()) { 3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (error == GoogleServiceAuthError::AuthErrorNone()) { 3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool token_expired = expiration_time < base::Time::Now(); 3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string status_str = ""; 3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (token_expired) 3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) status_str = "<p style=\"color: #ffffff; background-color: #ff0000\">"; 3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::StringAppendF(&status_str, 3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Received token at %s. Expire at %s", 3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetTimeStr(receive_time).c_str(), 3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetTimeStr(expiration_time).c_str()); 3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (token_expired) 3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::StringAppendF(&status_str, "</p>"); 3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_info->SetString("status", status_str); 3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_info->SetString( 3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "status", 319a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::StringPrintf("Failure: %s", error.ToString().c_str())); 3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_info->SetString("status", "Waiting for response"); 3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return token_info.release(); 3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)AboutSigninInternals::SigninStatus::SigninStatus() 329e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch : untimed_signin_fields(UNTIMED_FIELDS_COUNT), 330e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch timed_signin_fields(TIMED_FIELDS_COUNT) {} 3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)AboutSigninInternals::SigninStatus::~SigninStatus() { 3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (TokenInfoMap::iterator it = token_info_map.begin(); 334e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch it != token_info_map.end(); 335e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ++it) { 3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) STLDeleteElements(&it->second); 3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 340e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochAboutSigninInternals::TokenInfo* AboutSigninInternals::SigninStatus::FindToken( 3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& account_id, 3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& consumer_id, 3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const OAuth2TokenService::ScopeSet& scopes) { 344e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch for (size_t i = 0; i < token_info_map[account_id].size(); ++i) { 3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TokenInfo* tmp = token_info_map[account_id][i]; 3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (tmp->consumer_id == consumer_id && tmp->scopes == scopes) 3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return tmp; 3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NULL; 350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 352e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochscoped_ptr<base::DictionaryValue> AboutSigninInternals::SigninStatus::ToValue( 353e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch std::string product_version) { 3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::DictionaryValue> signin_status(new base::DictionaryValue()); 3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ListValue* signin_info = new base::ListValue(); 3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) signin_status->Set("signin_info", signin_info); 3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // A summary of signin related info first. 3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ListValue* basic_info = AddSection(signin_info, "Basic Information"); 3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string signin_status_string = 361e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch untimed_signin_fields[USERNAME - UNTIMED_FIELDS_BEGIN].empty() 362e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ? "Not Signed In" 363e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch : "Signed In"; 364e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch AddSectionEntry(basic_info, "Chrome Version", product_version); 3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AddSectionEntry(basic_info, "Signin Status", signin_status_string); 3660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch AddSectionEntry(basic_info, "Web Based Signin Enabled?", 3670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch switches::IsEnableWebBasedSignin() == true ? "True" : "False"); 3680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch AddSectionEntry(basic_info, "New Avatar Menu Enabled?", 3690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch switches::IsNewAvatarMenu() == true ? "True" : "False"); 3705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AddSectionEntry(basic_info, "New Profile Management Enabled?", 3715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) switches::IsNewProfileManagement() == true ? "True" : "False"); 3726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) AddSectionEntry(basic_info, "Account Consistency Enabled?", 3736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) switches::IsEnableAccountConsistency() == true ? "True" : "False"); 3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Only add username. SID and LSID have moved to tokens section. 3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string field = 3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SigninStatusFieldToLabel(static_cast<UntimedSigninStatusField>(USERNAME)); 378e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch AddSectionEntry(basic_info, 379e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch field, 380e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch untimed_signin_fields[USERNAME - UNTIMED_FIELDS_BEGIN]); 3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 382116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if !defined(OS_CHROMEOS) 3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Time and status information of the possible sign in types. 384e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch base::ListValue* detailed_info = 385e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch AddSection(signin_info, "Last Signin Details"); 3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (int i = TIMED_FIELDS_BEGIN; i < TIMED_FIELDS_END; ++i) { 3875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const std::string status_field_label = 3885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SigninStatusFieldToLabel(static_cast<TimedSigninStatusField>(i)); 3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 390e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch AddSectionEntry(detailed_info, 3915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu status_field_label, 3925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu timed_signin_fields[i - TIMED_FIELDS_BEGIN].first, 3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) timed_signin_fields[i - TIMED_FIELDS_BEGIN].second); 3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 395116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif // !defined(OS_CHROMEOS) 3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Token information for all services. 3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ListValue* token_info = new base::ListValue(); 3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) signin_status->Set("token_info", token_info); 4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (TokenInfoMap::iterator it = token_info_map.begin(); 401e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch it != token_info_map.end(); 402e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ++it) { 4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ListValue* token_details = AddSection(token_info, it->first); 4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::sort(it->second.begin(), it->second.end(), TokenInfo::LessThan); 4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::vector<TokenInfo*>& tokens = it->second; 4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < tokens.size(); ++i) { 4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* token_info = tokens[i]->ToValue(); 4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) token_details->Append(token_info); 4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return signin_status.Pass(); 4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 415