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

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

Issue 11876027: ProfileShortcutManagerWin: Don't create user level shortcut when system level one exists. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 7 years, 11 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 | Annotate | Revision Log
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 <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
178 if ((shortcut_command_line.empty() && include_empty_command_lines) || 178 if ((shortcut_command_line.empty() && include_empty_command_lines) ||
179 (shortcut_command_line.find(command_line) != string16::npos)) { 179 (shortcut_command_line.find(command_line) != string16::npos)) {
180 paths->push_back(path); 180 paths->push_back(path);
181 } 181 }
182 } 182 }
183 } 183 }
184 184
185 // Renames an existing Chrome desktop profile shortcut. Must be called on the 185 // Renames an existing Chrome desktop profile shortcut. Must be called on the
186 // FILE thread. 186 // FILE thread.
187 void RenameChromeDesktopShortcutForProfile( 187 void RenameChromeDesktopShortcutForProfile(
188 const string16& old_shortcut_file, 188 const string16& old_shortcut_filename,
189 const string16& new_shortcut_file) { 189 const string16& new_shortcut_filename) {
190 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 190 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
191 191
192 FilePath shortcuts_directory; 192 FilePath shortcuts_directory;
gab 2013/01/15 23:09:14 Rename this to user_shortcuts_directory since you
Alexei Svitkine (slow) 2013/01/16 16:11:44 Done.
193 if (!GetDesktopShortcutsDirectory(&shortcuts_directory)) 193 if (!GetDesktopShortcutsDirectory(&shortcuts_directory))
gab 2013/01/15 23:09:14 I don't really see the value of this method, an if
Alexei Svitkine (slow) 2013/01/15 23:34:43 The method is called from other functions too, to
Alexei Svitkine (slow) 2013/01/16 16:11:44 I've now done this in the latest patchset.
gab 2013/01/16 17:44:00 sgtm.
194 return; 194 return;
195 195
196 FilePath old_shortcut_path = shortcuts_directory.Append(old_shortcut_file); 196 FilePath system_shortcuts_directory;
197 if (!ShellUtil::GetShortcutPath(ShellUtil::SHORTCUT_LOCATION_DESKTOP,
198 BrowserDistribution::GetDistribution(),
199 ShellUtil::SYSTEM_LEVEL,
200 &system_shortcuts_directory)) {
201 NOTREACHED();
202 return;
203 }
204
205 const FilePath old_shortcut_path =
206 shortcuts_directory.Append(old_shortcut_filename);
207 const FilePath new_shortcut_path =
208 shortcuts_directory.Append(new_shortcut_filename);
209
197 // If the shortcut does not exist, it may have been renamed by the user. In 210 // If the shortcut does not exist, it may have been renamed by the user. In
198 // that case, its name should not be changed. 211 // that case, its name should not be changed.
199 if (!file_util::PathExists(old_shortcut_path)) 212 if (!file_util::PathExists(old_shortcut_path)) {
213 // It's possible that a system level shortcut exists instead, for example
214 // the original Chrome shortcut from an installation. If that's the case,
215 // copy that one over - it will get its properties updated by the code in
216 // |CreateOrUpdateDesktopShortcutsForProfile()|.
217 const FilePath possible_old_system_shortcut =
218 system_shortcuts_directory.Append(old_shortcut_filename);
219 if (file_util::PathExists(possible_old_system_shortcut))
220 file_util::CopyFile(possible_old_system_shortcut, new_shortcut_path);
200 return; 221 return;
222 }
201 223
202 FilePath new_shortcut_path = shortcuts_directory.Append(new_shortcut_file); 224 // If a system level shortcut exists at the destination, then simply delete
225 // the old shortcut.
226 const FilePath possible_new_system_shortcut =
227 system_shortcuts_directory.Append(new_shortcut_filename);
228 if (file_util::PathExists(possible_new_system_shortcut)) {
229 file_util::Delete(old_shortcut_path, false);
230 return;
gab 2013/01/15 23:09:14 I'm not a fan of the multiple early returns I feel
Alexei Svitkine (slow) 2013/01/16 16:11:44 I like your suggested flow better, done!
231 }
232
203 if (!file_util::Move(old_shortcut_path, new_shortcut_path)) 233 if (!file_util::Move(old_shortcut_path, new_shortcut_path))
204 LOG(ERROR) << "Could not rename Windows profile desktop shortcut."; 234 LOG(ERROR) << "Could not rename Windows profile desktop shortcut.";
205 } 235 }
206 236
207 // Updates all desktop shortcuts for the given profile to have the specified 237 // Updates all desktop shortcuts for the given profile to have the specified
208 // parameters. If |create_mode| is CREATE_WHEN_NONE_FOUND, a new shortcut is 238 // parameters. If |create_mode| is CREATE_WHEN_NONE_FOUND, a new shortcut is
209 // created if no existing ones were found. Whether non-profile shortcuts should 239 // created if no existing ones were found. Whether non-profile shortcuts should
210 // be updated is specified by |action|. Must be called on the FILE thread. 240 // be updated is specified by |action|. Must be called on the FILE thread.
211 void CreateOrUpdateDesktopShortcutsForProfile( 241 void CreateOrUpdateDesktopShortcutsForProfile(
212 const FilePath& profile_path, 242 const FilePath& profile_path,
243 const string16& old_profile_name,
213 const string16& profile_name, 244 const string16& profile_name,
214 const SkBitmap& avatar_image, 245 const SkBitmap& avatar_image,
215 ProfileShortcutManagerWin::CreateOrUpdateMode create_mode, 246 ProfileShortcutManagerWin::CreateOrUpdateMode create_mode,
216 ProfileShortcutManagerWin::NonProfileShortcutAction action) { 247 ProfileShortcutManagerWin::NonProfileShortcutAction action) {
217 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 248 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
218 249
219 FilePath chrome_exe; 250 FilePath chrome_exe;
220 if (!PathService::Get(base::FILE_EXE, &chrome_exe)) { 251 if (!PathService::Get(base::FILE_EXE, &chrome_exe)) {
221 NOTREACHED(); 252 NOTREACHED();
222 return; 253 return;
223 } 254 }
224 255
225 BrowserDistribution* distribution = BrowserDistribution::GetDistribution(); 256 BrowserDistribution* distribution = BrowserDistribution::GetDistribution();
226 // Ensure that the distribution supports creating shortcuts. If it doesn't, 257 // Ensure that the distribution supports creating shortcuts. If it doesn't,
227 // the following code may result in NOTREACHED() being hit. 258 // the following code may result in NOTREACHED() being hit.
228 DCHECK(distribution->CanCreateDesktopShortcuts()); 259 DCHECK(distribution->CanCreateDesktopShortcuts());
229 installer::Product product(distribution); 260
261 if (old_profile_name != profile_name) {
262 const string16 old_shortcut_filename =
263 profiles::internal::GetShortcutFilenameForProfile(old_profile_name,
264 distribution);
265 const string16 new_shortcut_filename =
266 profiles::internal::GetShortcutFilenameForProfile(profile_name,
267 distribution);
268 RenameChromeDesktopShortcutForProfile(old_shortcut_filename,
269 new_shortcut_filename);
270 }
230 271
231 ShellUtil::ShortcutProperties properties(ShellUtil::CURRENT_USER); 272 ShellUtil::ShortcutProperties properties(ShellUtil::CURRENT_USER);
273 installer::Product product(distribution);
232 product.AddDefaultShortcutProperties(chrome_exe, &properties); 274 product.AddDefaultShortcutProperties(chrome_exe, &properties);
233 275
234 const string16 command_line = 276 const string16 command_line =
235 profiles::internal::CreateProfileShortcutFlags(profile_path); 277 profiles::internal::CreateProfileShortcutFlags(profile_path);
236 278
237 // Only set the profile-specific properties when |profile_name| is non empty. 279 // Only set the profile-specific properties when |profile_name| is non empty.
238 // If it is empty, it means the shortcut being created should be a regular, 280 // If it is empty, it means the shortcut being created should be a regular,
239 // non-profile Chrome shortcut. 281 // non-profile Chrome shortcut.
240 if (!profile_name.empty()) { 282 if (!profile_name.empty()) {
241 const FilePath shortcut_icon = 283 const FilePath shortcut_icon =
(...skipping 13 matching lines...) Expand all
255 std::vector<FilePath> shortcuts; 297 std::vector<FilePath> shortcuts;
256 ListDesktopShortcutsWithCommandLine(chrome_exe, command_line, 298 ListDesktopShortcutsWithCommandLine(chrome_exe, command_line,
257 action == ProfileShortcutManagerWin::UPDATE_NON_PROFILE_SHORTCUTS, 299 action == ProfileShortcutManagerWin::UPDATE_NON_PROFILE_SHORTCUTS,
258 &shortcuts); 300 &shortcuts);
259 if (create_mode == ProfileShortcutManagerWin::CREATE_WHEN_NONE_FOUND && 301 if (create_mode == ProfileShortcutManagerWin::CREATE_WHEN_NONE_FOUND &&
260 shortcuts.empty()) { 302 shortcuts.empty()) {
261 const string16 shortcut_name = 303 const string16 shortcut_name =
262 profiles::internal::GetShortcutFilenameForProfile(profile_name, 304 profiles::internal::GetShortcutFilenameForProfile(profile_name,
263 distribution); 305 distribution);
264 shortcuts.push_back(FilePath(shortcut_name)); 306 shortcuts.push_back(FilePath(shortcut_name));
265 operation = ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS; 307 operation = ShellUtil::SHELL_SHORTCUT_CREATE_IF_NO_SYSTEM_LEVEL;
266 } 308 }
267 309
268 for (size_t i = 0; i < shortcuts.size(); ++i) { 310 for (size_t i = 0; i < shortcuts.size(); ++i) {
269 const FilePath shortcut_name = shortcuts[i].BaseName().RemoveExtension(); 311 const FilePath shortcut_name = shortcuts[i].BaseName().RemoveExtension();
270 properties.set_shortcut_name(shortcut_name.value()); 312 properties.set_shortcut_name(shortcut_name.value());
271 ShellUtil::CreateOrUpdateShortcut(ShellUtil::SHORTCUT_LOCATION_DESKTOP, 313 ShellUtil::CreateOrUpdateShortcut(ShellUtil::SHORTCUT_LOCATION_DESKTOP,
272 distribution, properties, operation); 314 distribution, properties, operation);
273 } 315 }
274 } 316 }
275 317
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
333 // Ensure that the distribution supports creating shortcuts. If it doesn't, 375 // Ensure that the distribution supports creating shortcuts. If it doesn't,
334 // the following code may result in NOTREACHED() being hit. 376 // the following code may result in NOTREACHED() being hit.
335 DCHECK(distribution->CanCreateDesktopShortcuts()); 377 DCHECK(distribution->CanCreateDesktopShortcuts());
336 installer::Product product(distribution); 378 installer::Product product(distribution);
337 379
338 ShellUtil::ShortcutProperties properties(ShellUtil::CURRENT_USER); 380 ShellUtil::ShortcutProperties properties(ShellUtil::CURRENT_USER);
339 product.AddDefaultShortcutProperties(chrome_exe, &properties); 381 product.AddDefaultShortcutProperties(chrome_exe, &properties);
340 properties.set_shortcut_name( 382 properties.set_shortcut_name(
341 profiles::internal::GetShortcutFilenameForProfile(string16(), 383 profiles::internal::GetShortcutFilenameForProfile(string16(),
342 distribution)); 384 distribution));
343 ShellUtil::CreateOrUpdateShortcut(ShellUtil::SHORTCUT_LOCATION_DESKTOP, 385 ShellUtil::CreateOrUpdateShortcut(
344 distribution, properties, 386 ShellUtil::SHORTCUT_LOCATION_DESKTOP, distribution, properties,
345 ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS); 387 ShellUtil::SHELL_SHORTCUT_CREATE_IF_NO_SYSTEM_LEVEL);
346 } 388 }
347 } 389 }
348 390
349 // Returns true if profile at |profile_path| has any shortcuts. Does not 391 // Returns true if profile at |profile_path| has any shortcuts. Does not
350 // consider non-profile shortcuts. Must be called on the FILE thread. 392 // consider non-profile shortcuts. Must be called on the FILE thread.
351 bool HasAnyProfileShortcuts(const FilePath& profile_path) { 393 bool HasAnyProfileShortcuts(const FilePath& profile_path) {
352 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 394 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
353 395
354 FilePath chrome_exe; 396 FilePath chrome_exe;
355 if (!PathService::Get(base::FILE_EXE, &chrome_exe)) { 397 if (!PathService::Get(base::FILE_EXE, &chrome_exe)) {
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
498 CreateOrUpdateShortcutsForProfileAtPath(profile_path, UPDATE_EXISTING_ONLY, 540 CreateOrUpdateShortcutsForProfileAtPath(profile_path, UPDATE_EXISTING_ONLY,
499 IGNORE_NON_PROFILE_SHORTCUTS); 541 IGNORE_NON_PROFILE_SHORTCUTS);
500 } 542 }
501 543
502 void ProfileShortcutManagerWin::OnProfileAvatarChanged( 544 void ProfileShortcutManagerWin::OnProfileAvatarChanged(
503 const FilePath& profile_path) { 545 const FilePath& profile_path) {
504 CreateOrUpdateShortcutsForProfileAtPath(profile_path, UPDATE_EXISTING_ONLY, 546 CreateOrUpdateShortcutsForProfileAtPath(profile_path, UPDATE_EXISTING_ONLY,
505 IGNORE_NON_PROFILE_SHORTCUTS); 547 IGNORE_NON_PROFILE_SHORTCUTS);
506 } 548 }
507 549
508 void ProfileShortcutManagerWin::StartProfileShortcutNameChange(
509 const FilePath& profile_path,
510 const string16& old_profile_name) {
511 const ProfileInfoCache& cache = profile_manager_->GetProfileInfoCache();
512 size_t profile_index = cache.GetIndexOfProfileWithPath(profile_path);
513 if (profile_index == std::string::npos)
514 return;
515 // If the shortcut will have an appended name, get the profile name.
516 string16 new_profile_name;
517 if (cache.GetNumberOfProfiles() != 1)
518 new_profile_name = cache.GetNameOfProfileAtIndex(profile_index);
519
520 BrowserDistribution* distribution = BrowserDistribution::GetDistribution();
521 const string16 old_shortcut_file =
522 profiles::internal::GetShortcutFilenameForProfile(old_profile_name,
523 distribution);
524 const string16 new_shortcut_file =
525 profiles::internal::GetShortcutFilenameForProfile(new_profile_name,
526 distribution);
527 BrowserThread::PostTask(
528 BrowserThread::FILE, FROM_HERE,
529 base::Bind(&RenameChromeDesktopShortcutForProfile,
530 old_shortcut_file,
531 new_shortcut_file));
532 }
533
534 FilePath ProfileShortcutManagerWin::GetOtherProfilePath( 550 FilePath ProfileShortcutManagerWin::GetOtherProfilePath(
535 const FilePath& profile_path) { 551 const FilePath& profile_path) {
536 const ProfileInfoCache& cache = profile_manager_->GetProfileInfoCache(); 552 const ProfileInfoCache& cache = profile_manager_->GetProfileInfoCache();
537 DCHECK_EQ(2U, cache.GetNumberOfProfiles()); 553 DCHECK_EQ(2U, cache.GetNumberOfProfiles());
538 // Get the index of the current profile, in order to find the index of the 554 // Get the index of the current profile, in order to find the index of the
539 // other profile. 555 // other profile.
540 size_t current_profile_index = cache.GetIndexOfProfileWithPath(profile_path); 556 size_t current_profile_index = cache.GetIndexOfProfileWithPath(profile_path);
541 size_t other_profile_index = (current_profile_index == 0) ? 1 : 0; 557 size_t other_profile_index = (current_profile_index == 0) ? 1 : 0;
542 return cache.GetPathOfProfileAtIndex(other_profile_index); 558 return cache.GetPathOfProfileAtIndex(other_profile_index);
543 } 559 }
544 560
545 void ProfileShortcutManagerWin::CreateOrUpdateShortcutsForProfileAtPath( 561 void ProfileShortcutManagerWin::CreateOrUpdateShortcutsForProfileAtPath(
546 const FilePath& profile_path, 562 const FilePath& profile_path,
547 CreateOrUpdateMode create_mode, 563 CreateOrUpdateMode create_mode,
548 NonProfileShortcutAction action) { 564 NonProfileShortcutAction action) {
549 ProfileInfoCache* cache = &profile_manager_->GetProfileInfoCache(); 565 ProfileInfoCache* cache = &profile_manager_->GetProfileInfoCache();
550 size_t profile_index = cache->GetIndexOfProfileWithPath(profile_path); 566 size_t profile_index = cache->GetIndexOfProfileWithPath(profile_path);
551 if (profile_index == std::string::npos) 567 if (profile_index == std::string::npos)
552 return; 568 return;
553 bool remove_badging = cache->GetNumberOfProfiles() == 1; 569 bool remove_badging = cache->GetNumberOfProfiles() == 1;
554 570
555 string16 old_shortcut_appended_name = 571 string16 old_shortcut_appended_name =
556 cache->GetShortcutNameOfProfileAtIndex(profile_index); 572 cache->GetShortcutNameOfProfileAtIndex(profile_index);
557 573
558 string16 new_shortcut_appended_name; 574 string16 new_shortcut_appended_name;
559 if (!remove_badging) 575 if (!remove_badging)
560 new_shortcut_appended_name = cache->GetNameOfProfileAtIndex(profile_index); 576 new_shortcut_appended_name = cache->GetNameOfProfileAtIndex(profile_index);
561 577
562 if (create_mode == UPDATE_EXISTING_ONLY &&
563 new_shortcut_appended_name != old_shortcut_appended_name) {
564 // TODO(asvitkine): Fold this into |UpdateDesktopShortcutsForProfile()|.
565 StartProfileShortcutNameChange(profile_path, old_shortcut_appended_name);
566 }
567
568 SkBitmap profile_avatar_bitmap_copy; 578 SkBitmap profile_avatar_bitmap_copy;
569 if (!remove_badging) { 579 if (!remove_badging) {
570 size_t profile_icon_index = 580 size_t profile_icon_index =
571 cache->GetAvatarIconIndexOfProfileAtIndex(profile_index); 581 cache->GetAvatarIconIndexOfProfileAtIndex(profile_index);
572 gfx::Image profile_avatar_image = ResourceBundle::GetSharedInstance(). 582 gfx::Image profile_avatar_image = ResourceBundle::GetSharedInstance().
573 GetNativeImageNamed( 583 GetNativeImageNamed(
574 cache->GetDefaultAvatarIconResourceIDAtIndex(profile_icon_index)); 584 cache->GetDefaultAvatarIconResourceIDAtIndex(profile_icon_index));
575 585
576 DCHECK(!profile_avatar_image.IsEmpty()); 586 DCHECK(!profile_avatar_image.IsEmpty());
577 const SkBitmap* profile_avatar_bitmap = profile_avatar_image.ToSkBitmap(); 587 const SkBitmap* profile_avatar_bitmap = profile_avatar_image.ToSkBitmap();
578 // Make a copy of the SkBitmap to ensure that we can safely use the image 588 // Make a copy of the SkBitmap to ensure that we can safely use the image
579 // data on the FILE thread. 589 // data on the FILE thread.
580 profile_avatar_bitmap->deepCopyTo(&profile_avatar_bitmap_copy, 590 profile_avatar_bitmap->deepCopyTo(&profile_avatar_bitmap_copy,
581 profile_avatar_bitmap->getConfig()); 591 profile_avatar_bitmap->getConfig());
582 } 592 }
583 BrowserThread::PostTask( 593 BrowserThread::PostTask(
584 BrowserThread::FILE, FROM_HERE, 594 BrowserThread::FILE, FROM_HERE,
585 base::Bind(&CreateOrUpdateDesktopShortcutsForProfile, 595 base::Bind(&CreateOrUpdateDesktopShortcutsForProfile,
586 profile_path, new_shortcut_appended_name, 596 profile_path, old_shortcut_appended_name,
587 profile_avatar_bitmap_copy, create_mode, action)); 597 new_shortcut_appended_name, profile_avatar_bitmap_copy,
598 create_mode, action));
588 599
589 cache->SetShortcutNameOfProfileAtIndex(profile_index, 600 cache->SetShortcutNameOfProfileAtIndex(profile_index,
590 new_shortcut_appended_name); 601 new_shortcut_appended_name);
591 } 602 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698