diff options
author | calamity@chromium.org <calamity@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-30 17:10:39 +0000 |
---|---|---|
committer | calamity@chromium.org <calamity@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-30 17:10:39 +0000 |
commit | 14e0641044969d29b9dbc588df4176e049331f1e (patch) | |
tree | 9bc964626e68bb8bba6bc218a7f42612bd2d4962 | |
parent | b20491f58dc84518b90da3d57d5c121233bba6a4 (diff) | |
download | chromium_src-14e0641044969d29b9dbc588df4176e049331f1e.zip chromium_src-14e0641044969d29b9dbc588df4176e049331f1e.tar.gz chromium_src-14e0641044969d29b9dbc588df4176e049331f1e.tar.bz2 |
Prevent SHChangeNotify on app list drag on Windows.
This CL fixes an issue with all taskbar icons flashing on every app list
drag due to a SHChangeNotify being fired. This was being caused an overwrite
of the web app path shortcut which is created for drag and drop to the taskbar.
The fix skips the shortcut creation if it already exists (but still updates the icon).
This CL also extracts a GetIconFilePath function.
BUG=356961
Review URL: https://codereview.chromium.org/213833005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@260439 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/ui/web_applications/web_app_ui.cc | 4 | ||||
-rw-r--r-- | chrome/browser/web_applications/web_app_win.cc | 55 | ||||
-rw-r--r-- | chrome/browser/web_applications/web_app_win.h | 3 |
3 files changed, 39 insertions, 23 deletions
diff --git a/chrome/browser/ui/web_applications/web_app_ui.cc b/chrome/browser/ui/web_applications/web_app_ui.cc index 8a5bf2a..04ab5ac 100644 --- a/chrome/browser/ui/web_applications/web_app_ui.cc +++ b/chrome/browser/ui/web_applications/web_app_ui.cc @@ -291,8 +291,8 @@ void UpdateShortcutWorker::UpdateShortcutsOnFileThread() { return; } - base::FilePath icon_file = web_app_path.Append(file_name_).ReplaceExtension( - FILE_PATH_LITERAL(".ico")); + base::FilePath icon_file = + web_app::internals::GetIconFilePath(web_app_path, shortcut_info_.title); web_app::internals::CheckAndSaveIcon(icon_file, shortcut_info_.favicon); // Update existing shortcuts' description, icon and app id. diff --git a/chrome/browser/web_applications/web_app_win.cc b/chrome/browser/web_applications/web_app_win.cc index cef73df..3178d67 100644 --- a/chrome/browser/web_applications/web_app_win.cc +++ b/chrome/browser/web_applications/web_app_win.cc @@ -32,8 +32,6 @@ namespace { const base::FilePath::CharType kIconChecksumFileExt[] = FILE_PATH_LITERAL(".ico.md5"); -// Width and height of icons exported to .ico files. - // Calculates checksum of an icon family using MD5. // The checksum is derived from all of the icons in the family. void GetImageCheckSum(const gfx::ImageFamily& image, base::MD5Digest* digest) { @@ -173,12 +171,8 @@ bool CreateShortcutsInPaths( } // Generates file name to use with persisted ico and shortcut file. - base::FilePath file_name = - web_app::internals::GetSanitizedFileName(shortcut_info.title); - - // Creates an ico file to use with shortcut. - base::FilePath icon_file = web_app_path.Append(file_name).AddExtension( - FILE_PATH_LITERAL(".ico")); + base::FilePath icon_file = + web_app::internals::GetIconFilePath(web_app_path, shortcut_info.title); if (!web_app::internals::CheckAndSaveIcon(icon_file, shortcut_info.favicon)) { return false; } @@ -214,8 +208,11 @@ bool CreateShortcutsInPaths( bool success = true; for (size_t i = 0; i < shortcut_paths.size(); ++i) { - base::FilePath shortcut_file = shortcut_paths[i].Append(file_name). - AddExtension(installer::kLnkExt); + base::FilePath shortcut_file = + shortcut_paths[i] + .Append( + web_app::internals::GetSanitizedFileName(shortcut_info.title)) + .AddExtension(installer::kLnkExt); if (creation_reason == web_app::SHORTCUT_CREATION_AUTOMATED) { // Check whether there is an existing shortcut to this app. std::vector<base::FilePath> shortcut_files = @@ -336,10 +333,23 @@ base::FilePath CreateShortcutInWebAppDir( std::vector<base::FilePath> paths; paths.push_back(web_app_dir); std::vector<base::FilePath> out_filenames; - CreateShortcutsInPaths(web_app_dir, shortcut_info, paths, - SHORTCUT_CREATION_BY_USER, &out_filenames); - DCHECK_EQ(out_filenames.size(), 1u); - return out_filenames[0]; + base::FilePath web_app_dir_shortcut = + web_app_dir.Append(internals::GetSanitizedFileName(shortcut_info.title)) + .AddExtension(installer::kLnkExt); + if (!PathExists(web_app_dir_shortcut)) { + CreateShortcutsInPaths(web_app_dir, + shortcut_info, + paths, + SHORTCUT_CREATION_BY_USER, + &out_filenames); + DCHECK_EQ(out_filenames.size(), 1u); + DCHECK_EQ(out_filenames[0].value(), web_app_dir_shortcut.value()); + } else { + internals::CheckAndSaveIcon( + internals::GetIconFilePath(web_app_dir, shortcut_info.title), + shortcut_info.favicon); + } + return web_app_dir_shortcut; } namespace internals { @@ -393,8 +403,7 @@ bool CreatePlatformShortcuts( return false; if (pin_to_taskbar) { - base::FilePath file_name = - web_app::internals::GetSanitizedFileName(shortcut_info.title); + base::FilePath file_name = GetSanitizedFileName(shortcut_info.title); // Use the web app path shortcut for pinning to avoid having unique numbers // in the application name. base::FilePath shortcut_to_pin = web_app_path.Append(file_name). @@ -431,8 +440,7 @@ void UpdatePlatformShortcuts( // GetShortcutLocationsAndDeleteShortcuts will have deleted it. In that // case, re-pin it. if (was_pinned_to_taskbar) { - base::FilePath file_name = - web_app::internals::GetSanitizedFileName(shortcut_info.title); + base::FilePath file_name = GetSanitizedFileName(shortcut_info.title); // Use the web app path shortcut for pinning to avoid having unique // numbers in the application name. base::FilePath shortcut_to_pin = web_app_path.Append(file_name). @@ -442,9 +450,8 @@ void UpdatePlatformShortcuts( } // Update the icon if necessary. - base::FilePath icon_file = web_app_path.Append(file_name).AddExtension( - FILE_PATH_LITERAL(".ico")); - web_app::internals::CheckAndSaveIcon(icon_file, shortcut_info.favicon); + base::FilePath icon_file = GetIconFilePath(web_app_path, shortcut_info.title); + CheckAndSaveIcon(icon_file, shortcut_info.favicon); } void DeletePlatformShortcuts( @@ -533,6 +540,12 @@ std::vector<base::FilePath> GetShortcutPaths( return shortcut_paths; } +base::FilePath GetIconFilePath(const base::FilePath& web_app_path, + const base::string16& title) { + return web_app_path.Append(GetSanitizedFileName(title)) + .AddExtension(FILE_PATH_LITERAL(".ico")); +} + } // namespace internals } // namespace web_app diff --git a/chrome/browser/web_applications/web_app_win.h b/chrome/browser/web_applications/web_app_win.h index 6b2cf5b..3c0dafe 100644 --- a/chrome/browser/web_applications/web_app_win.h +++ b/chrome/browser/web_applications/web_app_win.h @@ -25,6 +25,9 @@ namespace internals { bool CheckAndSaveIcon(const base::FilePath& icon_file, const gfx::ImageFamily& image); +base::FilePath GetIconFilePath(const base::FilePath& web_app_path, + const base::string16& title); + } // namespace internals } // namespace web_app |