Chromium Code Reviews| 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_shortcut_manager_win.h" | 5 #include "chrome/browser/profiles/profile_shortcut_manager_win.h" | 
| 6 | 6 | 
| 7 #include <shlobj.h> // For SHChangeNotify(). | 7 #include <shlobj.h> // For SHChangeNotify(). | 
| 8 | 8 | 
| 9 #include <string> | 9 #include <string> | 
| 10 #include <vector> | 10 #include <vector> | 
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 132 offscreen_canvas->getDevice()->accessBitmap(false); | 132 offscreen_canvas->getDevice()->accessBitmap(false); | 
| 133 SkBitmap badged_bitmap_copy; | 133 SkBitmap badged_bitmap_copy; | 
| 134 badged_bitmap.deepCopyTo(&badged_bitmap_copy, badged_bitmap.getConfig()); | 134 badged_bitmap.deepCopyTo(&badged_bitmap_copy, badged_bitmap.getConfig()); | 
| 135 return badged_bitmap_copy; | 135 return badged_bitmap_copy; | 
| 136 } | 136 } | 
| 137 | 137 | 
| 138 // Creates a desktop shortcut icon file (.ico) on the disk for a given profile, | 138 // Creates a desktop shortcut icon file (.ico) on the disk for a given profile, | 
| 139 // badging the browser distribution icon with the profile avatar. | 139 // badging the browser distribution icon with the profile avatar. | 
| 140 // Returns a path to the shortcut icon file on disk, which is empty if this | 140 // Returns a path to the shortcut icon file on disk, which is empty if this | 
| 141 // fails. Use index 0 when assigning the resulting file as the icon. | 141 // fails. Use index 0 when assigning the resulting file as the icon. | 
| 142 base::FilePath CreateChromeDesktopShortcutIconForProfile( | 142 void CreateOrUpdateShortcutIconForProfile( | 
| 143 const base::FilePath& profile_path, | 143 const base::FilePath& profile_path, | 
| 144 const SkBitmap& avatar_bitmap_1x, | 144 const SkBitmap& avatar_bitmap_1x, | 
| 145 const SkBitmap& avatar_bitmap_2x) { | 145 const SkBitmap& avatar_bitmap_2x) { | 
| 146 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 146 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 
| 147 scoped_ptr<SkBitmap> app_icon_bitmap(GetAppIconForSize(kShortcutIconSize)); | 147 scoped_ptr<SkBitmap> app_icon_bitmap(GetAppIconForSize(kShortcutIconSize)); | 
| 148 if (!app_icon_bitmap.get()) | 148 if (!app_icon_bitmap.get()) | 
| 149 return base::FilePath(); | 149 return; | 
| 150 | 150 | 
| 151 const SkBitmap badged_bitmap = BadgeIcon(*app_icon_bitmap, | 151 const SkBitmap badged_bitmap = BadgeIcon(*app_icon_bitmap, | 
| 152 avatar_bitmap_1x, 1); | 152 avatar_bitmap_1x, 1); | 
| 153 | 153 | 
| 154 SkBitmap large_badged_bitmap; | 154 SkBitmap large_badged_bitmap; | 
| 155 app_icon_bitmap = GetAppIconForSize(IconUtil::kLargeIconSize); | 155 app_icon_bitmap = GetAppIconForSize(IconUtil::kLargeIconSize); | 
| 156 if (app_icon_bitmap.get()) | 156 if (app_icon_bitmap.get()) | 
| 157 large_badged_bitmap = BadgeIcon(*app_icon_bitmap, avatar_bitmap_2x, 2); | 157 large_badged_bitmap = BadgeIcon(*app_icon_bitmap, avatar_bitmap_2x, 2); | 
| 158 | 158 | 
| 159 // Finally, write the .ico file containing this new bitmap. | 159 // Finally, write the .ico file containing this new bitmap. | 
| 160 const base::FilePath icon_path = | 160 const base::FilePath icon_path = | 
| 161 profile_path.AppendASCII(profiles::internal::kProfileIconFileName); | 161 profile_path.AppendASCII(profiles::internal::kProfileIconFileName); | 
| 162 if (!IconUtil::CreateIconFileFromSkBitmap(badged_bitmap, large_badged_bitmap, | 162 if (!IconUtil::CreateIconFileFromSkBitmap(badged_bitmap, large_badged_bitmap, | 
| 163 icon_path)) | 163 icon_path)) | 
| 164 return base::FilePath(); | 164 LOG(ERROR) << "Failed to create icon at " << icon_path.value(); | 
| 
 
Alexei Svitkine (slow)
2013/04/26 21:16:23
Just make it a NOTREACHED()?
Also, please add {}'
 
calamity
2013/04/30 06:45:41
Done.
 
 | |
| 165 | |
| 166 return icon_path; | |
| 167 } | 165 } | 
| 168 | 166 | 
| 169 // Gets the user and system directories for desktop shortcuts. Parameters may | 167 // Gets the user and system directories for desktop shortcuts. Parameters may | 
| 170 // be NULL if a directory type is not needed. Returns true on success. | 168 // be NULL if a directory type is not needed. Returns true on success. | 
| 171 bool GetDesktopShortcutsDirectories( | 169 bool GetDesktopShortcutsDirectories( | 
| 172 base::FilePath* user_shortcuts_directory, | 170 base::FilePath* user_shortcuts_directory, | 
| 173 base::FilePath* system_shortcuts_directory) { | 171 base::FilePath* system_shortcuts_directory) { | 
| 174 BrowserDistribution* distribution = BrowserDistribution::GetDistribution(); | 172 BrowserDistribution* distribution = BrowserDistribution::GetDistribution(); | 
| 175 if (user_shortcuts_directory && | 173 if (user_shortcuts_directory && | 
| 176 !ShellUtil::GetShortcutPath(ShellUtil::SHORTCUT_LOCATION_DESKTOP, | 174 !ShellUtil::GetShortcutPath(ShellUtil::SHORTCUT_LOCATION_DESKTOP, | 
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 306 } | 304 } | 
| 307 | 305 | 
| 308 // Updates all desktop shortcuts for the given profile to have the specified | 306 // Updates all desktop shortcuts for the given profile to have the specified | 
| 309 // parameters. If |create_mode| is CREATE_WHEN_NONE_FOUND, a new shortcut is | 307 // parameters. If |create_mode| is CREATE_WHEN_NONE_FOUND, a new shortcut is | 
| 310 // created if no existing ones were found. Whether non-profile shortcuts should | 308 // created if no existing ones were found. Whether non-profile shortcuts should | 
| 311 // be updated is specified by |action|. Must be called on the FILE thread. | 309 // be updated is specified by |action|. Must be called on the FILE thread. | 
| 312 void CreateOrUpdateDesktopShortcutsForProfile( | 310 void CreateOrUpdateDesktopShortcutsForProfile( | 
| 313 const base::FilePath& profile_path, | 311 const base::FilePath& profile_path, | 
| 314 const string16& old_profile_name, | 312 const string16& old_profile_name, | 
| 315 const string16& profile_name, | 313 const string16& profile_name, | 
| 316 const SkBitmap& avatar_image_1x, | |
| 317 const SkBitmap& avatar_image_2x, | |
| 318 ProfileShortcutManagerWin::CreateOrUpdateMode create_mode, | 314 ProfileShortcutManagerWin::CreateOrUpdateMode create_mode, | 
| 319 ProfileShortcutManagerWin::NonProfileShortcutAction action) { | 315 ProfileShortcutManagerWin::NonProfileShortcutAction action) { | 
| 320 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 316 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 
| 321 | 317 | 
| 322 base::FilePath chrome_exe; | 318 base::FilePath chrome_exe; | 
| 323 if (!PathService::Get(base::FILE_EXE, &chrome_exe)) { | 319 if (!PathService::Get(base::FILE_EXE, &chrome_exe)) { | 
| 324 NOTREACHED(); | 320 NOTREACHED(); | 
| 325 return; | 321 return; | 
| 326 } | 322 } | 
| 327 | 323 | 
| (...skipping 17 matching lines...) Expand all Loading... | |
| 345 installer::Product product(distribution); | 341 installer::Product product(distribution); | 
| 346 product.AddDefaultShortcutProperties(chrome_exe, &properties); | 342 product.AddDefaultShortcutProperties(chrome_exe, &properties); | 
| 347 | 343 | 
| 348 const string16 command_line = | 344 const string16 command_line = | 
| 349 profiles::internal::CreateProfileShortcutFlags(profile_path); | 345 profiles::internal::CreateProfileShortcutFlags(profile_path); | 
| 350 | 346 | 
| 351 // Only set the profile-specific properties when |profile_name| is non empty. | 347 // Only set the profile-specific properties when |profile_name| is non empty. | 
| 352 // If it is empty, it means the shortcut being created should be a regular, | 348 // If it is empty, it means the shortcut being created should be a regular, | 
| 353 // non-profile Chrome shortcut. | 349 // non-profile Chrome shortcut. | 
| 354 if (!profile_name.empty()) { | 350 if (!profile_name.empty()) { | 
| 355 const base::FilePath shortcut_icon = | 351 base::FilePath shortcut_icon = | 
| 356 CreateChromeDesktopShortcutIconForProfile(profile_path, | 352 profile_path.AppendASCII(profiles::internal::kProfileIconFileName); | 
| 357 avatar_image_1x, | 353 if (file_util::PathExists(shortcut_icon)) | 
| 
 
Alexei Svitkine (slow)
2013/04/26 21:16:23
When would this be the case?
Wouldn't we want to
 
calamity
2013/04/30 06:45:41
Rolled the 2 functions back together and created t
 
 | |
| 358 avatar_image_2x); | |
| 359 if (!shortcut_icon.empty()) | |
| 360 properties.set_icon(shortcut_icon, 0); | 354 properties.set_icon(shortcut_icon, 0); | 
| 361 properties.set_arguments(command_line); | 355 properties.set_arguments(command_line); | 
| 362 } else { | 356 } else { | 
| 363 // Set the arguments explicitly to the empty string to ensure that | 357 // Set the arguments explicitly to the empty string to ensure that | 
| 364 // |ShellUtil::CreateOrUpdateShortcut| updates that part of the shortcut. | 358 // |ShellUtil::CreateOrUpdateShortcut| updates that part of the shortcut. | 
| 365 properties.set_arguments(string16()); | 359 properties.set_arguments(string16()); | 
| 366 } | 360 } | 
| 367 | 361 | 
| 368 ShellUtil::ShortcutOperation operation = | 362 ShellUtil::ShortcutOperation operation = | 
| 369 ShellUtil::SHELL_SHORTCUT_REPLACE_EXISTING; | 363 ShellUtil::SHELL_SHORTCUT_REPLACE_EXISTING; | 
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 433 // Use file_util::Delete() instead of ShellUtil::RemoveShortcut(), as the | 427 // Use file_util::Delete() instead of ShellUtil::RemoveShortcut(), as the | 
| 434 // latter causes non-profile taskbar shortcuts to be unpinned. | 428 // latter causes non-profile taskbar shortcuts to be unpinned. | 
| 435 file_util::Delete(shortcuts[i], false); | 429 file_util::Delete(shortcuts[i], false); | 
| 436 // Notify the shell that the shortcut was deleted to ensure desktop refresh. | 430 // Notify the shell that the shortcut was deleted to ensure desktop refresh. | 
| 437 SHChangeNotify(SHCNE_DELETE, SHCNF_PATH, shortcuts[i].value().c_str(), | 431 SHChangeNotify(SHCNE_DELETE, SHCNF_PATH, shortcuts[i].value().c_str(), | 
| 438 NULL); | 432 NULL); | 
| 439 } | 433 } | 
| 440 | 434 | 
| 441 const base::FilePath icon_path = | 435 const base::FilePath icon_path = | 
| 442 profile_path.AppendASCII(profiles::internal::kProfileIconFileName); | 436 profile_path.AppendASCII(profiles::internal::kProfileIconFileName); | 
| 443 file_util::Delete(icon_path, false); | 437 file_util::Delete(icon_path, false); | 
| 
 
Alexei Svitkine (slow)
2013/04/26 21:16:23
I think you need to remove this line, else when so
 
calamity
2013/04/30 06:45:41
Done.
The change I've made to the tests assert th
 
 | |
| 444 | 438 | 
| 445 // If |ensure_shortcuts_remain| is true and deleting this profile caused the | 439 // If |ensure_shortcuts_remain| is true and deleting this profile caused the | 
| 446 // last shortcuts to be removed, re-create a regular non-profile shortcut. | 440 // last shortcuts to be removed, re-create a regular non-profile shortcut. | 
| 447 const bool had_shortcuts = !shortcuts.empty(); | 441 const bool had_shortcuts = !shortcuts.empty(); | 
| 448 if (ensure_shortcuts_remain && had_shortcuts && | 442 if (ensure_shortcuts_remain && had_shortcuts && | 
| 449 !ChromeDesktopShortcutsExist(chrome_exe)) { | 443 !ChromeDesktopShortcutsExist(chrome_exe)) { | 
| 450 BrowserDistribution* distribution = BrowserDistribution::GetDistribution(); | 444 BrowserDistribution* distribution = BrowserDistribution::GetDistribution(); | 
| 451 // Ensure that the distribution supports creating shortcuts. If it doesn't, | 445 // Ensure that the distribution supports creating shortcuts. If it doesn't, | 
| 452 // the following code may result in NOTREACHED() being hit. | 446 // the following code may result in NOTREACHED() being hit. | 
| 453 DCHECK(distribution->CanCreateDesktopShortcuts()); | 447 DCHECK(distribution->CanCreateDesktopShortcuts()); | 
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 589 void ProfileShortcutManagerWin::HasProfileShortcuts( | 583 void ProfileShortcutManagerWin::HasProfileShortcuts( | 
| 590 const base::FilePath& profile_path, | 584 const base::FilePath& profile_path, | 
| 591 const base::Callback<void(bool)>& callback) { | 585 const base::Callback<void(bool)>& callback) { | 
| 592 BrowserThread::PostTaskAndReplyWithResult( | 586 BrowserThread::PostTaskAndReplyWithResult( | 
| 593 BrowserThread::FILE, FROM_HERE, | 587 BrowserThread::FILE, FROM_HERE, | 
| 594 base::Bind(&HasAnyProfileShortcuts, profile_path), callback); | 588 base::Bind(&HasAnyProfileShortcuts, profile_path), callback); | 
| 595 } | 589 } | 
| 596 | 590 | 
| 597 void ProfileShortcutManagerWin::OnProfileAdded( | 591 void ProfileShortcutManagerWin::OnProfileAdded( | 
| 598 const base::FilePath& profile_path) { | 592 const base::FilePath& profile_path) { | 
| 593 CreateOrUpdateShortcutIconForProfileAtPath(profile_path); | |
| 599 const size_t profile_count = | 594 const size_t profile_count = | 
| 600 profile_manager_->GetProfileInfoCache().GetNumberOfProfiles(); | 595 profile_manager_->GetProfileInfoCache().GetNumberOfProfiles(); | 
| 601 if (profile_count == 1) { | 596 if (profile_count == 1) { | 
| 602 CreateOrUpdateShortcutsForProfileAtPath(profile_path, | 597 CreateOrUpdateShortcutsForProfileAtPath(profile_path, | 
| 603 CREATE_WHEN_NONE_FOUND, | 598 CREATE_WHEN_NONE_FOUND, | 
| 604 UPDATE_NON_PROFILE_SHORTCUTS); | 599 UPDATE_NON_PROFILE_SHORTCUTS); | 
| 605 } else if (profile_count == 2) { | 600 } else if (profile_count == 2) { | 
| 606 CreateOrUpdateShortcutsForProfileAtPath(GetOtherProfilePath(profile_path), | 601 CreateOrUpdateShortcutsForProfileAtPath(GetOtherProfilePath(profile_path), | 
| 607 UPDATE_EXISTING_ONLY, | 602 UPDATE_EXISTING_ONLY, | 
| 608 UPDATE_NON_PROFILE_SHORTCUTS); | 603 UPDATE_NON_PROFILE_SHORTCUTS); | 
| 609 } | 604 } | 
| 610 } | 605 } | 
| 611 | 606 | 
| 612 void ProfileShortcutManagerWin::OnProfileWillBeRemoved( | 607 void ProfileShortcutManagerWin::OnProfileWillBeRemoved( | 
| 613 const base::FilePath& profile_path) { | 608 const base::FilePath& profile_path) { | 
| 614 } | 609 } | 
| 615 | 610 | 
| 616 void ProfileShortcutManagerWin::OnProfileWasRemoved( | 611 void ProfileShortcutManagerWin::OnProfileWasRemoved( | 
| 617 const base::FilePath& profile_path, | 612 const base::FilePath& profile_path, | 
| 618 const string16& profile_name) { | 613 const string16& profile_name) { | 
| 619 const ProfileInfoCache& cache = profile_manager_->GetProfileInfoCache(); | 614 const ProfileInfoCache& cache = profile_manager_->GetProfileInfoCache(); | 
| 620 // If there is only one profile remaining, remove the badging information | 615 // If there is only one profile remaining, remove the badging information | 
| 621 // from an existing shortcut. | 616 // from an existing shortcut. | 
| 622 const bool deleting_down_to_last_profile = (cache.GetNumberOfProfiles() == 1); | 617 const bool deleting_down_to_last_profile = (cache.GetNumberOfProfiles() == 1); | 
| 623 if (deleting_down_to_last_profile) { | 618 if (deleting_down_to_last_profile) { | 
| 624 CreateOrUpdateShortcutsForProfileAtPath(cache.GetPathOfProfileAtIndex(0), | 619 base::FilePath profile_path = cache.GetPathOfProfileAtIndex(0); | 
| 620 CreateOrUpdateShortcutIconForProfileAtPath(profile_path); | |
| 
 
Alexei Svitkine (slow)
2013/04/26 21:16:23
Add a comment mentioning that this is needed to "u
 
calamity
2013/04/30 06:45:41
Done. I actually want to make an unbadged icon tha
 
Alexei Svitkine (slow)
2013/05/01 15:27:30
I think it's fine to create an un-badged icon for
 
 | |
| 621 CreateOrUpdateShortcutsForProfileAtPath(profile_path, | |
| 625 UPDATE_EXISTING_ONLY, | 622 UPDATE_EXISTING_ONLY, | 
| 626 IGNORE_NON_PROFILE_SHORTCUTS); | 623 IGNORE_NON_PROFILE_SHORTCUTS); | 
| 627 } | 624 } | 
| 628 | 625 | 
| 629 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, | 626 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, | 
| 630 base::Bind(&DeleteDesktopShortcutsAndIconFile, | 627 base::Bind(&DeleteDesktopShortcutsAndIconFile, | 
| 631 profile_path, | 628 profile_path, | 
| 632 deleting_down_to_last_profile)); | 629 deleting_down_to_last_profile)); | 
| 633 } | 630 } | 
| 634 | 631 | 
| 635 void ProfileShortcutManagerWin::OnProfileNameChanged( | 632 void ProfileShortcutManagerWin::OnProfileNameChanged( | 
| 636 const base::FilePath& profile_path, | 633 const base::FilePath& profile_path, | 
| 637 const string16& old_profile_name) { | 634 const string16& old_profile_name) { | 
| 638 CreateOrUpdateShortcutsForProfileAtPath(profile_path, UPDATE_EXISTING_ONLY, | 635 CreateOrUpdateShortcutsForProfileAtPath(profile_path, UPDATE_EXISTING_ONLY, | 
| 639 IGNORE_NON_PROFILE_SHORTCUTS); | 636 IGNORE_NON_PROFILE_SHORTCUTS); | 
| 640 } | 637 } | 
| 641 | 638 | 
| 642 void ProfileShortcutManagerWin::OnProfileAvatarChanged( | 639 void ProfileShortcutManagerWin::OnProfileAvatarChanged( | 
| 643 const base::FilePath& profile_path) { | 640 const base::FilePath& profile_path) { | 
| 641 CreateOrUpdateShortcutIconForProfileAtPath(profile_path); | |
| 644 CreateOrUpdateShortcutsForProfileAtPath(profile_path, UPDATE_EXISTING_ONLY, | 642 CreateOrUpdateShortcutsForProfileAtPath(profile_path, UPDATE_EXISTING_ONLY, | 
| 
 
Alexei Svitkine (slow)
2013/04/26 21:16:23
Is this call necessary if we're already calling Cr
 
calamity
2013/04/30 06:45:41
Not updating the shortcut seems to be fine.
 
 | |
| 645 IGNORE_NON_PROFILE_SHORTCUTS); | 643 IGNORE_NON_PROFILE_SHORTCUTS); | 
| 646 } | 644 } | 
| 647 | 645 | 
| 648 base::FilePath ProfileShortcutManagerWin::GetOtherProfilePath( | 646 base::FilePath ProfileShortcutManagerWin::GetOtherProfilePath( | 
| 649 const base::FilePath& profile_path) { | 647 const base::FilePath& profile_path) { | 
| 650 const ProfileInfoCache& cache = profile_manager_->GetProfileInfoCache(); | 648 const ProfileInfoCache& cache = profile_manager_->GetProfileInfoCache(); | 
| 651 DCHECK_EQ(2U, cache.GetNumberOfProfiles()); | 649 DCHECK_EQ(2U, cache.GetNumberOfProfiles()); | 
| 652 // Get the index of the current profile, in order to find the index of the | 650 // Get the index of the current profile, in order to find the index of the | 
| 653 // other profile. | 651 // other profile. | 
| 654 size_t current_profile_index = cache.GetIndexOfProfileWithPath(profile_path); | 652 size_t current_profile_index = cache.GetIndexOfProfileWithPath(profile_path); | 
| 655 size_t other_profile_index = (current_profile_index == 0) ? 1 : 0; | 653 size_t other_profile_index = (current_profile_index == 0) ? 1 : 0; | 
| 656 return cache.GetPathOfProfileAtIndex(other_profile_index); | 654 return cache.GetPathOfProfileAtIndex(other_profile_index); | 
| 657 } | 655 } | 
| 658 | 656 | 
| 659 void ProfileShortcutManagerWin::CreateOrUpdateShortcutsForProfileAtPath( | 657 void ProfileShortcutManagerWin::CreateOrUpdateShortcutsForProfileAtPath( | 
| 660 const base::FilePath& profile_path, | 658 const base::FilePath& profile_path, | 
| 661 CreateOrUpdateMode create_mode, | 659 CreateOrUpdateMode create_mode, | 
| 662 NonProfileShortcutAction action) { | 660 NonProfileShortcutAction action) { | 
| 663 ProfileInfoCache* cache = &profile_manager_->GetProfileInfoCache(); | 661 ProfileInfoCache* cache = &profile_manager_->GetProfileInfoCache(); | 
| 664 size_t profile_index = cache->GetIndexOfProfileWithPath(profile_path); | 662 size_t profile_index = cache->GetIndexOfProfileWithPath(profile_path); | 
| 665 if (profile_index == std::string::npos) | 663 if (profile_index == std::string::npos) | 
| 666 return; | 664 return; | 
| 667 bool remove_badging = cache->GetNumberOfProfiles() == 1; | 665 bool is_last_profile = cache->GetNumberOfProfiles() == 1; | 
| 668 | 666 | 
| 669 string16 old_shortcut_appended_name = | 667 string16 old_shortcut_appended_name = | 
| 670 cache->GetShortcutNameOfProfileAtIndex(profile_index); | 668 cache->GetShortcutNameOfProfileAtIndex(profile_index); | 
| 671 | 669 | 
| 672 // Exit early if the mode is to update existing profile shortcuts only and | 670 // Exit early if the mode is to update existing profile shortcuts only and | 
| 673 // none were ever created for this profile, per the shortcut name not being | 671 // none were ever created for this profile, per the shortcut name not being | 
| 674 // set in the profile info cache. | 672 // set in the profile info cache. | 
| 675 if (old_shortcut_appended_name.empty() && | 673 if (old_shortcut_appended_name.empty() && | 
| 676 create_mode == UPDATE_EXISTING_ONLY && | 674 create_mode == UPDATE_EXISTING_ONLY && | 
| 677 action == IGNORE_NON_PROFILE_SHORTCUTS) { | 675 action == IGNORE_NON_PROFILE_SHORTCUTS) { | 
| 678 return; | 676 return; | 
| 679 } | 677 } | 
| 680 | 678 | 
| 681 string16 new_shortcut_appended_name; | 679 string16 new_shortcut_appended_name; | 
| 682 if (!remove_badging) | 680 if (!is_last_profile) | 
| 683 new_shortcut_appended_name = cache->GetNameOfProfileAtIndex(profile_index); | 681 new_shortcut_appended_name = cache->GetNameOfProfileAtIndex(profile_index); | 
| 684 | 682 | 
| 683 BrowserThread::PostTask( | |
| 684 BrowserThread::FILE, FROM_HERE, | |
| 685 base::Bind(&CreateOrUpdateDesktopShortcutsForProfile, profile_path, | |
| 686 old_shortcut_appended_name, new_shortcut_appended_name, | |
| 687 create_mode, action)); | |
| 688 | |
| 689 cache->SetShortcutNameOfProfileAtIndex(profile_index, | |
| 690 new_shortcut_appended_name); | |
| 691 } | |
| 692 | |
| 693 void ProfileShortcutManagerWin::CreateOrUpdateShortcutIconForProfileAtPath( | |
| 694 const base::FilePath& profile_path) { | |
| 695 ProfileInfoCache* cache = &profile_manager_->GetProfileInfoCache(); | |
| 696 size_t profile_index = cache->GetIndexOfProfileWithPath(profile_path); | |
| 697 if (profile_index == std::string::npos) | |
| 698 return; | |
| 699 bool remove_badging = cache->GetNumberOfProfiles() == 1; | |
| 700 | |
| 685 SkBitmap avatar_bitmap_copy_1x; | 701 SkBitmap avatar_bitmap_copy_1x; | 
| 686 SkBitmap avatar_bitmap_copy_2x; | 702 SkBitmap avatar_bitmap_copy_2x; | 
| 687 if (!remove_badging) { | 703 if (!remove_badging) { | 
| 688 const size_t icon_index = | 704 const size_t icon_index = | 
| 689 cache->GetAvatarIconIndexOfProfileAtIndex(profile_index); | 705 cache->GetAvatarIconIndexOfProfileAtIndex(profile_index); | 
| 690 const int resource_id_1x = | 706 const int resource_id_1x = | 
| 691 cache->GetDefaultAvatarIconResourceIDAtIndex(icon_index); | 707 cache->GetDefaultAvatarIconResourceIDAtIndex(icon_index); | 
| 692 const int resource_id_2x = kProfileAvatarIconResources2x[icon_index]; | 708 const int resource_id_2x = kProfileAvatarIconResources2x[icon_index]; | 
| 693 // Make a copy of the SkBitmaps to ensure that we can safely use the image | 709 // Make a copy of the SkBitmaps to ensure that we can safely use the image | 
| 694 // data on the FILE thread. | 710 // data on the FILE thread. | 
| 695 avatar_bitmap_copy_1x = GetImageResourceSkBitmapCopy(resource_id_1x); | 711 avatar_bitmap_copy_1x = GetImageResourceSkBitmapCopy(resource_id_1x); | 
| 696 avatar_bitmap_copy_2x = GetImageResourceSkBitmapCopy(resource_id_2x); | 712 avatar_bitmap_copy_2x = GetImageResourceSkBitmapCopy(resource_id_2x); | 
| 697 } | 713 } | 
| 698 BrowserThread::PostTask( | 714 BrowserThread::PostTask( | 
| 699 BrowserThread::FILE, FROM_HERE, | 715 BrowserThread::FILE, FROM_HERE, | 
| 700 base::Bind(&CreateOrUpdateDesktopShortcutsForProfile, profile_path, | 716 base::Bind(&CreateOrUpdateShortcutIconForProfile, profile_path, | 
| 701 old_shortcut_appended_name, new_shortcut_appended_name, | 717 avatar_bitmap_copy_1x, avatar_bitmap_copy_2x)); | 
| 702 avatar_bitmap_copy_1x, avatar_bitmap_copy_2x, create_mode, | |
| 703 action)); | |
| 704 | |
| 705 cache->SetShortcutNameOfProfileAtIndex(profile_index, | |
| 706 new_shortcut_appended_name); | |
| 707 } | 718 } | 
| OLD | NEW |