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

Unified Diff: chrome/browser/profiles/profile_shortcut_manager_win.cc

Issue 10837352: Update profile desktop shortcuts (Closed) Base URL: https://src.chromium.org/chrome/trunk/src/
Patch Set: Fixed issues and added a unit test for update Created 8 years, 4 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/profiles/profile_shortcut_manager_win.cc
===================================================================
--- chrome/browser/profiles/profile_shortcut_manager_win.cc (revision 152316)
+++ chrome/browser/profiles/profile_shortcut_manager_win.cc (working copy)
@@ -15,7 +15,7 @@
#include "chrome/browser/app_icon_win.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/prefs/pref_service.h"
-#include "chrome/browser/profiles/profile_info_cache.h"
+#include "chrome/browser/profiles/profile_info_cache_observer.h"
#include "chrome/browser/profiles/profile_info_util.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/common/chrome_constants.h"
@@ -48,9 +48,8 @@
// Use index 0 when assigning the resulting file as the icon.
FilePath CreateChromeDesktopShortcutIconForProfile(
const FilePath& profile_path,
- const gfx::Image& avatar_image) {
+ const SkBitmap& avatar_bitmap) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
- const SkBitmap* avatar_bitmap = avatar_image.ToSkBitmap();
HICON app_icon_handle = GetAppIconForSize(kShortcutIconSize);
scoped_ptr<SkBitmap> app_icon_bitmap(
IconUtil::CreateSkBitmapFromHICON(app_icon_handle));
@@ -62,16 +61,16 @@
// avatar_menu_button::DrawTaskBarDecoration.
const SkBitmap* source_bitmap = NULL;
SkBitmap squarer_bitmap;
- if ((avatar_bitmap->width() == profiles::kAvatarIconWidth) &&
- (avatar_bitmap->height() == profiles::kAvatarIconHeight)) {
+ if ((avatar_bitmap.width() == profiles::kAvatarIconWidth) &&
+ (avatar_bitmap.height() == profiles::kAvatarIconHeight)) {
// Shave a couple of columns so the bitmap is more square. So when
// resized to a square aspect ratio it looks pretty.
int x = 2;
- avatar_bitmap->extractSubset(&squarer_bitmap, SkIRect::MakeXYWH(x, 0,
+ avatar_bitmap.extractSubset(&squarer_bitmap, SkIRect::MakeXYWH(x, 0,
profiles::kAvatarIconWidth - x * 2, profiles::kAvatarIconHeight));
source_bitmap = &squarer_bitmap;
} else {
- source_bitmap = avatar_bitmap;
+ source_bitmap = &avatar_bitmap;
}
SkBitmap sk_icon = skia::ImageOperations::Resize(
*source_bitmap,
@@ -115,9 +114,90 @@
bool_function.Run();
}
+// Renames an existing Chrome desktop profile shortcut. Must be called on the
+// FILE thread.
+void RenameChromeDesktopShortcutForProfile(
+ const string16& old_shortcut,
sail 2012/08/23 18:46:44 variable names could be more descriptive (i.e. sho
Halli 2012/08/24 02:56:49 Done.
+ const string16& new_shortcut) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
+ FilePath shortcut_path;
+ if (ShellUtil::GetDesktopPath(false, // User's directory instead of system.
+ &shortcut_path)) {
+ FilePath old_profile = shortcut_path.Append(old_shortcut);
+ FilePath new_profile = shortcut_path.Append(new_shortcut);
+ file_util::Move(old_profile, new_profile);
sail 2012/08/23 18:46:44 if this fails can you log the error
Halli 2012/08/24 02:56:49 Done.
+ }
+}
+
+// Updates the arguments to a Chrome desktop shortcut for a profile. Must be
sail 2012/08/23 18:46:44 Comment doesn't match the function.
Halli 2012/08/24 02:56:49 n/a function has been removed On 2012/08/23 18:46:
+// called on the FILE thread.
+void UpdateChromeDesktopShortcutForProfile(
gab 2012/08/23 18:32:39 You do not need a whole new function to do this, s
Halli 2012/08/24 02:56:49 Done.
+ const string16& shortcut,
sail 2012/08/23 18:46:44 same as above, need more descriptive name
Halli 2012/08/24 02:56:49 n/a function has been removed On 2012/08/23 18:46:
+ const string16& arguments,
sail 2012/08/23 18:46:44 same, maybe exe_arguments?
Halli 2012/08/24 02:56:49 n/a function has been removed On 2012/08/23 18:46:
+ const FilePath& profile_path,
+ const SkBitmap& avatar_bitmap) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
+ FilePath shortcut_path;
+ if (!ShellUtil::GetDesktopPath(false, &shortcut_path))
+ return;
+
+ shortcut_path = shortcut_path.Append(shortcut);
+ FilePath chrome_exe;
+ if (!PathService::Get(base::FILE_EXE, &chrome_exe))
+ return;
+ BrowserDistribution* dist = BrowserDistribution::GetDistribution();
+ string16 description;
+ if (!dist)
+ return;
+ else
+ description = WideToUTF16(dist->GetAppDescription());
+ FilePath icon_path = avatar_bitmap.isNull() ?
sail 2012/08/23 18:46:44 when can the avatar bitmap be null? can this be ch
Halli 2012/08/24 02:56:49 It should be DCHECK(!avatar_image.empty()) before
+ FilePath() :
+ CreateChromeDesktopShortcutIconForProfile(profile_path, avatar_bitmap);
+
+ ShellUtil::UpdateChromeShortcut(
+ dist,
+ chrome_exe.value(),
+ shortcut_path.value(),
+ arguments,
+ description,
+ icon_path.empty() ? chrome_exe.value() : icon_path.value(),
+ icon_path.empty() ? dist->GetIconIndex() : 0,
+ ShellUtil::SHORTCUT_NO_OPTIONS);
+}
+
+void CompleteProfileShortcutCreation(
sail 2012/08/23 18:46:44 function level comments. also function name is not
Halli 2012/08/24 02:56:49 Done.
+ const FilePath& profile_path, const string16& profile_name,
sail 2012/08/23 18:46:44 one line per parameter would be easier to read
Halli 2012/08/24 02:56:49 Done.
+ const SkBitmap& avatar_image) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
+ FilePath shortcut_icon = CreateChromeDesktopShortcutIconForProfile(
+ profile_path, avatar_image);
+
+ FilePath chrome_exe;
+ if (!PathService::Get(base::FILE_EXE, &chrome_exe))
+ return;
+ BrowserDistribution* dist = BrowserDistribution::GetDistribution();
+ string16 description;
sail 2012/08/23 18:46:44 variable declaration can be combined with assignme
Halli 2012/08/24 02:56:49 Done.
+ if (!dist)
+ return;
+ description = WideToUTF16(dist->GetAppDescription());
+
+ ShellUtil::CreateChromeDesktopShortcut(
+ dist,
+ chrome_exe.value(),
+ description,
+ profile_name,
+ CreateProfileShortcutFlags(profile_path),
+ shortcut_icon.empty() ? chrome_exe.value() : shortcut_icon.value(),
+ shortcut_icon.empty() ? dist->GetIconIndex() : 0,
+ ShellUtil::CURRENT_USER,
+ ShellUtil::SHORTCUT_CREATE_ALWAYS);
+}
+
} // namespace
-class ProfileShortcutManagerWin : public ProfileShortcutManager {
+class ProfileShortcutManagerWin : public ProfileShortcutManager,
+ public ProfileInfoCacheObserver {
public:
ProfileShortcutManagerWin();
virtual ~ProfileShortcutManagerWin();
@@ -125,34 +205,17 @@
virtual void CreateChromeDesktopShortcut(
const FilePath& profile_path, const string16& profile_name,
const gfx::Image& avatar_image) OVERRIDE;
- virtual void DeleteChromeDesktopShortcut(const FilePath& profile_path)
- OVERRIDE;
+ virtual void DeleteChromeDesktopShortcut(const FilePath& profile_path,
+ const string16& profile_name) OVERRIDE;
- private:
- struct ProfileShortcutInfo {
- string16 flags;
- string16 profile_name;
- gfx::Image avatar_image;
+ virtual void OnProfileAdded(const FilePath& profile_path) OVERRIDE;
+ virtual void OnProfileWillBeRemoved(const FilePath& profile_path) OVERRIDE;
+ virtual void OnProfileWasRemoved(const FilePath& profile_path,
+ const string16& profile_name) OVERRIDE;
+ virtual void OnProfileNameChanged(const FilePath& profile_path,
+ const string16& old_profile_name) OVERRIDE;
+ virtual void OnProfileAvatarChanged(const FilePath& profile_path) OVERRIDE;
- ProfileShortcutInfo()
- : flags(string16()),
- profile_name(string16()),
- avatar_image(gfx::Image()) {
- }
-
- ProfileShortcutInfo(
- string16 p_flags,
- string16 p_profile_name,
- gfx::Image p_avatar_image)
- : flags(p_flags),
- profile_name(p_profile_name),
- avatar_image(p_avatar_image) {
- }
- };
-
- // TODO(hallielaine): Repopulate this map on chrome session startup
- typedef std::map<FilePath, ProfileShortcutInfo> ProfileShortcutsMap;
- ProfileShortcutsMap profile_shortcuts_;
};
// static
@@ -165,8 +228,11 @@
}
// static
-ProfileShortcutManager* ProfileShortcutManager::Create() {
- return new ProfileShortcutManagerWin();
+ProfileShortcutManager* ProfileShortcutManager::Create(
+ ProfileInfoCache& cache) {
+ ProfileShortcutManagerWin* manager = new ProfileShortcutManagerWin();
+ cache.AddObserver(manager);
sail 2012/08/23 18:46:44 you might also need a RemoveObserver() call somewh
Halli 2012/08/24 02:56:49 Done.
+ return manager;
}
ProfileShortcutManagerWin::ProfileShortcutManagerWin() {
@@ -178,52 +244,106 @@
void ProfileShortcutManagerWin::CreateChromeDesktopShortcut(
const FilePath& profile_path, const string16& profile_name,
const gfx::Image& avatar_image) {
- FilePath shortcut_icon = CreateChromeDesktopShortcutIconForProfile(
- profile_path, avatar_image);
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
- FilePath chrome_exe;
- if (!PathService::Get(base::FILE_EXE, &chrome_exe))
- return;
- BrowserDistribution* dist = BrowserDistribution::GetDistribution();
- string16 description;
- if (!dist)
- return;
- description = WideToUTF16(dist->GetAppDescription());
-
- // Add the profile to the map if it doesn't exist already
- if (!profile_shortcuts_.count(profile_path)) {
- string16 flags = CreateProfileShortcutFlags(profile_path);
- profile_shortcuts_.insert(std::make_pair(profile_path,
- ProfileShortcutInfo(flags, profile_name,
- avatar_image)));
+ const SkBitmap* avatar_bitmap = avatar_image.ToSkBitmap();
+ SkBitmap avatar_bitmap_copy;
+ if (avatar_bitmap->deepCopyTo(&avatar_bitmap_copy,
sail 2012/08/23 18:46:44 this should just be a DCHECK I think, otherwise t
Halli 2012/08/24 02:56:49 Done.
+ avatar_bitmap->getConfig())) {
+ BrowserThread::PostTask(
+ BrowserThread::FILE, FROM_HERE,
+ base::Bind(&CompleteProfileShortcutCreation,
+ profile_path, profile_name, avatar_bitmap_copy));
}
-
- ShellUtil::CreateChromeDesktopShortcut(
- dist,
- chrome_exe.value(),
- description,
- profile_shortcuts_[profile_path].profile_name,
- profile_shortcuts_[profile_path].flags,
- shortcut_icon.empty() ? chrome_exe.value() : shortcut_icon.value(),
- shortcut_icon.empty() ? dist->GetIconIndex() : 0,
- ShellUtil::CURRENT_USER,
- ShellUtil::SHORTCUT_CREATE_ALWAYS);
}
void ProfileShortcutManagerWin::DeleteChromeDesktopShortcut(
- const FilePath& profile_path) {
+ const FilePath& profile_path, const string16& profile_name) {
BrowserDistribution* dist = BrowserDistribution::GetDistribution();
string16 shortcut;
// If we can find the shortcut, delete it
if (ShellUtil::GetChromeShortcutName(dist, false,
- profile_shortcuts_[profile_path].profile_name, &shortcut)) {
+ profile_name, &shortcut)) {
sail 2012/08/23 18:46:44 is this indentation correct?
Halli 2012/08/24 02:56:49 Done.
std::vector<string16> appended_names(1, shortcut);
BrowserThread::PostTask(
BrowserThread::FILE, FROM_HERE,
base::Bind(&CallShellUtilBoolFunction, base::Bind(
&ShellUtil::RemoveChromeDesktopShortcutsWithAppendedNames,
appended_names)));
- profile_shortcuts_.erase(profile_path);
}
}
+void ProfileShortcutManagerWin::OnProfileAdded(const FilePath& profile_path) {
+}
+
+void ProfileShortcutManagerWin::OnProfileWillBeRemoved(
+ const FilePath& profile_path) {
+}
+
+void ProfileShortcutManagerWin::OnProfileWasRemoved(
+ const FilePath& profile_path,
+ const string16& profile_name) {
+}
+
+void ProfileShortcutManagerWin::OnProfileNameChanged(
+ const FilePath& profile_path,
+ const string16& old_profile_name) {
+ ProfileInfoCache& cache =
+ g_browser_process->profile_manager()->GetProfileInfoCache();
sail 2012/08/23 18:46:44 It's weird that you're accessing the cache through
Halli 2012/08/24 02:56:49 Done.
+
+ size_t profile_index = cache.GetIndexOfProfileWithPath(profile_path);
+ if (profile_index == std::string::npos)
+ return;
+
+ string16 new_profile_name =
+ cache.GetNameOfProfileAtIndex(profile_index);
+
+ string16 old_shortcut;
+ string16 new_shortcut;
+ BrowserDistribution* dist = BrowserDistribution::GetDistribution();
+ if (ShellUtil::GetChromeShortcutName(
+ dist, false, old_profile_name, &old_shortcut) &&
+ ShellUtil::GetChromeShortcutName(
+ dist, false, new_profile_name, &new_shortcut)) {
+ BrowserThread::PostTask(
+ BrowserThread::FILE, FROM_HERE,
+ base::Bind(&RenameChromeDesktopShortcutForProfile,
+ old_shortcut,
+ new_shortcut));
+ }
+}
+
+void ProfileShortcutManagerWin::OnProfileAvatarChanged(
+ const FilePath& profile_path) {
+ ProfileInfoCache& cache =
+ g_browser_process->profile_manager()->GetProfileInfoCache();
+
+ size_t profile_index = cache.GetIndexOfProfileWithPath(profile_path);
+ if (profile_index == std::string::npos)
+ return;
+
+ string16 profile_name =
+ cache.GetNameOfProfileAtIndex(profile_index);
+ string16 shortcut;
+
+ BrowserDistribution* dist = BrowserDistribution::GetDistribution();
+ if (ShellUtil::GetChromeShortcutName(
+ dist, false, profile_name, &shortcut)) {
+ size_t new_icon_index = cache.GetAvatarIconIndexOfProfileAtIndex(
+ profile_index);
+ gfx::Image avatar_image =
+ ResourceBundle::GetSharedInstance().GetNativeImageNamed(
+ cache.GetDefaultAvatarIconResourceIDAtIndex(new_icon_index));
sail 2012/08/23 18:46:44 indentation is wrong
Halli 2012/08/24 02:56:49 Done.
+
+ const SkBitmap* avatar_bitmap = avatar_image.ToSkBitmap();
+ SkBitmap avatar_bitmap_copy;
+ if (avatar_bitmap->deepCopyTo(&avatar_bitmap_copy,
sail 2012/08/23 18:46:44 same comment as the above deepCopyTo call
Halli 2012/08/24 02:56:49 Done.
+ avatar_bitmap->getConfig())) {
+ BrowserThread::PostTask(
+ BrowserThread::FILE, FROM_HERE,
+ base::Bind(&UpdateChromeDesktopShortcutForProfile,
+ shortcut,
+ CreateProfileShortcutFlags(profile_path),
+ profile_path, avatar_bitmap_copy));
+ }
+ }
+}
+

Powered by Google App Engine
This is Rietveld 408576698