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

Side by Side Diff: chrome/browser/profiles/profile_shortcut_manager_win.cc

Issue 14137032: Create profile .ico file on profile creation (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rework, roll back refactor, handle creation of unbadged icons Created 7 years, 7 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 (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 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
131 const SkBitmap& badged_bitmap = 131 const SkBitmap& badged_bitmap =
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. If both
142 base::FilePath CreateChromeDesktopShortcutIconForProfile( 142 // given bitmaps are empty, an unbadged icon is created.
Alexei Svitkine (slow) 2013/05/01 15:27:30 Please add a TODO that ideally we'd just want to c
calamity 2013/05/03 04:40:28 Done.
143 base::FilePath CreateOrUpdateShortcutIconForProfile(
143 const base::FilePath& profile_path, 144 const base::FilePath& profile_path,
144 const SkBitmap& avatar_bitmap_1x, 145 const SkBitmap& avatar_bitmap_1x,
145 const SkBitmap& avatar_bitmap_2x) { 146 const SkBitmap& avatar_bitmap_2x) {
146 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 147 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
Alexei Svitkine (slow) 2013/05/01 15:27:30 Add: DCHECK_EQ(avatar_bitmap_1x.empty(), avatar_bi
calamity 2013/05/03 04:40:28 I'm assuming this is to facilitate the change belo
147 scoped_ptr<SkBitmap> app_icon_bitmap(GetAppIconForSize(kShortcutIconSize)); 148 scoped_ptr<SkBitmap> app_icon_bitmap(GetAppIconForSize(kShortcutIconSize));
148 if (!app_icon_bitmap.get()) 149 if (!app_icon_bitmap.get())
149 return base::FilePath(); 150 return base::FilePath();
150 151
151 const SkBitmap badged_bitmap = BadgeIcon(*app_icon_bitmap, 152 SkBitmap badged_bitmap;
Alexei Svitkine (slow) 2013/05/01 15:27:30 How about: SkBitmap badged_bitmap = avatar_bitmap
calamity 2013/05/03 04:40:28 I think that making these changes decreases the ro
152 avatar_bitmap_1x, 1); 153 if (!avatar_bitmap_1x.empty())
154 badged_bitmap = BadgeIcon(*app_icon_bitmap, avatar_bitmap_1x, 1);
153 155
154 SkBitmap large_badged_bitmap; 156 SkBitmap large_badged_bitmap;
155 app_icon_bitmap = GetAppIconForSize(IconUtil::kLargeIconSize); 157 scoped_ptr<SkBitmap> large_app_icon_bitmap(
156 if (app_icon_bitmap.get()) 158 GetAppIconForSize(IconUtil::kLargeIconSize));
157 large_badged_bitmap = BadgeIcon(*app_icon_bitmap, avatar_bitmap_2x, 2); 159 if (large_app_icon_bitmap.get() && !avatar_bitmap_2x.empty()) {
160 large_badged_bitmap =
161 BadgeIcon(*large_app_icon_bitmap, avatar_bitmap_2x, 2);
162 }
158 163
159 // Finally, write the .ico file containing this new bitmap. 164 // Finally, write the .ico file containing this new bitmap.
160 const base::FilePath icon_path = 165 const base::FilePath icon_path =
161 profile_path.AppendASCII(profiles::internal::kProfileIconFileName); 166 profiles::internal::GetProfileIconPath(profile_path);
167 if (avatar_bitmap_1x.empty() && avatar_bitmap_2x.empty()) {
168 badged_bitmap = *app_icon_bitmap;
169 if (large_app_icon_bitmap.get())
170 large_badged_bitmap = *large_app_icon_bitmap;
171 }
162 if (!IconUtil::CreateIconFileFromSkBitmap(badged_bitmap, large_badged_bitmap, 172 if (!IconUtil::CreateIconFileFromSkBitmap(badged_bitmap, large_badged_bitmap,
163 icon_path)) 173 icon_path)) {
164 return base::FilePath(); 174 NOTREACHED();
Alexei Svitkine (slow) 2013/05/01 15:27:30 Re-add the return base::FilePath() to propagate th
calamity 2013/05/03 04:40:28 Done.
165 175 }
176 SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST | SHCNF_FLUSHNOWAIT,
177 NULL, NULL);
166 return icon_path; 178 return icon_path;
167 } 179 }
168 180
169 // Gets the user and system directories for desktop shortcuts. Parameters may 181 // 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. 182 // be NULL if a directory type is not needed. Returns true on success.
171 bool GetDesktopShortcutsDirectories( 183 bool GetDesktopShortcutsDirectories(
172 base::FilePath* user_shortcuts_directory, 184 base::FilePath* user_shortcuts_directory,
173 base::FilePath* system_shortcuts_directory) { 185 base::FilePath* system_shortcuts_directory) {
174 BrowserDistribution* distribution = BrowserDistribution::GetDistribution(); 186 BrowserDistribution* distribution = BrowserDistribution::GetDistribution();
175 if (user_shortcuts_directory && 187 if (user_shortcuts_directory &&
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
290 if (file_util::PathExists(possible_new_system_shortcut)) 302 if (file_util::PathExists(possible_new_system_shortcut))
291 file_util::Delete(old_shortcut_path, false); 303 file_util::Delete(old_shortcut_path, false);
292 else if (!RenameDesktopShortcut(old_shortcut_path, new_shortcut_path)) 304 else if (!RenameDesktopShortcut(old_shortcut_path, new_shortcut_path))
293 DLOG(ERROR) << "Could not rename Windows profile desktop shortcut."; 305 DLOG(ERROR) << "Could not rename Windows profile desktop shortcut.";
294 } else { 306 } else {
295 // If the shortcut does not exist, it may have been renamed by the user. In 307 // If the shortcut does not exist, it may have been renamed by the user. In
296 // that case, its name should not be changed. 308 // that case, its name should not be changed.
297 // It's also possible that a system-level shortcut exists instead - this 309 // It's also possible that a system-level shortcut exists instead - this
298 // should only be the case for the original Chrome shortcut from an 310 // should only be the case for the original Chrome shortcut from an
299 // installation. If that's the case, copy that one over - it will get its 311 // installation. If that's the case, copy that one over - it will get its
300 // properties updated by |CreateOrUpdateDesktopShortcutsForProfile()|. 312 // properties updated by
313 // |CreateOrUpdateDesktopShortcutsAndIconForProfile()|.
301 const base::FilePath possible_old_system_shortcut = 314 const base::FilePath possible_old_system_shortcut =
302 system_shortcuts_directory.Append(old_shortcut_filename); 315 system_shortcuts_directory.Append(old_shortcut_filename);
303 if (file_util::PathExists(possible_old_system_shortcut)) 316 if (file_util::PathExists(possible_old_system_shortcut))
304 file_util::CopyFile(possible_old_system_shortcut, new_shortcut_path); 317 file_util::CopyFile(possible_old_system_shortcut, new_shortcut_path);
305 } 318 }
306 } 319 }
307 320
308 // Updates all desktop shortcuts for the given profile to have the specified 321 // 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 322 // 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 323 // 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. 324 // be updated is specified by |action|. Must be called on the FILE thread.
312 void CreateOrUpdateDesktopShortcutsForProfile( 325 void CreateOrUpdateDesktopShortcutsAndIconForProfile(
313 const base::FilePath& profile_path, 326 const base::FilePath& profile_path,
314 const string16& old_profile_name, 327 const string16& old_profile_name,
315 const string16& profile_name, 328 const string16& profile_name,
316 const SkBitmap& avatar_image_1x, 329 const SkBitmap& avatar_image_1x,
317 const SkBitmap& avatar_image_2x, 330 const SkBitmap& avatar_image_2x,
318 ProfileShortcutManagerWin::CreateOrUpdateMode create_mode, 331 ProfileShortcutManagerWin::CreateOrUpdateMode create_mode,
319 ProfileShortcutManagerWin::NonProfileShortcutAction action) { 332 ProfileShortcutManagerWin::NonProfileShortcutAction action) {
320 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 333 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
321 334
335 base::FilePath shortcut_icon =
336 CreateOrUpdateShortcutIconForProfile(profile_path,
337 avatar_image_1x,
338 avatar_image_2x);
339 if (shortcut_icon.empty()) {
340 NOTREACHED();
Alexei Svitkine (slow) 2013/05/01 15:27:30 Add a return.
calamity 2013/05/03 04:40:28 Done.
341 }
342 if (create_mode == ProfileShortcutManagerWin::CREATE_ICON_ONLY) {
Alexei Svitkine (slow) 2013/05/01 15:27:30 No need for {}'s.
calamity 2013/05/03 04:40:28 Done.
343 return;
344 }
345
322 base::FilePath chrome_exe; 346 base::FilePath chrome_exe;
323 if (!PathService::Get(base::FILE_EXE, &chrome_exe)) { 347 if (!PathService::Get(base::FILE_EXE, &chrome_exe)) {
324 NOTREACHED(); 348 NOTREACHED();
325 return; 349 return;
326 } 350 }
327 351
328 BrowserDistribution* distribution = BrowserDistribution::GetDistribution(); 352 BrowserDistribution* distribution = BrowserDistribution::GetDistribution();
329 // Ensure that the distribution supports creating shortcuts. If it doesn't, 353 // Ensure that the distribution supports creating shortcuts. If it doesn't,
330 // the following code may result in NOTREACHED() being hit. 354 // the following code may result in NOTREACHED() being hit.
331 DCHECK(distribution->CanCreateDesktopShortcuts()); 355 DCHECK(distribution->CanCreateDesktopShortcuts());
(...skipping 13 matching lines...) Expand all
345 installer::Product product(distribution); 369 installer::Product product(distribution);
346 product.AddDefaultShortcutProperties(chrome_exe, &properties); 370 product.AddDefaultShortcutProperties(chrome_exe, &properties);
347 371
348 const string16 command_line = 372 const string16 command_line =
349 profiles::internal::CreateProfileShortcutFlags(profile_path); 373 profiles::internal::CreateProfileShortcutFlags(profile_path);
350 374
351 // Only set the profile-specific properties when |profile_name| is non empty. 375 // 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, 376 // If it is empty, it means the shortcut being created should be a regular,
353 // non-profile Chrome shortcut. 377 // non-profile Chrome shortcut.
354 if (!profile_name.empty()) { 378 if (!profile_name.empty()) {
355 const base::FilePath shortcut_icon =
356 CreateChromeDesktopShortcutIconForProfile(profile_path,
357 avatar_image_1x,
358 avatar_image_2x);
359 if (!shortcut_icon.empty()) 379 if (!shortcut_icon.empty())
360 properties.set_icon(shortcut_icon, 0); 380 properties.set_icon(shortcut_icon, 0);
361 properties.set_arguments(command_line); 381 properties.set_arguments(command_line);
362 } else { 382 } else {
363 // Set the arguments explicitly to the empty string to ensure that 383 // Set the arguments explicitly to the empty string to ensure that
364 // |ShellUtil::CreateOrUpdateShortcut| updates that part of the shortcut. 384 // |ShellUtil::CreateOrUpdateShortcut| updates that part of the shortcut.
365 properties.set_arguments(string16()); 385 properties.set_arguments(string16());
366 } 386 }
367 387
368 ShellUtil::ShortcutOperation operation = 388 ShellUtil::ShortcutOperation operation =
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
405 return true; 425 return true;
406 } 426 }
407 427
408 return false; 428 return false;
409 } 429 }
410 430
411 // Deletes all desktop shortcuts for the specified profile and also removes the 431 // Deletes all desktop shortcuts for the specified profile and also removes the
412 // corresponding icon file. If |ensure_shortcuts_remain| is true, then a regular 432 // corresponding icon file. If |ensure_shortcuts_remain| is true, then a regular
413 // non-profile shortcut will be created if this function would otherwise delete 433 // non-profile shortcut will be created if this function would otherwise delete
414 // the last Chrome desktop shortcut(s). Must be called on the FILE thread. 434 // the last Chrome desktop shortcut(s). Must be called on the FILE thread.
415 void DeleteDesktopShortcutsAndIconFile(const base::FilePath& profile_path, 435 void DeleteDesktopShortcuts(const base::FilePath& profile_path,
416 bool ensure_shortcuts_remain) { 436 bool ensure_shortcuts_remain) {
417 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 437 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
418 438
419 base::FilePath chrome_exe; 439 base::FilePath chrome_exe;
420 if (!PathService::Get(base::FILE_EXE, &chrome_exe)) { 440 if (!PathService::Get(base::FILE_EXE, &chrome_exe)) {
421 NOTREACHED(); 441 NOTREACHED();
422 return; 442 return;
423 } 443 }
424 444
425 const string16 command_line = 445 const string16 command_line =
426 profiles::internal::CreateProfileShortcutFlags(profile_path); 446 profiles::internal::CreateProfileShortcutFlags(profile_path);
427 std::vector<base::FilePath> shortcuts; 447 std::vector<base::FilePath> shortcuts;
428 ListDesktopShortcutsWithCommandLine(chrome_exe, command_line, false, 448 ListDesktopShortcutsWithCommandLine(chrome_exe, command_line, false,
429 &shortcuts); 449 &shortcuts);
430 450
431 BrowserDistribution* distribution = BrowserDistribution::GetDistribution(); 451 BrowserDistribution* distribution = BrowserDistribution::GetDistribution();
432 for (size_t i = 0; i < shortcuts.size(); ++i) { 452 for (size_t i = 0; i < shortcuts.size(); ++i) {
433 // Use file_util::Delete() instead of ShellUtil::RemoveShortcut(), as the 453 // Use file_util::Delete() instead of ShellUtil::RemoveShortcut(), as the
434 // latter causes non-profile taskbar shortcuts to be unpinned. 454 // latter causes non-profile taskbar shortcuts to be unpinned.
435 file_util::Delete(shortcuts[i], false); 455 file_util::Delete(shortcuts[i], false);
436 // Notify the shell that the shortcut was deleted to ensure desktop refresh. 456 // Notify the shell that the shortcut was deleted to ensure desktop refresh.
437 SHChangeNotify(SHCNE_DELETE, SHCNF_PATH, shortcuts[i].value().c_str(), 457 SHChangeNotify(SHCNE_DELETE, SHCNF_PATH, shortcuts[i].value().c_str(),
438 NULL); 458 NULL);
439 } 459 }
440 460
441 const base::FilePath icon_path =
442 profile_path.AppendASCII(profiles::internal::kProfileIconFileName);
443 file_util::Delete(icon_path, false);
444
445 // If |ensure_shortcuts_remain| is true and deleting this profile caused the 461 // 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. 462 // last shortcuts to be removed, re-create a regular non-profile shortcut.
447 const bool had_shortcuts = !shortcuts.empty(); 463 const bool had_shortcuts = !shortcuts.empty();
448 if (ensure_shortcuts_remain && had_shortcuts && 464 if (ensure_shortcuts_remain && had_shortcuts &&
449 !ChromeDesktopShortcutsExist(chrome_exe)) { 465 !ChromeDesktopShortcutsExist(chrome_exe)) {
450 BrowserDistribution* distribution = BrowserDistribution::GetDistribution(); 466 BrowserDistribution* distribution = BrowserDistribution::GetDistribution();
451 // Ensure that the distribution supports creating shortcuts. If it doesn't, 467 // Ensure that the distribution supports creating shortcuts. If it doesn't,
452 // the following code may result in NOTREACHED() being hit. 468 // the following code may result in NOTREACHED() being hit.
453 DCHECK(distribution->CanCreateDesktopShortcuts()); 469 DCHECK(distribution->CanCreateDesktopShortcuts());
454 installer::Product product(distribution); 470 installer::Product product(distribution);
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
516 SkBitmap bitmap_copy; 532 SkBitmap bitmap_copy;
517 image_bitmap->deepCopyTo(&bitmap_copy, image_bitmap->getConfig()); 533 image_bitmap->deepCopyTo(&bitmap_copy, image_bitmap->getConfig());
518 return bitmap_copy; 534 return bitmap_copy;
519 } 535 }
520 536
521 } // namespace 537 } // namespace
522 538
523 namespace profiles { 539 namespace profiles {
524 namespace internal { 540 namespace internal {
525 541
542 base::FilePath GetProfileIconPath(const base::FilePath& profile_path) {
543 return profile_path.AppendASCII(profiles::internal::kProfileIconFileName);
544 }
545
526 const char kProfileIconFileName[] = "Google Profile.ico"; 546 const char kProfileIconFileName[] = "Google Profile.ico";
527 547
528 string16 GetShortcutFilenameForProfile(const string16& profile_name, 548 string16 GetShortcutFilenameForProfile(const string16& profile_name,
529 BrowserDistribution* distribution) { 549 BrowserDistribution* distribution) {
530 string16 shortcut_name; 550 string16 shortcut_name;
531 if (!profile_name.empty()) { 551 if (!profile_name.empty()) {
532 shortcut_name.append(SanitizeShortcutProfileNameString(profile_name)); 552 shortcut_name.append(SanitizeShortcutProfileNameString(profile_name));
533 shortcut_name.append(L" - "); 553 shortcut_name.append(L" - ");
534 shortcut_name.append(l10n_util::GetStringUTF16(IDS_SHORT_PRODUCT_NAME)); 554 shortcut_name.append(l10n_util::GetStringUTF16(IDS_SHORT_PRODUCT_NAME));
535 } else { 555 } else {
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
576 void ProfileShortcutManagerWin::CreateProfileShortcut( 596 void ProfileShortcutManagerWin::CreateProfileShortcut(
577 const base::FilePath& profile_path) { 597 const base::FilePath& profile_path) {
578 CreateOrUpdateShortcutsForProfileAtPath(profile_path, CREATE_WHEN_NONE_FOUND, 598 CreateOrUpdateShortcutsForProfileAtPath(profile_path, CREATE_WHEN_NONE_FOUND,
579 IGNORE_NON_PROFILE_SHORTCUTS); 599 IGNORE_NON_PROFILE_SHORTCUTS);
580 } 600 }
581 601
582 void ProfileShortcutManagerWin::RemoveProfileShortcuts( 602 void ProfileShortcutManagerWin::RemoveProfileShortcuts(
583 const base::FilePath& profile_path) { 603 const base::FilePath& profile_path) {
584 BrowserThread::PostTask( 604 BrowserThread::PostTask(
585 BrowserThread::FILE, FROM_HERE, 605 BrowserThread::FILE, FROM_HERE,
586 base::Bind(&DeleteDesktopShortcutsAndIconFile, profile_path, false)); 606 base::Bind(&DeleteDesktopShortcuts, profile_path, false));
587 } 607 }
588 608
589 void ProfileShortcutManagerWin::HasProfileShortcuts( 609 void ProfileShortcutManagerWin::HasProfileShortcuts(
590 const base::FilePath& profile_path, 610 const base::FilePath& profile_path,
591 const base::Callback<void(bool)>& callback) { 611 const base::Callback<void(bool)>& callback) {
592 BrowserThread::PostTaskAndReplyWithResult( 612 BrowserThread::PostTaskAndReplyWithResult(
593 BrowserThread::FILE, FROM_HERE, 613 BrowserThread::FILE, FROM_HERE,
594 base::Bind(&HasAnyProfileShortcuts, profile_path), callback); 614 base::Bind(&HasAnyProfileShortcuts, profile_path), callback);
595 } 615 }
596 616
597 void ProfileShortcutManagerWin::OnProfileAdded( 617 void ProfileShortcutManagerWin::OnProfileAdded(
598 const base::FilePath& profile_path) { 618 const base::FilePath& profile_path) {
599 const size_t profile_count = 619 const size_t profile_count =
600 profile_manager_->GetProfileInfoCache().GetNumberOfProfiles(); 620 profile_manager_->GetProfileInfoCache().GetNumberOfProfiles();
601 if (profile_count == 1) { 621 if (profile_count == 1) {
602 CreateOrUpdateShortcutsForProfileAtPath(profile_path, 622 CreateOrUpdateShortcutsForProfileAtPath(profile_path,
603 CREATE_WHEN_NONE_FOUND, 623 CREATE_WHEN_NONE_FOUND,
604 UPDATE_NON_PROFILE_SHORTCUTS); 624 UPDATE_NON_PROFILE_SHORTCUTS);
605 } else if (profile_count == 2) { 625 } else {
606 CreateOrUpdateShortcutsForProfileAtPath(GetOtherProfilePath(profile_path), 626 CreateOrUpdateShortcutsForProfileAtPath(profile_path, CREATE_ICON_ONLY,
607 UPDATE_EXISTING_ONLY, 627 IGNORE_NON_PROFILE_SHORTCUTS);
608 UPDATE_NON_PROFILE_SHORTCUTS); 628 if (profile_count == 2) {
629 CreateOrUpdateShortcutsForProfileAtPath(GetOtherProfilePath(profile_path),
630 UPDATE_EXISTING_ONLY,
631 UPDATE_NON_PROFILE_SHORTCUTS);
632 }
609 } 633 }
610 } 634 }
611 635
612 void ProfileShortcutManagerWin::OnProfileWillBeRemoved( 636 void ProfileShortcutManagerWin::OnProfileWillBeRemoved(
613 const base::FilePath& profile_path) { 637 const base::FilePath& profile_path) {
614 } 638 }
615 639
616 void ProfileShortcutManagerWin::OnProfileWasRemoved( 640 void ProfileShortcutManagerWin::OnProfileWasRemoved(
617 const base::FilePath& profile_path, 641 const base::FilePath& profile_path,
618 const string16& profile_name) { 642 const string16& profile_name) {
619 const ProfileInfoCache& cache = profile_manager_->GetProfileInfoCache(); 643 const ProfileInfoCache& cache = profile_manager_->GetProfileInfoCache();
620 // If there is only one profile remaining, remove the badging information 644 // If there is only one profile remaining, remove the badging information
621 // from an existing shortcut. 645 // from an existing shortcut.
622 const bool deleting_down_to_last_profile = (cache.GetNumberOfProfiles() == 1); 646 const bool deleting_down_to_last_profile = (cache.GetNumberOfProfiles() == 1);
623 if (deleting_down_to_last_profile) { 647 if (deleting_down_to_last_profile) {
624 CreateOrUpdateShortcutsForProfileAtPath(cache.GetPathOfProfileAtIndex(0), 648 // This is needed to unbadge the icon.
649 base::FilePath profile_path = cache.GetPathOfProfileAtIndex(0);
650 CreateOrUpdateShortcutsForProfileAtPath(profile_path,
625 UPDATE_EXISTING_ONLY, 651 UPDATE_EXISTING_ONLY,
626 IGNORE_NON_PROFILE_SHORTCUTS); 652 IGNORE_NON_PROFILE_SHORTCUTS);
627 } 653 }
628 654
629 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, 655 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
630 base::Bind(&DeleteDesktopShortcutsAndIconFile, 656 base::Bind(&DeleteDesktopShortcuts,
631 profile_path, 657 profile_path,
632 deleting_down_to_last_profile)); 658 deleting_down_to_last_profile));
633 } 659 }
634 660
635 void ProfileShortcutManagerWin::OnProfileNameChanged( 661 void ProfileShortcutManagerWin::OnProfileNameChanged(
636 const base::FilePath& profile_path, 662 const base::FilePath& profile_path,
637 const string16& old_profile_name) { 663 const string16& old_profile_name) {
638 CreateOrUpdateShortcutsForProfileAtPath(profile_path, UPDATE_EXISTING_ONLY, 664 CreateOrUpdateShortcutsForProfileAtPath(profile_path, UPDATE_EXISTING_ONLY,
639 IGNORE_NON_PROFILE_SHORTCUTS); 665 IGNORE_NON_PROFILE_SHORTCUTS);
640 } 666 }
641 667
642 void ProfileShortcutManagerWin::OnProfileAvatarChanged( 668 void ProfileShortcutManagerWin::OnProfileAvatarChanged(
643 const base::FilePath& profile_path) { 669 const base::FilePath& profile_path) {
644 CreateOrUpdateShortcutsForProfileAtPath(profile_path, UPDATE_EXISTING_ONLY, 670 CreateOrUpdateShortcutsForProfileAtPath(profile_path, CREATE_ICON_ONLY,
645 IGNORE_NON_PROFILE_SHORTCUTS); 671 IGNORE_NON_PROFILE_SHORTCUTS);
646 } 672 }
647 673
648 base::FilePath ProfileShortcutManagerWin::GetOtherProfilePath( 674 base::FilePath ProfileShortcutManagerWin::GetOtherProfilePath(
649 const base::FilePath& profile_path) { 675 const base::FilePath& profile_path) {
650 const ProfileInfoCache& cache = profile_manager_->GetProfileInfoCache(); 676 const ProfileInfoCache& cache = profile_manager_->GetProfileInfoCache();
651 DCHECK_EQ(2U, cache.GetNumberOfProfiles()); 677 DCHECK_EQ(2U, cache.GetNumberOfProfiles());
652 // Get the index of the current profile, in order to find the index of the 678 // Get the index of the current profile, in order to find the index of the
653 // other profile. 679 // other profile.
654 size_t current_profile_index = cache.GetIndexOfProfileWithPath(profile_path); 680 size_t current_profile_index = cache.GetIndexOfProfileWithPath(profile_path);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
690 const int resource_id_1x = 716 const int resource_id_1x =
691 cache->GetDefaultAvatarIconResourceIDAtIndex(icon_index); 717 cache->GetDefaultAvatarIconResourceIDAtIndex(icon_index);
692 const int resource_id_2x = kProfileAvatarIconResources2x[icon_index]; 718 const int resource_id_2x = kProfileAvatarIconResources2x[icon_index];
693 // Make a copy of the SkBitmaps to ensure that we can safely use the image 719 // Make a copy of the SkBitmaps to ensure that we can safely use the image
694 // data on the FILE thread. 720 // data on the FILE thread.
695 avatar_bitmap_copy_1x = GetImageResourceSkBitmapCopy(resource_id_1x); 721 avatar_bitmap_copy_1x = GetImageResourceSkBitmapCopy(resource_id_1x);
696 avatar_bitmap_copy_2x = GetImageResourceSkBitmapCopy(resource_id_2x); 722 avatar_bitmap_copy_2x = GetImageResourceSkBitmapCopy(resource_id_2x);
697 } 723 }
698 BrowserThread::PostTask( 724 BrowserThread::PostTask(
699 BrowserThread::FILE, FROM_HERE, 725 BrowserThread::FILE, FROM_HERE,
700 base::Bind(&CreateOrUpdateDesktopShortcutsForProfile, profile_path, 726 base::Bind(&CreateOrUpdateDesktopShortcutsAndIconForProfile, profile_path,
701 old_shortcut_appended_name, new_shortcut_appended_name, 727 old_shortcut_appended_name, new_shortcut_appended_name,
702 avatar_bitmap_copy_1x, avatar_bitmap_copy_2x, create_mode, 728 avatar_bitmap_copy_1x, avatar_bitmap_copy_2x, create_mode,
703 action)); 729 action));
704 730
705 cache->SetShortcutNameOfProfileAtIndex(profile_index, 731 cache->SetShortcutNameOfProfileAtIndex(profile_index,
706 new_shortcut_appended_name); 732 new_shortcut_appended_name);
707 } 733 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698