| 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 "chrome/browser/profiles/profile_info_cache.h" | 5 #include "chrome/browser/profiles/profile_info_cache.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
| 9 #include "base/format_macros.h" | 9 #include "base/format_macros.h" |
| 10 #include "base/i18n/case_conversion.h" | 10 #include "base/i18n/case_conversion.h" |
| 11 #include "base/logging.h" | 11 #include "base/logging.h" |
| 12 #include "base/memory/scoped_ptr.h" | 12 #include "base/memory/scoped_ptr.h" |
| 13 #include "base/path_service.h" |
| 13 #include "base/prefs/pref_registry_simple.h" | 14 #include "base/prefs/pref_registry_simple.h" |
| 14 #include "base/prefs/pref_service.h" | 15 #include "base/prefs/pref_service.h" |
| 15 #include "base/prefs/scoped_user_pref_update.h" | 16 #include "base/prefs/scoped_user_pref_update.h" |
| 16 #include "base/rand_util.h" | 17 #include "base/rand_util.h" |
| 17 #include "base/stl_util.h" | 18 #include "base/stl_util.h" |
| 18 #include "base/strings/string_number_conversions.h" | 19 #include "base/strings/string_number_conversions.h" |
| 19 #include "base/strings/string_piece.h" | 20 #include "base/strings/string_piece.h" |
| 20 #include "base/strings/stringprintf.h" | 21 #include "base/strings/stringprintf.h" |
| 21 #include "base/strings/utf_string_conversions.h" | 22 #include "base/strings/utf_string_conversions.h" |
| 22 #include "base/values.h" | 23 #include "base/values.h" |
| 23 #include "chrome/browser/browser_process.h" | 24 #include "chrome/browser/browser_process.h" |
| 24 #include "chrome/browser/chrome_notification_types.h" | 25 #include "chrome/browser/chrome_notification_types.h" |
| 26 #include "chrome/common/chrome_paths.h" |
| 25 #include "chrome/common/pref_names.h" | 27 #include "chrome/common/pref_names.h" |
| 26 #include "chrome/common/profile_management_switches.h" | 28 #include "chrome/common/profile_management_switches.h" |
| 27 #include "content/public/browser/browser_thread.h" | 29 #include "content/public/browser/browser_thread.h" |
| 28 #include "content/public/browser/notification_service.h" | 30 #include "content/public/browser/notification_service.h" |
| 29 #include "grit/generated_resources.h" | 31 #include "grit/generated_resources.h" |
| 30 #include "grit/theme_resources.h" | 32 #include "grit/theme_resources.h" |
| 31 #include "third_party/skia/include/core/SkBitmap.h" | 33 #include "third_party/skia/include/core/SkBitmap.h" |
| 32 #include "ui/base/l10n/l10n_util.h" | 34 #include "ui/base/l10n/l10n_util.h" |
| 33 #include "ui/base/resource/resource_bundle.h" | 35 #include "ui/base/resource/resource_bundle.h" |
| 34 #include "ui/gfx/image/image.h" | 36 #include "ui/gfx/image/image.h" |
| (...skipping 16 matching lines...) Expand all Loading... |
| 51 const char kGAIAPictureFileNameKey[] = "gaia_picture_file_name"; | 53 const char kGAIAPictureFileNameKey[] = "gaia_picture_file_name"; |
| 52 const char kIsManagedKey[] = "is_managed"; | 54 const char kIsManagedKey[] = "is_managed"; |
| 53 const char kIsOmittedFromProfileListKey[] = "is_omitted_from_profile_list"; | 55 const char kIsOmittedFromProfileListKey[] = "is_omitted_from_profile_list"; |
| 54 const char kSigninRequiredKey[] = "signin_required"; | 56 const char kSigninRequiredKey[] = "signin_required"; |
| 55 const char kManagedUserId[] = "managed_user_id"; | 57 const char kManagedUserId[] = "managed_user_id"; |
| 56 const char kProfileIsEphemeral[] = "is_ephemeral"; | 58 const char kProfileIsEphemeral[] = "is_ephemeral"; |
| 57 const char kActiveTimeKey[] = "active_time"; | 59 const char kActiveTimeKey[] = "active_time"; |
| 58 | 60 |
| 59 const char kDefaultUrlPrefix[] = "chrome://theme/IDR_PROFILE_AVATAR_"; | 61 const char kDefaultUrlPrefix[] = "chrome://theme/IDR_PROFILE_AVATAR_"; |
| 60 const char kGAIAPictureFileName[] = "Google Profile Picture.png"; | 62 const char kGAIAPictureFileName[] = "Google Profile Picture.png"; |
| 63 const char kHighResAvatarFolderName[] = "Avatars"; |
| 61 | 64 |
| 62 const int kDefaultAvatarIconResources[] = { | 65 const int kDefaultAvatarIconResources[] = { |
| 63 IDR_PROFILE_AVATAR_0, | 66 IDR_PROFILE_AVATAR_0, |
| 64 IDR_PROFILE_AVATAR_1, | 67 IDR_PROFILE_AVATAR_1, |
| 65 IDR_PROFILE_AVATAR_2, | 68 IDR_PROFILE_AVATAR_2, |
| 66 IDR_PROFILE_AVATAR_3, | 69 IDR_PROFILE_AVATAR_3, |
| 67 IDR_PROFILE_AVATAR_4, | 70 IDR_PROFILE_AVATAR_4, |
| 68 IDR_PROFILE_AVATAR_5, | 71 IDR_PROFILE_AVATAR_5, |
| 69 IDR_PROFILE_AVATAR_6, | 72 IDR_PROFILE_AVATAR_6, |
| 70 IDR_PROFILE_AVATAR_7, | 73 IDR_PROFILE_AVATAR_7, |
| (...skipping 10 matching lines...) Expand all Loading... |
| 81 IDR_PROFILE_AVATAR_18, | 84 IDR_PROFILE_AVATAR_18, |
| 82 IDR_PROFILE_AVATAR_19, | 85 IDR_PROFILE_AVATAR_19, |
| 83 IDR_PROFILE_AVATAR_20, | 86 IDR_PROFILE_AVATAR_20, |
| 84 IDR_PROFILE_AVATAR_21, | 87 IDR_PROFILE_AVATAR_21, |
| 85 IDR_PROFILE_AVATAR_22, | 88 IDR_PROFILE_AVATAR_22, |
| 86 IDR_PROFILE_AVATAR_23, | 89 IDR_PROFILE_AVATAR_23, |
| 87 IDR_PROFILE_AVATAR_24, | 90 IDR_PROFILE_AVATAR_24, |
| 88 IDR_PROFILE_AVATAR_25, | 91 IDR_PROFILE_AVATAR_25, |
| 89 }; | 92 }; |
| 90 | 93 |
| 94 // File names for the high-res avatar icon resources. In the same order as |
| 95 // the avatars in kDefaultAvatarIconResources. |
| 96 const char* kDefaultAvatarIconResourceFileNames[] = { |
| 97 "avatar_generic.png", |
| 98 "avatar_generic_aqua.png", |
| 99 "avatar_generic_blue.png", |
| 100 "avatar_generic_green.png", |
| 101 "avatar_generic_orange.png", |
| 102 "avatar_generic_purple.png", |
| 103 "avatar_generic_red.png", |
| 104 "avatar_generic_yellow.png", |
| 105 "avatar_secret_agent.png", |
| 106 "avatar_superhero.png", |
| 107 "avatar_volley_ball.png", |
| 108 "avatar_businessman.png", |
| 109 "avatar_ninja.png", |
| 110 "avatar_alien.png", |
| 111 "avatar_smiley.png", |
| 112 "avatar_flower.png", |
| 113 "avatar_pizza.png", |
| 114 "avatar_soccer.png", |
| 115 "avatar_burger.png", |
| 116 "avatar_cat.png", |
| 117 "avatar_cupcake.png", |
| 118 "avatar_dog.png", |
| 119 "avatar_horse.png", |
| 120 "avatar_margarita.png", |
| 121 "avatar_note.png", |
| 122 "avatar_sun_cloud.png", |
| 123 }; |
| 124 |
| 91 const size_t kDefaultAvatarIconsCount = arraysize(kDefaultAvatarIconResources); | 125 const size_t kDefaultAvatarIconsCount = arraysize(kDefaultAvatarIconResources); |
| 92 | 126 |
| 93 // The first 8 icons are generic. | 127 // The first 8 icons are generic. |
| 94 const size_t kGenericIconCount = 8; | 128 const size_t kGenericIconCount = 8; |
| 95 | 129 |
| 96 // First eight are generic icons, which use IDS_NUMBERED_PROFILE_NAME. | 130 // First eight are generic icons, which use IDS_NUMBERED_PROFILE_NAME. |
| 97 const int kDefaultNames[] = { | 131 const int kDefaultNames[] = { |
| 98 IDS_DEFAULT_AVATAR_NAME_8, | 132 IDS_DEFAULT_AVATAR_NAME_8, |
| 99 IDS_DEFAULT_AVATAR_NAME_9, | 133 IDS_DEFAULT_AVATAR_NAME_9, |
| 100 IDS_DEFAULT_AVATAR_NAME_10, | 134 IDS_DEFAULT_AVATAR_NAME_10, |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 143 } | 177 } |
| 144 | 178 |
| 145 // Reads a PNG from disk and decodes it. If the bitmap was successfully read | 179 // Reads a PNG from disk and decodes it. If the bitmap was successfully read |
| 146 // from disk the then |out_image| will contain the bitmap image, otherwise it | 180 // from disk the then |out_image| will contain the bitmap image, otherwise it |
| 147 // will be NULL. | 181 // will be NULL. |
| 148 void ReadBitmap(const base::FilePath& image_path, | 182 void ReadBitmap(const base::FilePath& image_path, |
| 149 gfx::Image** out_image) { | 183 gfx::Image** out_image) { |
| 150 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 184 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| 151 *out_image = NULL; | 185 *out_image = NULL; |
| 152 | 186 |
| 187 // If the path doesn't exist, don't even try reading it. |
| 188 if (!base::PathExists(image_path)) |
| 189 return; |
| 190 |
| 153 std::string image_data; | 191 std::string image_data; |
| 154 if (!base::ReadFileToString(image_path, &image_data)) { | 192 if (!base::ReadFileToString(image_path, &image_data)) { |
| 155 LOG(ERROR) << "Failed to read PNG file from disk."; | 193 LOG(ERROR) << "Failed to read PNG file from disk."; |
| 156 return; | 194 return; |
| 157 } | 195 } |
| 158 | 196 |
| 159 gfx::Image image = gfx::Image::CreateFrom1xPNGBytes( | 197 gfx::Image image = gfx::Image::CreateFrom1xPNGBytes( |
| 160 base::RefCountedString::TakeString(&image_data)); | 198 base::RefCountedString::TakeString(&image_data)); |
| 161 if (image.IsEmpty()) { | 199 if (image.IsEmpty()) { |
| 162 LOG(ERROR) << "Failed to decode PNG file."; | 200 LOG(ERROR) << "Failed to decode PNG file."; |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 216 if (info->GetBoolean(kIsManagedKey, &is_managed)) { | 254 if (info->GetBoolean(kIsManagedKey, &is_managed)) { |
| 217 info->Remove(kIsManagedKey, NULL); | 255 info->Remove(kIsManagedKey, NULL); |
| 218 info->SetString(kManagedUserId, is_managed ? "DUMMY_ID" : std::string()); | 256 info->SetString(kManagedUserId, is_managed ? "DUMMY_ID" : std::string()); |
| 219 } | 257 } |
| 220 info->SetBoolean(kIsUsingDefaultName, IsDefaultName(name)); | 258 info->SetBoolean(kIsUsingDefaultName, IsDefaultName(name)); |
| 221 } | 259 } |
| 222 } | 260 } |
| 223 | 261 |
| 224 ProfileInfoCache::~ProfileInfoCache() { | 262 ProfileInfoCache::~ProfileInfoCache() { |
| 225 STLDeleteContainerPairSecondPointers( | 263 STLDeleteContainerPairSecondPointers( |
| 226 gaia_pictures_.begin(), gaia_pictures_.end()); | 264 cached_avatar_images_.begin(), cached_avatar_images_.end()); |
| 227 } | 265 } |
| 228 | 266 |
| 229 void ProfileInfoCache::AddProfileToCache(const base::FilePath& profile_path, | 267 void ProfileInfoCache::AddProfileToCache(const base::FilePath& profile_path, |
| 230 const base::string16& name, | 268 const base::string16& name, |
| 231 const base::string16& username, | 269 const base::string16& username, |
| 232 size_t icon_index, | 270 size_t icon_index, |
| 233 const std::string& managed_user_id) { | 271 const std::string& managed_user_id) { |
| 234 std::string key = CacheKeyFromProfilePath(profile_path); | 272 std::string key = CacheKeyFromProfilePath(profile_path); |
| 235 DictionaryPrefUpdate update(prefs_, prefs::kProfileInfoCache); | 273 DictionaryPrefUpdate update(prefs_, prefs::kProfileInfoCache); |
| 236 base::DictionaryValue* cache = update.Get(); | 274 base::DictionaryValue* cache = update.Get(); |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 354 } | 392 } |
| 355 | 393 |
| 356 const gfx::Image& ProfileInfoCache::GetAvatarIconOfProfileAtIndex( | 394 const gfx::Image& ProfileInfoCache::GetAvatarIconOfProfileAtIndex( |
| 357 size_t index) const { | 395 size_t index) const { |
| 358 if (IsUsingGAIAPictureOfProfileAtIndex(index)) { | 396 if (IsUsingGAIAPictureOfProfileAtIndex(index)) { |
| 359 const gfx::Image* image = GetGAIAPictureOfProfileAtIndex(index); | 397 const gfx::Image* image = GetGAIAPictureOfProfileAtIndex(index); |
| 360 if (image) | 398 if (image) |
| 361 return *image; | 399 return *image; |
| 362 } | 400 } |
| 363 | 401 |
| 402 // Use the high resolution version of the avatar if it exists. |
| 403 if (switches::IsNewProfileManagement()) { |
| 404 const gfx::Image* image = GetHighResAvatarOfProfileAtIndex(index); |
| 405 if (image) |
| 406 return *image; |
| 407 } |
| 408 |
| 364 int resource_id = GetDefaultAvatarIconResourceIDAtIndex( | 409 int resource_id = GetDefaultAvatarIconResourceIDAtIndex( |
| 365 GetAvatarIconIndexOfProfileAtIndex(index)); | 410 GetAvatarIconIndexOfProfileAtIndex(index)); |
| 366 return ResourceBundle::GetSharedInstance().GetNativeImageNamed(resource_id); | 411 return ResourceBundle::GetSharedInstance().GetNativeImageNamed(resource_id); |
| 367 } | 412 } |
| 368 | 413 |
| 369 std::string ProfileInfoCache::GetLocalAuthCredentialsOfProfileAtIndex( | 414 std::string ProfileInfoCache::GetLocalAuthCredentialsOfProfileAtIndex( |
| 370 size_t index) const { | 415 size_t index) const { |
| 371 std::string credentials; | 416 std::string credentials; |
| 372 GetInfoForProfileAtIndex(index)->GetString(kAuthCredentialsKey, &credentials); | 417 GetInfoForProfileAtIndex(index)->GetString(kAuthCredentialsKey, &credentials); |
| 373 return credentials; | 418 return credentials; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 395 base::string16 name; | 440 base::string16 name; |
| 396 GetInfoForProfileAtIndex(index)->GetString(kGAIAGivenNameKey, &name); | 441 GetInfoForProfileAtIndex(index)->GetString(kGAIAGivenNameKey, &name); |
| 397 return name; | 442 return name; |
| 398 } | 443 } |
| 399 | 444 |
| 400 const gfx::Image* ProfileInfoCache::GetGAIAPictureOfProfileAtIndex( | 445 const gfx::Image* ProfileInfoCache::GetGAIAPictureOfProfileAtIndex( |
| 401 size_t index) const { | 446 size_t index) const { |
| 402 base::FilePath path = GetPathOfProfileAtIndex(index); | 447 base::FilePath path = GetPathOfProfileAtIndex(index); |
| 403 std::string key = CacheKeyFromProfilePath(path); | 448 std::string key = CacheKeyFromProfilePath(path); |
| 404 | 449 |
| 405 // If the picture is already loaded then use it. | |
| 406 if (gaia_pictures_.count(key)) { | |
| 407 if (gaia_pictures_[key]->IsEmpty()) | |
| 408 return NULL; | |
| 409 return gaia_pictures_[key]; | |
| 410 } | |
| 411 | |
| 412 std::string file_name; | 450 std::string file_name; |
| 413 GetInfoForProfileAtIndex(index)->GetString( | 451 GetInfoForProfileAtIndex(index)->GetString( |
| 414 kGAIAPictureFileNameKey, &file_name); | 452 kGAIAPictureFileNameKey, &file_name); |
| 415 | 453 |
| 416 // If the picture is not on disk or it is already being loaded then return | 454 // If the picture is not on disk then return NULL. |
| 417 // NULL. | 455 if (file_name.empty()) |
| 418 if (file_name.empty() || gaia_pictures_loading_[key]) | |
| 419 return NULL; | 456 return NULL; |
| 420 | 457 |
| 421 gaia_pictures_loading_[key] = true; | |
| 422 base::FilePath image_path = path.AppendASCII(file_name); | 458 base::FilePath image_path = path.AppendASCII(file_name); |
| 459 return LoadAvatarPictureFromPath(key, image_path); |
| 460 } |
| 461 |
| 462 const gfx::Image* ProfileInfoCache::GetHighResAvatarOfProfileAtIndex( |
| 463 size_t index) const { |
| 464 int avatar_index = GetAvatarIconIndexOfProfileAtIndex(index); |
| 465 std::string key = kDefaultAvatarIconResourceFileNames[avatar_index]; |
| 466 |
| 467 base::FilePath user_data_dir; |
| 468 PathService::Get(chrome::DIR_USER_DATA, &user_data_dir); |
| 469 base::FilePath image_path = |
| 470 user_data_dir.AppendASCII(kHighResAvatarFolderName).AppendASCII(key); |
| 471 return LoadAvatarPictureFromPath(key, image_path); |
| 472 } |
| 473 |
| 474 const gfx::Image* ProfileInfoCache::LoadAvatarPictureFromPath( |
| 475 const std::string& key, |
| 476 const base::FilePath& image_path) const { |
| 477 // If the picture is already loaded then use it. |
| 478 if (cached_avatar_images_.count(key)) { |
| 479 if (cached_avatar_images_[key]->IsEmpty()) |
| 480 return NULL; |
| 481 return cached_avatar_images_[key]; |
| 482 } |
| 483 |
| 484 // If the picture is already being loaded then don't try loading it again. |
| 485 if (cached_avatar_images_loading_[key]) |
| 486 return NULL; |
| 487 cached_avatar_images_loading_[key] = true; |
| 488 |
| 423 gfx::Image** image = new gfx::Image*; | 489 gfx::Image** image = new gfx::Image*; |
| 424 BrowserThread::PostTaskAndReply(BrowserThread::FILE, FROM_HERE, | 490 BrowserThread::PostTaskAndReply(BrowserThread::FILE, FROM_HERE, |
| 425 base::Bind(&ReadBitmap, image_path, image), | 491 base::Bind(&ReadBitmap, image_path, image), |
| 426 base::Bind(&ProfileInfoCache::OnGAIAPictureLoaded, | 492 base::Bind(&ProfileInfoCache::OnAvatarPictureLoaded, |
| 427 const_cast<ProfileInfoCache*>(this)->AsWeakPtr(), path, image)); | 493 const_cast<ProfileInfoCache*>(this)->AsWeakPtr(), key, image)); |
| 428 | |
| 429 return NULL; | 494 return NULL; |
| 430 } | 495 } |
| 431 | 496 |
| 432 bool ProfileInfoCache::ProfileIsManagedAtIndex(size_t index) const { | 497 bool ProfileInfoCache::ProfileIsManagedAtIndex(size_t index) const { |
| 433 return !GetManagedUserIdOfProfileAtIndex(index).empty(); | 498 return !GetManagedUserIdOfProfileAtIndex(index).empty(); |
| 434 } | 499 } |
| 435 | 500 |
| 436 bool ProfileInfoCache::IsOmittedProfileAtIndex(size_t index) const { | 501 bool ProfileInfoCache::IsOmittedProfileAtIndex(size_t index) const { |
| 437 bool value = false; | 502 bool value = false; |
| 438 GetInfoForProfileAtIndex(index)->GetBoolean(kIsOmittedFromProfileListKey, | 503 GetInfoForProfileAtIndex(index)->GetBoolean(kIsOmittedFromProfileListKey, |
| (...skipping 19 matching lines...) Expand all Loading... |
| 458 GetInfoForProfileAtIndex(index)->GetBoolean(kProfileIsEphemeral, &value); | 523 GetInfoForProfileAtIndex(index)->GetBoolean(kProfileIsEphemeral, &value); |
| 459 return value; | 524 return value; |
| 460 } | 525 } |
| 461 | 526 |
| 462 bool ProfileInfoCache::ProfileIsUsingDefaultNameAtIndex(size_t index) const { | 527 bool ProfileInfoCache::ProfileIsUsingDefaultNameAtIndex(size_t index) const { |
| 463 bool value = false; | 528 bool value = false; |
| 464 GetInfoForProfileAtIndex(index)->GetBoolean(kIsUsingDefaultName, &value); | 529 GetInfoForProfileAtIndex(index)->GetBoolean(kIsUsingDefaultName, &value); |
| 465 return value; | 530 return value; |
| 466 } | 531 } |
| 467 | 532 |
| 468 void ProfileInfoCache::OnGAIAPictureLoaded(const base::FilePath& path, | 533 void ProfileInfoCache::OnAvatarPictureLoaded(const std::string& key, |
| 469 gfx::Image** image) const { | 534 gfx::Image** image) const { |
| 470 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 535 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 471 | 536 |
| 472 std::string key = CacheKeyFromProfilePath(path); | 537 cached_avatar_images_loading_[key] = false; |
| 473 gaia_pictures_loading_[key] = false; | |
| 474 | 538 |
| 539 delete cached_avatar_images_[key]; |
| 475 if (*image) { | 540 if (*image) { |
| 476 delete gaia_pictures_[key]; | 541 cached_avatar_images_[key] = *image; |
| 477 gaia_pictures_[key] = *image; | |
| 478 } else { | 542 } else { |
| 479 // Place an empty image in the cache to avoid reloading it again. | 543 // Place an empty image in the cache to avoid reloading it again. |
| 480 gaia_pictures_[key] = new gfx::Image(); | 544 cached_avatar_images_[key] = new gfx::Image(); |
| 481 } | 545 } |
| 482 delete image; | 546 delete image; |
| 483 | 547 |
| 484 content::NotificationService::current()->Notify( | 548 content::NotificationService::current()->Notify( |
| 485 chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED, | 549 chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED, |
| 486 content::NotificationService::AllSources(), | 550 content::NotificationService::AllSources(), |
| 487 content::NotificationService::NoDetails()); | 551 content::NotificationService::NoDetails()); |
| 488 } | 552 } |
| 489 | 553 |
| 490 void ProfileInfoCache::OnGAIAPictureSaved(const base::FilePath& path, | 554 void ProfileInfoCache::OnGAIAPictureSaved(const base::FilePath& path, |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 667 // This takes ownership of |info|. | 731 // This takes ownership of |info|. |
| 668 SetInfoForProfileAtIndex(index, info.release()); | 732 SetInfoForProfileAtIndex(index, info.release()); |
| 669 } | 733 } |
| 670 | 734 |
| 671 void ProfileInfoCache::SetGAIAPictureOfProfileAtIndex(size_t index, | 735 void ProfileInfoCache::SetGAIAPictureOfProfileAtIndex(size_t index, |
| 672 const gfx::Image* image) { | 736 const gfx::Image* image) { |
| 673 base::FilePath path = GetPathOfProfileAtIndex(index); | 737 base::FilePath path = GetPathOfProfileAtIndex(index); |
| 674 std::string key = CacheKeyFromProfilePath(path); | 738 std::string key = CacheKeyFromProfilePath(path); |
| 675 | 739 |
| 676 // Delete the old bitmap from cache. | 740 // Delete the old bitmap from cache. |
| 677 std::map<std::string, gfx::Image*>::iterator it = gaia_pictures_.find(key); | 741 std::map<std::string, gfx::Image*>::iterator it = |
| 678 if (it != gaia_pictures_.end()) { | 742 cached_avatar_images_.find(key); |
| 743 if (it != cached_avatar_images_.end()) { |
| 679 delete it->second; | 744 delete it->second; |
| 680 gaia_pictures_.erase(it); | 745 cached_avatar_images_.erase(it); |
| 681 } | 746 } |
| 682 | 747 |
| 683 std::string old_file_name; | 748 std::string old_file_name; |
| 684 GetInfoForProfileAtIndex(index)->GetString( | 749 GetInfoForProfileAtIndex(index)->GetString( |
| 685 kGAIAPictureFileNameKey, &old_file_name); | 750 kGAIAPictureFileNameKey, &old_file_name); |
| 686 std::string new_file_name; | 751 std::string new_file_name; |
| 687 | 752 |
| 688 if (!image) { | 753 if (!image) { |
| 689 // Delete the old bitmap from disk. | 754 // Delete the old bitmap from disk. |
| 690 if (!old_file_name.empty()) { | 755 if (!old_file_name.empty()) { |
| 691 base::FilePath image_path = path.AppendASCII(old_file_name); | 756 base::FilePath image_path = path.AppendASCII(old_file_name); |
| 692 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, | 757 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, |
| 693 base::Bind(&DeleteBitmap, image_path)); | 758 base::Bind(&DeleteBitmap, image_path)); |
| 694 } | 759 } |
| 695 } else { | 760 } else { |
| 696 // Save the new bitmap to disk. | 761 // Save the new bitmap to disk. |
| 697 gaia_pictures_[key] = new gfx::Image(*image); | 762 cached_avatar_images_[key] = new gfx::Image(*image); |
| 698 scoped_ptr<ImageData> data(new ImageData); | 763 scoped_ptr<ImageData> data(new ImageData); |
| 699 scoped_refptr<base::RefCountedMemory> png_data = image->As1xPNGBytes(); | 764 scoped_refptr<base::RefCountedMemory> png_data = image->As1xPNGBytes(); |
| 700 data->assign(png_data->front(), png_data->front() + png_data->size()); | 765 data->assign(png_data->front(), png_data->front() + png_data->size()); |
| 701 if (!data->size()) { | 766 if (!data->size()) { |
| 702 LOG(ERROR) << "Failed to PNG encode the image."; | 767 LOG(ERROR) << "Failed to PNG encode the image."; |
| 703 } else { | 768 } else { |
| 704 new_file_name = | 769 new_file_name = |
| 705 old_file_name.empty() ? kGAIAPictureFileName : old_file_name; | 770 old_file_name.empty() ? kGAIAPictureFileName : old_file_name; |
| 706 base::FilePath image_path = path.AppendASCII(new_file_name); | 771 base::FilePath image_path = path.AppendASCII(new_file_name); |
| 707 bool* success = new bool; | 772 bool* success = new bool; |
| (...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 988 info->GetString(kNameKey, &name); | 1053 info->GetString(kNameKey, &name); |
| 989 names.push_back(name); | 1054 names.push_back(name); |
| 990 } | 1055 } |
| 991 return names; | 1056 return names; |
| 992 } | 1057 } |
| 993 | 1058 |
| 994 // static | 1059 // static |
| 995 void ProfileInfoCache::RegisterPrefs(PrefRegistrySimple* registry) { | 1060 void ProfileInfoCache::RegisterPrefs(PrefRegistrySimple* registry) { |
| 996 registry->RegisterDictionaryPref(prefs::kProfileInfoCache); | 1061 registry->RegisterDictionaryPref(prefs::kProfileInfoCache); |
| 997 } | 1062 } |
| OLD | NEW |