Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(293)

Side by Side Diff: components/user_manager/user_manager_base.cc

Issue 2907493002: ChromeOS: Per-user time zone: refactor tests first. (Closed)
Patch Set: Move more code from dependent CL here. Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/user_manager/user_manager_base.h" 5 #include "components/user_manager/user_manager_base.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <set> 8 #include <set>
9 #include <utility> 9 #include <utility>
10 10
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 DeleteUser(*it); 98 DeleteUser(*it);
99 } 99 }
100 // These are pointers to the same User instances that were in users_ list. 100 // These are pointers to the same User instances that were in users_ list.
101 logged_in_users_.clear(); 101 logged_in_users_.clear();
102 lru_logged_in_users_.clear(); 102 lru_logged_in_users_.clear();
103 103
104 DeleteUser(active_user_); 104 DeleteUser(active_user_);
105 } 105 }
106 106
107 void UserManagerBase::Shutdown() { 107 void UserManagerBase::Shutdown() {
108 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 108 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
stevenjb 2017/05/25 21:20:24 This seems hacky to me; deferring to xiyuan@
Alexander Alekseev 2017/05/26 02:18:01 task_runner_ is not defined in unit_tests. This is
109 } 109 }
110 110
111 const UserList& UserManagerBase::GetUsers() const { 111 const UserList& UserManagerBase::GetUsers() const {
112 const_cast<UserManagerBase*>(this)->EnsureUsersLoaded(); 112 const_cast<UserManagerBase*>(this)->EnsureUsersLoaded();
113 return users_; 113 return users_;
114 } 114 }
115 115
116 const UserList& UserManagerBase::GetLoggedInUsers() const { 116 const UserList& UserManagerBase::GetLoggedInUsers() const {
117 return logged_in_users_; 117 return logged_in_users_;
118 } 118 }
119 119
120 const UserList& UserManagerBase::GetLRULoggedInUsers() const { 120 const UserList& UserManagerBase::GetLRULoggedInUsers() const {
121 return lru_logged_in_users_; 121 return lru_logged_in_users_;
122 } 122 }
123 123
124 const AccountId& UserManagerBase::GetOwnerAccountId() const { 124 const AccountId& UserManagerBase::GetOwnerAccountId() const {
125 return owner_account_id_; 125 return owner_account_id_;
126 } 126 }
127 127
128 void UserManagerBase::UserLoggedIn(const AccountId& account_id, 128 void UserManagerBase::UserLoggedIn(const AccountId& account_id,
129 const std::string& username_hash, 129 const std::string& username_hash,
130 bool browser_restart) { 130 bool browser_restart) {
131 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 131 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
132 132
133 if (!last_session_active_account_id_initialized_) { 133 if (!last_session_active_account_id_initialized_) {
134 last_session_active_account_id_ = 134 last_session_active_account_id_ =
135 AccountId::FromUserEmail(GetLocalState()->GetString(kLastActiveUser)); 135 AccountId::FromUserEmail(GetLocalState()->GetString(kLastActiveUser));
136 last_session_active_account_id_initialized_ = true; 136 last_session_active_account_id_initialized_ = true;
137 } 137 }
138 138
139 User* user = FindUserInListAndModify(account_id); 139 User* user = FindUserInListAndModify(account_id);
140 if (active_user_ && user) { 140 if (active_user_ && user) {
141 user->set_is_logged_in(true); 141 user->set_is_logged_in(true);
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
252 if (AccountId::FromUserEmail( 252 if (AccountId::FromUserEmail(
253 GetActiveUser()->GetAccountId().GetUserEmail()) != 253 GetActiveUser()->GetAccountId().GetUserEmail()) !=
254 last_session_active_account_id_) 254 last_session_active_account_id_)
255 SwitchActiveUser(last_session_active_account_id_); 255 SwitchActiveUser(last_session_active_account_id_);
256 256
257 // Make sure that this function gets run only once. 257 // Make sure that this function gets run only once.
258 last_session_active_account_id_.clear(); 258 last_session_active_account_id_.clear();
259 } 259 }
260 260
261 void UserManagerBase::OnSessionStarted() { 261 void UserManagerBase::OnSessionStarted() {
262 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 262 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
263 263
264 CallUpdateLoginState(); 264 CallUpdateLoginState();
265 GetLocalState()->CommitPendingWrite(); 265 GetLocalState()->CommitPendingWrite();
266 } 266 }
267 267
268 void UserManagerBase::OnProfileInitialized(User* user) { 268 void UserManagerBase::OnProfileInitialized(User* user) {
269 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 269 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
270 270
271 // Mark the user as having an initialized session and persist this in 271 // Mark the user as having an initialized session and persist this in
272 // the known_user DB. 272 // the known_user DB.
273 user->set_profile_ever_initialized(true); 273 user->set_profile_ever_initialized(true);
274 known_user::SetProfileEverInitialized(user->GetAccountId(), true); 274 known_user::SetProfileEverInitialized(user->GetAccountId(), true);
275 GetLocalState()->CommitPendingWrite(); 275 GetLocalState()->CommitPendingWrite();
276 } 276 }
277 277
278 void UserManagerBase::RemoveUser(const AccountId& account_id, 278 void UserManagerBase::RemoveUser(const AccountId& account_id,
279 RemoveUserDelegate* delegate) { 279 RemoveUserDelegate* delegate) {
280 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 280 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
281 281
282 if (!CanUserBeRemoved(FindUser(account_id))) 282 if (!CanUserBeRemoved(FindUser(account_id)))
283 return; 283 return;
284 284
285 RemoveUserInternal(account_id, delegate); 285 RemoveUserInternal(account_id, delegate);
286 } 286 }
287 287
288 void UserManagerBase::RemoveUserInternal(const AccountId& account_id, 288 void UserManagerBase::RemoveUserInternal(const AccountId& account_id,
289 RemoveUserDelegate* delegate) { 289 RemoveUserDelegate* delegate) {
290 RemoveNonOwnerUserInternal(account_id, delegate); 290 RemoveNonOwnerUserInternal(account_id, delegate);
291 } 291 }
292 292
293 void UserManagerBase::RemoveNonOwnerUserInternal(const AccountId& account_id, 293 void UserManagerBase::RemoveNonOwnerUserInternal(const AccountId& account_id,
294 RemoveUserDelegate* delegate) { 294 RemoveUserDelegate* delegate) {
295 if (delegate) 295 if (delegate)
296 delegate->OnBeforeUserRemoved(account_id); 296 delegate->OnBeforeUserRemoved(account_id);
297 AsyncRemoveCryptohome(account_id); 297 AsyncRemoveCryptohome(account_id);
298 RemoveUserFromList(account_id); 298 RemoveUserFromList(account_id);
299 299
300 if (delegate) 300 if (delegate)
301 delegate->OnUserRemoved(account_id); 301 delegate->OnUserRemoved(account_id);
302 } 302 }
303 303
304 void UserManagerBase::RemoveUserFromList(const AccountId& account_id) { 304 void UserManagerBase::RemoveUserFromList(const AccountId& account_id) {
305 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 305 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
306 RemoveNonCryptohomeData(account_id); 306 RemoveNonCryptohomeData(account_id);
307 if (user_loading_stage_ == STAGE_LOADED) { 307 if (user_loading_stage_ == STAGE_LOADED) {
308 DeleteUser(RemoveRegularOrSupervisedUserFromList(account_id)); 308 DeleteUser(RemoveRegularOrSupervisedUserFromList(account_id));
309 } else if (user_loading_stage_ == STAGE_LOADING) { 309 } else if (user_loading_stage_ == STAGE_LOADING) {
310 DCHECK(IsSupervisedAccountId(account_id) || 310 DCHECK(IsSupervisedAccountId(account_id) ||
311 HasPendingBootstrap(account_id)); 311 HasPendingBootstrap(account_id));
312 // Special case, removing partially-constructed supervised user or 312 // Special case, removing partially-constructed supervised user or
313 // boostrapping user during user list loading. 313 // boostrapping user during user list loading.
314 ListPrefUpdate users_update(GetLocalState(), kRegularUsers); 314 ListPrefUpdate users_update(GetLocalState(), kRegularUsers);
315 users_update->Remove(base::Value(account_id.GetUserEmail()), nullptr); 315 users_update->Remove(base::Value(account_id.GetUserEmail()), nullptr);
316 OnUserRemoved(account_id); 316 OnUserRemoved(account_id);
317 } else { 317 } else {
318 NOTREACHED() << "Users are not loaded yet."; 318 NOTREACHED() << "Users are not loaded yet.";
319 return; 319 return;
320 } 320 }
321 321
322 // Make sure that new data is persisted to Local State. 322 // Make sure that new data is persisted to Local State.
323 GetLocalState()->CommitPendingWrite(); 323 GetLocalState()->CommitPendingWrite();
324 } 324 }
325 325
326 bool UserManagerBase::IsKnownUser(const AccountId& account_id) const { 326 bool UserManagerBase::IsKnownUser(const AccountId& account_id) const {
327 return FindUser(account_id) != nullptr; 327 return FindUser(account_id) != nullptr;
328 } 328 }
329 329
330 const User* UserManagerBase::FindUser(const AccountId& account_id) const { 330 const User* UserManagerBase::FindUser(const AccountId& account_id) const {
331 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 331 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
332 if (active_user_ && active_user_->GetAccountId() == account_id) 332 if (active_user_ && active_user_->GetAccountId() == account_id)
333 return active_user_; 333 return active_user_;
334 return FindUserInList(account_id); 334 return FindUserInList(account_id);
335 } 335 }
336 336
337 User* UserManagerBase::FindUserAndModify(const AccountId& account_id) { 337 User* UserManagerBase::FindUserAndModify(const AccountId& account_id) {
338 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 338 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
339 if (active_user_ && active_user_->GetAccountId() == account_id) 339 if (active_user_ && active_user_->GetAccountId() == account_id)
340 return active_user_; 340 return active_user_;
341 return FindUserInListAndModify(account_id); 341 return FindUserInListAndModify(account_id);
342 } 342 }
343 343
344 const User* UserManagerBase::GetActiveUser() const { 344 const User* UserManagerBase::GetActiveUser() const {
345 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 345 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
346 return active_user_; 346 return active_user_;
347 } 347 }
348 348
349 User* UserManagerBase::GetActiveUser() { 349 User* UserManagerBase::GetActiveUser() {
350 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 350 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
351 return active_user_; 351 return active_user_;
352 } 352 }
353 353
354 const User* UserManagerBase::GetPrimaryUser() const { 354 const User* UserManagerBase::GetPrimaryUser() const {
355 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 355 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
356 return primary_user_; 356 return primary_user_;
357 } 357 }
358 358
359 void UserManagerBase::SaveUserOAuthStatus( 359 void UserManagerBase::SaveUserOAuthStatus(
360 const AccountId& account_id, 360 const AccountId& account_id,
361 User::OAuthTokenStatus oauth_token_status) { 361 User::OAuthTokenStatus oauth_token_status) {
362 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 362 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
363 363
364 DVLOG(1) << "Saving user OAuth token status in Local State"; 364 DVLOG(1) << "Saving user OAuth token status in Local State";
365 User* user = FindUserAndModify(account_id); 365 User* user = FindUserAndModify(account_id);
366 if (user) 366 if (user)
367 user->set_oauth_token_status(oauth_token_status); 367 user->set_oauth_token_status(oauth_token_status);
368 368
369 // Do not update local state if data stored or cached outside the user's 369 // Do not update local state if data stored or cached outside the user's
370 // cryptohome is to be treated as ephemeral. 370 // cryptohome is to be treated as ephemeral.
371 if (IsUserNonCryptohomeDataEphemeral(account_id)) 371 if (IsUserNonCryptohomeDataEphemeral(account_id))
372 return; 372 return;
373 373
374 { 374 {
375 DictionaryPrefUpdate oauth_status_update(GetLocalState(), 375 DictionaryPrefUpdate oauth_status_update(GetLocalState(),
376 kUserOAuthTokenStatus); 376 kUserOAuthTokenStatus);
377 oauth_status_update->SetIntegerWithoutPathExpansion( 377 oauth_status_update->SetIntegerWithoutPathExpansion(
378 account_id.GetUserEmail(), static_cast<int>(oauth_token_status)); 378 account_id.GetUserEmail(), static_cast<int>(oauth_token_status));
379 } 379 }
380 GetLocalState()->CommitPendingWrite(); 380 GetLocalState()->CommitPendingWrite();
381 } 381 }
382 382
383 void UserManagerBase::SaveForceOnlineSignin(const AccountId& account_id, 383 void UserManagerBase::SaveForceOnlineSignin(const AccountId& account_id,
384 bool force_online_signin) { 384 bool force_online_signin) {
385 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 385 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
386 386
387 // Do not update local state if data stored or cached outside the user's 387 // Do not update local state if data stored or cached outside the user's
388 // cryptohome is to be treated as ephemeral. 388 // cryptohome is to be treated as ephemeral.
389 if (IsUserNonCryptohomeDataEphemeral(account_id)) 389 if (IsUserNonCryptohomeDataEphemeral(account_id))
390 return; 390 return;
391 391
392 { 392 {
393 DictionaryPrefUpdate force_online_update(GetLocalState(), 393 DictionaryPrefUpdate force_online_update(GetLocalState(),
394 kUserForceOnlineSignin); 394 kUserForceOnlineSignin);
395 force_online_update->SetBooleanWithoutPathExpansion( 395 force_online_update->SetBooleanWithoutPathExpansion(
396 account_id.GetUserEmail(), force_online_signin); 396 account_id.GetUserEmail(), force_online_signin);
397 } 397 }
398 GetLocalState()->CommitPendingWrite(); 398 GetLocalState()->CommitPendingWrite();
399 } 399 }
400 400
401 void UserManagerBase::SaveUserDisplayName(const AccountId& account_id, 401 void UserManagerBase::SaveUserDisplayName(const AccountId& account_id,
402 const base::string16& display_name) { 402 const base::string16& display_name) {
403 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 403 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
404 404
405 if (User* user = FindUserAndModify(account_id)) { 405 if (User* user = FindUserAndModify(account_id)) {
406 user->set_display_name(display_name); 406 user->set_display_name(display_name);
407 407
408 // Do not update local state if data stored or cached outside the user's 408 // Do not update local state if data stored or cached outside the user's
409 // cryptohome is to be treated as ephemeral. 409 // cryptohome is to be treated as ephemeral.
410 if (!IsUserNonCryptohomeDataEphemeral(account_id)) { 410 if (!IsUserNonCryptohomeDataEphemeral(account_id)) {
411 DictionaryPrefUpdate display_name_update(GetLocalState(), 411 DictionaryPrefUpdate display_name_update(GetLocalState(),
412 kUserDisplayName); 412 kUserDisplayName);
413 display_name_update->SetStringWithoutPathExpansion( 413 display_name_update->SetStringWithoutPathExpansion(
414 account_id.GetUserEmail(), display_name); 414 account_id.GetUserEmail(), display_name);
415 } 415 }
416 } 416 }
417 } 417 }
418 418
419 base::string16 UserManagerBase::GetUserDisplayName( 419 base::string16 UserManagerBase::GetUserDisplayName(
420 const AccountId& account_id) const { 420 const AccountId& account_id) const {
421 const User* user = FindUser(account_id); 421 const User* user = FindUser(account_id);
422 return user ? user->display_name() : base::string16(); 422 return user ? user->display_name() : base::string16();
423 } 423 }
424 424
425 void UserManagerBase::SaveUserDisplayEmail(const AccountId& account_id, 425 void UserManagerBase::SaveUserDisplayEmail(const AccountId& account_id,
426 const std::string& display_email) { 426 const std::string& display_email) {
427 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 427 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
428 428
429 User* user = FindUserAndModify(account_id); 429 User* user = FindUserAndModify(account_id);
430 if (!user) { 430 if (!user) {
431 LOG(ERROR) << "User not found: " << account_id.GetUserEmail(); 431 LOG(ERROR) << "User not found: " << account_id.GetUserEmail();
432 return; // Ignore if there is no such user. 432 return; // Ignore if there is no such user.
433 } 433 }
434 434
435 user->set_display_email(display_email); 435 user->set_display_email(display_email);
436 436
437 // Do not update local state if data stored or cached outside the user's 437 // Do not update local state if data stored or cached outside the user's
438 // cryptohome is to be treated as ephemeral. 438 // cryptohome is to be treated as ephemeral.
439 if (IsUserNonCryptohomeDataEphemeral(account_id)) 439 if (IsUserNonCryptohomeDataEphemeral(account_id))
440 return; 440 return;
441 441
442 DictionaryPrefUpdate display_email_update(GetLocalState(), kUserDisplayEmail); 442 DictionaryPrefUpdate display_email_update(GetLocalState(), kUserDisplayEmail);
443 display_email_update->SetStringWithoutPathExpansion(account_id.GetUserEmail(), 443 display_email_update->SetStringWithoutPathExpansion(account_id.GetUserEmail(),
444 display_email); 444 display_email);
445 } 445 }
446 446
447 std::string UserManagerBase::GetUserDisplayEmail( 447 std::string UserManagerBase::GetUserDisplayEmail(
448 const AccountId& account_id) const { 448 const AccountId& account_id) const {
449 const User* user = FindUser(account_id); 449 const User* user = FindUser(account_id);
450 return user ? user->display_email() : account_id.GetUserEmail(); 450 return user ? user->display_email() : account_id.GetUserEmail();
451 } 451 }
452 452
453 void UserManagerBase::SaveUserType(const AccountId& account_id, 453 void UserManagerBase::SaveUserType(const AccountId& account_id,
454 const UserType& user_type) { 454 const UserType& user_type) {
455 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 455 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
456 456
457 User* user = FindUserAndModify(account_id); 457 User* user = FindUserAndModify(account_id);
458 if (!user) { 458 if (!user) {
459 LOG(ERROR) << "User not found: " << account_id.GetUserEmail(); 459 LOG(ERROR) << "User not found: " << account_id.GetUserEmail();
460 return; // Ignore if there is no such user. 460 return; // Ignore if there is no such user.
461 } 461 }
462 462
463 // Do not update local state if data stored or cached outside the user's 463 // Do not update local state if data stored or cached outside the user's
464 // cryptohome is to be treated as ephemeral. 464 // cryptohome is to be treated as ephemeral.
465 if (IsUserNonCryptohomeDataEphemeral(account_id)) 465 if (IsUserNonCryptohomeDataEphemeral(account_id))
466 return; 466 return;
467 467
468 DictionaryPrefUpdate user_type_update(GetLocalState(), kUserType); 468 DictionaryPrefUpdate user_type_update(GetLocalState(), kUserType);
469 user_type_update->SetIntegerWithoutPathExpansion(account_id.GetUserEmail(), 469 user_type_update->SetIntegerWithoutPathExpansion(account_id.GetUserEmail(),
470 static_cast<int>(user_type)); 470 static_cast<int>(user_type));
471 GetLocalState()->CommitPendingWrite(); 471 GetLocalState()->CommitPendingWrite();
472 } 472 }
473 473
474 void UserManagerBase::UpdateUserAccountData( 474 void UserManagerBase::UpdateUserAccountData(
475 const AccountId& account_id, 475 const AccountId& account_id,
476 const UserAccountData& account_data) { 476 const UserAccountData& account_data) {
477 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 477 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
478 478
479 SaveUserDisplayName(account_id, account_data.display_name()); 479 SaveUserDisplayName(account_id, account_data.display_name());
480 480
481 if (User* user = FindUserAndModify(account_id)) { 481 if (User* user = FindUserAndModify(account_id)) {
482 base::string16 given_name = account_data.given_name(); 482 base::string16 given_name = account_data.given_name();
483 user->set_given_name(given_name); 483 user->set_given_name(given_name);
484 if (!IsUserNonCryptohomeDataEphemeral(account_id)) { 484 if (!IsUserNonCryptohomeDataEphemeral(account_id)) {
485 DictionaryPrefUpdate given_name_update(GetLocalState(), kUserGivenName); 485 DictionaryPrefUpdate given_name_update(GetLocalState(), kUserGivenName);
486 given_name_update->SetStringWithoutPathExpansion( 486 given_name_update->SetStringWithoutPathExpansion(
487 account_id.GetUserEmail(), given_name); 487 account_id.GetUserEmail(), given_name);
(...skipping 22 matching lines...) Expand all
510 if (existing_users.find(account_id) != existing_users.end() || 510 if (existing_users.find(account_id) != existing_users.end() ||
511 !users_set->insert(account_id).second) { 511 !users_set->insert(account_id).second) {
512 LOG(ERROR) << "Duplicate user: " << email; 512 LOG(ERROR) << "Duplicate user: " << email;
513 continue; 513 continue;
514 } 514 }
515 users_vector->push_back(account_id); 515 users_vector->push_back(account_id);
516 } 516 }
517 } 517 }
518 518
519 bool UserManagerBase::IsCurrentUserOwner() const { 519 bool UserManagerBase::IsCurrentUserOwner() const {
520 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 520 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
521 return !owner_account_id_.empty() && active_user_ && 521 return !owner_account_id_.empty() && active_user_ &&
522 active_user_->GetAccountId() == owner_account_id_; 522 active_user_->GetAccountId() == owner_account_id_;
523 } 523 }
524 524
525 bool UserManagerBase::IsCurrentUserNew() const { 525 bool UserManagerBase::IsCurrentUserNew() const {
526 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 526 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
527 return is_current_user_new_; 527 return is_current_user_new_;
528 } 528 }
529 529
530 bool UserManagerBase::IsCurrentUserNonCryptohomeDataEphemeral() const { 530 bool UserManagerBase::IsCurrentUserNonCryptohomeDataEphemeral() const {
531 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 531 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
532 return IsUserLoggedIn() && 532 return IsUserLoggedIn() &&
533 IsUserNonCryptohomeDataEphemeral(GetActiveUser()->GetAccountId()); 533 IsUserNonCryptohomeDataEphemeral(GetActiveUser()->GetAccountId());
534 } 534 }
535 535
536 bool UserManagerBase::IsCurrentUserCryptohomeDataEphemeral() const { 536 bool UserManagerBase::IsCurrentUserCryptohomeDataEphemeral() const {
537 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 537 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
538 return IsUserLoggedIn() && 538 return IsUserLoggedIn() &&
539 IsUserCryptohomeDataEphemeral(GetActiveUser()->GetAccountId()); 539 IsUserCryptohomeDataEphemeral(GetActiveUser()->GetAccountId());
540 } 540 }
541 541
542 bool UserManagerBase::CanCurrentUserLock() const { 542 bool UserManagerBase::CanCurrentUserLock() const {
543 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 543 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
544 return IsUserLoggedIn() && active_user_->can_lock(); 544 return IsUserLoggedIn() && active_user_->can_lock();
545 } 545 }
546 546
547 bool UserManagerBase::IsUserLoggedIn() const { 547 bool UserManagerBase::IsUserLoggedIn() const {
548 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 548 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
549 return active_user_; 549 return active_user_;
550 } 550 }
551 551
552 bool UserManagerBase::IsLoggedInAsUserWithGaiaAccount() const { 552 bool UserManagerBase::IsLoggedInAsUserWithGaiaAccount() const {
553 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 553 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
554 return IsUserLoggedIn() && active_user_->HasGaiaAccount(); 554 return IsUserLoggedIn() && active_user_->HasGaiaAccount();
555 } 555 }
556 556
557 bool UserManagerBase::IsLoggedInAsChildUser() const { 557 bool UserManagerBase::IsLoggedInAsChildUser() const {
558 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 558 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
559 return IsUserLoggedIn() && active_user_->GetType() == USER_TYPE_CHILD; 559 return IsUserLoggedIn() && active_user_->GetType() == USER_TYPE_CHILD;
560 } 560 }
561 561
562 bool UserManagerBase::IsLoggedInAsPublicAccount() const { 562 bool UserManagerBase::IsLoggedInAsPublicAccount() const {
563 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 563 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
564 return IsUserLoggedIn() && 564 return IsUserLoggedIn() &&
565 active_user_->GetType() == USER_TYPE_PUBLIC_ACCOUNT; 565 active_user_->GetType() == USER_TYPE_PUBLIC_ACCOUNT;
566 } 566 }
567 567
568 bool UserManagerBase::IsLoggedInAsGuest() const { 568 bool UserManagerBase::IsLoggedInAsGuest() const {
569 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 569 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
570 return IsUserLoggedIn() && active_user_->GetType() == USER_TYPE_GUEST; 570 return IsUserLoggedIn() && active_user_->GetType() == USER_TYPE_GUEST;
571 } 571 }
572 572
573 bool UserManagerBase::IsLoggedInAsSupervisedUser() const { 573 bool UserManagerBase::IsLoggedInAsSupervisedUser() const {
574 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 574 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
575 return IsUserLoggedIn() && active_user_->GetType() == USER_TYPE_SUPERVISED; 575 return IsUserLoggedIn() && active_user_->GetType() == USER_TYPE_SUPERVISED;
576 } 576 }
577 577
578 bool UserManagerBase::IsLoggedInAsKioskApp() const { 578 bool UserManagerBase::IsLoggedInAsKioskApp() const {
579 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 579 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
580 return IsUserLoggedIn() && active_user_->GetType() == USER_TYPE_KIOSK_APP; 580 return IsUserLoggedIn() && active_user_->GetType() == USER_TYPE_KIOSK_APP;
581 } 581 }
582 582
583 bool UserManagerBase::IsLoggedInAsArcKioskApp() const { 583 bool UserManagerBase::IsLoggedInAsArcKioskApp() const {
584 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 584 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
585 return IsUserLoggedIn() && active_user_->GetType() == USER_TYPE_ARC_KIOSK_APP; 585 return IsUserLoggedIn() && active_user_->GetType() == USER_TYPE_ARC_KIOSK_APP;
586 } 586 }
587 587
588 bool UserManagerBase::IsLoggedInAsStub() const { 588 bool UserManagerBase::IsLoggedInAsStub() const {
589 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 589 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
590 return IsUserLoggedIn() && IsStubAccountId(active_user_->GetAccountId()); 590 return IsUserLoggedIn() && IsStubAccountId(active_user_->GetAccountId());
591 } 591 }
592 592
593 bool UserManagerBase::IsUserNonCryptohomeDataEphemeral( 593 bool UserManagerBase::IsUserNonCryptohomeDataEphemeral(
594 const AccountId& account_id) const { 594 const AccountId& account_id) const {
595 // Data belonging to the guest and stub users is always ephemeral. 595 // Data belonging to the guest and stub users is always ephemeral.
596 if (IsGuestAccountId(account_id) || IsStubAccountId(account_id)) 596 if (IsGuestAccountId(account_id) || IsStubAccountId(account_id))
597 return true; 597 return true;
598 598
599 // Data belonging to the owner, anyone found on the user list and obsolete 599 // Data belonging to the owner, anyone found on the user list and obsolete
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
641 if (AreEphemeralUsersEnabled() && user && 641 if (AreEphemeralUsersEnabled() && user &&
642 user->GetType() == USER_TYPE_REGULAR && 642 user->GetType() == USER_TYPE_REGULAR &&
643 FindUserInList(account_id) == nullptr) { 643 FindUserInList(account_id) == nullptr) {
644 return true; 644 return true;
645 } 645 }
646 646
647 return false; 647 return false;
648 } 648 }
649 649
650 void UserManagerBase::AddObserver(UserManager::Observer* obs) { 650 void UserManagerBase::AddObserver(UserManager::Observer* obs) {
651 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 651 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
652 observer_list_.AddObserver(obs); 652 observer_list_.AddObserver(obs);
653 } 653 }
654 654
655 void UserManagerBase::RemoveObserver(UserManager::Observer* obs) { 655 void UserManagerBase::RemoveObserver(UserManager::Observer* obs) {
656 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 656 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
657 observer_list_.RemoveObserver(obs); 657 observer_list_.RemoveObserver(obs);
658 } 658 }
659 659
660 void UserManagerBase::AddSessionStateObserver( 660 void UserManagerBase::AddSessionStateObserver(
661 UserManager::UserSessionStateObserver* obs) { 661 UserManager::UserSessionStateObserver* obs) {
662 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 662 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
663 session_state_observer_list_.AddObserver(obs); 663 session_state_observer_list_.AddObserver(obs);
664 } 664 }
665 665
666 void UserManagerBase::RemoveSessionStateObserver( 666 void UserManagerBase::RemoveSessionStateObserver(
667 UserManager::UserSessionStateObserver* obs) { 667 UserManager::UserSessionStateObserver* obs) {
668 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 668 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
669 session_state_observer_list_.RemoveObserver(obs); 669 session_state_observer_list_.RemoveObserver(obs);
670 } 670 }
671 671
672 void UserManagerBase::NotifyLocalStateChanged() { 672 void UserManagerBase::NotifyLocalStateChanged() {
673 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 673 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
674 for (auto& observer : observer_list_) 674 for (auto& observer : observer_list_)
675 observer.LocalStateChanged(this); 675 observer.LocalStateChanged(this);
676 } 676 }
677 677
678 void UserManagerBase::NotifyUserImageChanged(const User& user) { 678 void UserManagerBase::NotifyUserImageChanged(const User& user) {
679 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 679 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
680 for (auto& observer : observer_list_) 680 for (auto& observer : observer_list_)
681 observer.OnUserImageChanged(user); 681 observer.OnUserImageChanged(user);
682 } 682 }
683 683
684 void UserManagerBase::NotifyUserProfileImageUpdateFailed(const User& user) { 684 void UserManagerBase::NotifyUserProfileImageUpdateFailed(const User& user) {
685 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 685 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
686 for (auto& observer : observer_list_) 686 for (auto& observer : observer_list_)
687 observer.OnUserProfileImageUpdateFailed(user); 687 observer.OnUserProfileImageUpdateFailed(user);
688 } 688 }
689 689
690 void UserManagerBase::NotifyUserProfileImageUpdated( 690 void UserManagerBase::NotifyUserProfileImageUpdated(
691 const User& user, 691 const User& user,
692 const gfx::ImageSkia& profile_image) { 692 const gfx::ImageSkia& profile_image) {
693 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 693 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
694 for (auto& observer : observer_list_) 694 for (auto& observer : observer_list_)
695 observer.OnUserProfileImageUpdated(user, profile_image); 695 observer.OnUserProfileImageUpdated(user, profile_image);
696 } 696 }
697 697
698 bool UserManagerBase::CanUserBeRemoved(const User* user) const { 698 bool UserManagerBase::CanUserBeRemoved(const User* user) const {
699 // Only regular and supervised users are allowed to be manually removed. 699 // Only regular and supervised users are allowed to be manually removed.
700 if (!user || 700 if (!user ||
701 !(user->HasGaiaAccount() || user->IsSupervised() || 701 !(user->HasGaiaAccount() || user->IsSupervised() ||
702 user->IsActiveDirectoryUser())) 702 user->IsActiveDirectoryUser()))
703 return false; 703 return false;
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
745 745
746 const AccountId& UserManagerBase::GetPendingUserSwitchID() const { 746 const AccountId& UserManagerBase::GetPendingUserSwitchID() const {
747 return pending_user_switch_; 747 return pending_user_switch_;
748 } 748 }
749 749
750 void UserManagerBase::SetPendingUserSwitchId(const AccountId& account_id) { 750 void UserManagerBase::SetPendingUserSwitchId(const AccountId& account_id) {
751 pending_user_switch_ = account_id; 751 pending_user_switch_ = account_id;
752 } 752 }
753 753
754 void UserManagerBase::EnsureUsersLoaded() { 754 void UserManagerBase::EnsureUsersLoaded() {
755 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 755 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
756 if (!GetLocalState()) 756 if (!GetLocalState())
757 return; 757 return;
758 758
759 if (user_loading_stage_ != STAGE_NOT_LOADED) 759 if (user_loading_stage_ != STAGE_NOT_LOADED)
760 return; 760 return;
761 user_loading_stage_ = STAGE_LOADING; 761 user_loading_stage_ = STAGE_LOADING;
762 762
763 PerformPreUserListLoadingActions(); 763 PerformPreUserListLoadingActions();
764 764
765 PrefService* local_state = GetLocalState(); 765 PrefService* local_state = GetLocalState();
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
856 User* UserManagerBase::FindUserInListAndModify(const AccountId& account_id) { 856 User* UserManagerBase::FindUserInListAndModify(const AccountId& account_id) {
857 UserList& users = GetUsersAndModify(); 857 UserList& users = GetUsersAndModify();
858 for (UserList::iterator it = users.begin(); it != users.end(); ++it) { 858 for (UserList::iterator it = users.begin(); it != users.end(); ++it) {
859 if ((*it)->GetAccountId() == account_id) 859 if ((*it)->GetAccountId() == account_id)
860 return *it; 860 return *it;
861 } 861 }
862 return nullptr; 862 return nullptr;
863 } 863 }
864 864
865 void UserManagerBase::GuestUserLoggedIn() { 865 void UserManagerBase::GuestUserLoggedIn() {
866 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 866 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
867 active_user_ = User::CreateGuestUser(GetGuestAccountId()); 867 active_user_ = User::CreateGuestUser(GetGuestAccountId());
868 } 868 }
869 869
870 void UserManagerBase::AddUserRecord(User* user) { 870 void UserManagerBase::AddUserRecord(User* user) {
871 // Add the user to the front of the user list. 871 // Add the user to the front of the user list.
872 ListPrefUpdate prefs_users_update(GetLocalState(), kRegularUsers); 872 ListPrefUpdate prefs_users_update(GetLocalState(), kRegularUsers);
873 prefs_users_update->Insert( 873 prefs_users_update->Insert(
874 0, base::MakeUnique<base::Value>(user->GetAccountId().GetUserEmail())); 874 0, base::MakeUnique<base::Value>(user->GetAccountId().GetUserEmail()));
875 users_.insert(users_.begin(), user); 875 users_.insert(users_.begin(), user);
876 } 876 }
(...skipping 14 matching lines...) Expand all
891 } 891 }
892 892
893 AddUserRecord(active_user_); 893 AddUserRecord(active_user_);
894 894
895 // Make sure that new data is persisted to Local State. 895 // Make sure that new data is persisted to Local State.
896 GetLocalState()->CommitPendingWrite(); 896 GetLocalState()->CommitPendingWrite();
897 } 897 }
898 898
899 void UserManagerBase::RegularUserLoggedInAsEphemeral( 899 void UserManagerBase::RegularUserLoggedInAsEphemeral(
900 const AccountId& account_id) { 900 const AccountId& account_id) {
901 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 901 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
902 SetIsCurrentUserNew(true); 902 SetIsCurrentUserNew(true);
903 is_current_user_ephemeral_regular_user_ = true; 903 is_current_user_ephemeral_regular_user_ = true;
904 active_user_ = User::CreateRegularUser(account_id); 904 active_user_ = User::CreateRegularUser(account_id);
905 } 905 }
906 906
907 void UserManagerBase::NotifyOnLogin() { 907 void UserManagerBase::NotifyOnLogin() {
908 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 908 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
909 909
910 NotifyActiveUserHashChanged(active_user_->username_hash()); 910 NotifyActiveUserHashChanged(active_user_->username_hash());
911 NotifyActiveUserChanged(active_user_); 911 NotifyActiveUserChanged(active_user_);
912 CallUpdateLoginState(); 912 CallUpdateLoginState();
913 } 913 }
914 914
915 User::OAuthTokenStatus UserManagerBase::LoadUserOAuthStatus( 915 User::OAuthTokenStatus UserManagerBase::LoadUserOAuthStatus(
916 const AccountId& account_id) const { 916 const AccountId& account_id) const {
917 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 917 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
918 918
919 const base::DictionaryValue* prefs_oauth_status = 919 const base::DictionaryValue* prefs_oauth_status =
920 GetLocalState()->GetDictionary(kUserOAuthTokenStatus); 920 GetLocalState()->GetDictionary(kUserOAuthTokenStatus);
921 int oauth_token_status = User::OAUTH_TOKEN_STATUS_UNKNOWN; 921 int oauth_token_status = User::OAUTH_TOKEN_STATUS_UNKNOWN;
922 if (prefs_oauth_status && 922 if (prefs_oauth_status &&
923 prefs_oauth_status->GetIntegerWithoutPathExpansion( 923 prefs_oauth_status->GetIntegerWithoutPathExpansion(
924 account_id.GetUserEmail(), &oauth_token_status)) { 924 account_id.GetUserEmail(), &oauth_token_status)) {
925 User::OAuthTokenStatus status = 925 User::OAuthTokenStatus status =
926 static_cast<User::OAuthTokenStatus>(oauth_token_status); 926 static_cast<User::OAuthTokenStatus>(oauth_token_status);
927 HandleUserOAuthTokenStatusChange(account_id, status); 927 HandleUserOAuthTokenStatusChange(account_id, status);
928 928
929 return status; 929 return status;
930 } 930 }
931 return User::OAUTH_TOKEN_STATUS_UNKNOWN; 931 return User::OAUTH_TOKEN_STATUS_UNKNOWN;
932 } 932 }
933 933
934 bool UserManagerBase::LoadForceOnlineSignin(const AccountId& account_id) const { 934 bool UserManagerBase::LoadForceOnlineSignin(const AccountId& account_id) const {
935 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 935 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
936 936
937 const base::DictionaryValue* prefs_force_online = 937 const base::DictionaryValue* prefs_force_online =
938 GetLocalState()->GetDictionary(kUserForceOnlineSignin); 938 GetLocalState()->GetDictionary(kUserForceOnlineSignin);
939 bool force_online_signin = false; 939 bool force_online_signin = false;
940 if (prefs_force_online) { 940 if (prefs_force_online) {
941 prefs_force_online->GetBooleanWithoutPathExpansion( 941 prefs_force_online->GetBooleanWithoutPathExpansion(
942 account_id.GetUserEmail(), &force_online_signin); 942 account_id.GetUserEmail(), &force_online_signin);
943 } 943 }
944 return force_online_signin; 944 return force_online_signin;
945 } 945 }
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
990 prefs_users_update->AppendString(user_email); 990 prefs_users_update->AppendString(user_email);
991 } 991 }
992 ++it; 992 ++it;
993 } 993 }
994 } 994 }
995 OnUserRemoved(account_id); 995 OnUserRemoved(account_id);
996 return user; 996 return user;
997 } 997 }
998 998
999 void UserManagerBase::NotifyActiveUserChanged(const User* active_user) { 999 void UserManagerBase::NotifyActiveUserChanged(const User* active_user) {
1000 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 1000 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
1001 for (auto& observer : session_state_observer_list_) 1001 for (auto& observer : session_state_observer_list_)
1002 observer.ActiveUserChanged(active_user); 1002 observer.ActiveUserChanged(active_user);
1003 } 1003 }
1004 1004
1005 void UserManagerBase::NotifyUserAddedToSession(const User* added_user, 1005 void UserManagerBase::NotifyUserAddedToSession(const User* added_user,
1006 bool user_switch_pending) { 1006 bool user_switch_pending) {
1007 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 1007 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
1008 for (auto& observer : session_state_observer_list_) 1008 for (auto& observer : session_state_observer_list_)
1009 observer.UserAddedToSession(added_user); 1009 observer.UserAddedToSession(added_user);
1010 } 1010 }
1011 1011
1012 void UserManagerBase::NotifyActiveUserHashChanged(const std::string& hash) { 1012 void UserManagerBase::NotifyActiveUserHashChanged(const std::string& hash) {
1013 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 1013 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
1014 for (auto& observer : session_state_observer_list_) 1014 for (auto& observer : session_state_observer_list_)
1015 observer.ActiveUserHashChanged(hash); 1015 observer.ActiveUserHashChanged(hash);
1016 } 1016 }
1017 1017
1018 void UserManagerBase::ChangeUserChildStatus(User* user, bool is_child) { 1018 void UserManagerBase::ChangeUserChildStatus(User* user, bool is_child) {
1019 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 1019 DCHECK(!task_runner_ || task_runner_->RunsTasksOnCurrentThread());
1020 if (user->IsSupervised() == is_child) 1020 if (user->IsSupervised() == is_child)
1021 return; 1021 return;
1022 user->SetIsChild(is_child); 1022 user->SetIsChild(is_child);
1023 SaveUserType(user->GetAccountId(), is_child 1023 SaveUserType(user->GetAccountId(), is_child
1024 ? user_manager::USER_TYPE_CHILD 1024 ? user_manager::USER_TYPE_CHILD
1025 : user_manager::USER_TYPE_REGULAR); 1025 : user_manager::USER_TYPE_REGULAR);
1026 for (auto& observer : session_state_observer_list_) 1026 for (auto& observer : session_state_observer_list_)
1027 observer.UserChangedChildStatus(user); 1027 observer.UserChangedChildStatus(user);
1028 } 1028 }
1029 1029
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
1094 } 1094 }
1095 1095
1096 void UserManagerBase::DeleteUser(User* user) { 1096 void UserManagerBase::DeleteUser(User* user) {
1097 const bool is_active_user = (user == active_user_); 1097 const bool is_active_user = (user == active_user_);
1098 delete user; 1098 delete user;
1099 if (is_active_user) 1099 if (is_active_user)
1100 active_user_ = nullptr; 1100 active_user_ = nullptr;
1101 } 1101 }
1102 1102
1103 } // namespace user_manager 1103 } // namespace user_manager
OLDNEW
« chrome/test/base/testing_profile.h ('K') | « chrome/test/base/testing_profile.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698