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

Side by Side Diff: chrome/browser/web_applications/web_app_win.cc

Issue 213833005: Prevent SHChangeNotify on app list drag on Windows. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 8 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
« no previous file with comments | « chrome/browser/web_applications/web_app_win.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/web_applications/web_app_win.h" 5 #include "chrome/browser/web_applications/web_app_win.h"
6 6
7 #include <shlobj.h> 7 #include <shlobj.h>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/file_util.h" 10 #include "base/file_util.h"
(...skipping 14 matching lines...) Expand all
25 #include "content/public/browser/browser_thread.h" 25 #include "content/public/browser/browser_thread.h"
26 #include "ui/gfx/icon_util.h" 26 #include "ui/gfx/icon_util.h"
27 #include "ui/gfx/image/image.h" 27 #include "ui/gfx/image/image.h"
28 #include "ui/gfx/image/image_family.h" 28 #include "ui/gfx/image/image_family.h"
29 29
30 namespace { 30 namespace {
31 31
32 const base::FilePath::CharType kIconChecksumFileExt[] = 32 const base::FilePath::CharType kIconChecksumFileExt[] =
33 FILE_PATH_LITERAL(".ico.md5"); 33 FILE_PATH_LITERAL(".ico.md5");
34 34
35 // Width and height of icons exported to .ico files.
36
37 // Calculates checksum of an icon family using MD5. 35 // Calculates checksum of an icon family using MD5.
38 // The checksum is derived from all of the icons in the family. 36 // The checksum is derived from all of the icons in the family.
39 void GetImageCheckSum(const gfx::ImageFamily& image, base::MD5Digest* digest) { 37 void GetImageCheckSum(const gfx::ImageFamily& image, base::MD5Digest* digest) {
40 DCHECK(digest); 38 DCHECK(digest);
41 base::MD5Context md5_context; 39 base::MD5Context md5_context;
42 base::MD5Init(&md5_context); 40 base::MD5Init(&md5_context);
43 41
44 for (gfx::ImageFamily::const_iterator it = image.begin(); it != image.end(); 42 for (gfx::ImageFamily::const_iterator it = image.begin(); it != image.end();
45 ++it) { 43 ++it) {
46 SkBitmap bitmap = it->AsBitmap(); 44 SkBitmap bitmap = it->AsBitmap();
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
166 const std::vector<base::FilePath>& shortcut_paths, 164 const std::vector<base::FilePath>& shortcut_paths,
167 web_app::ShortcutCreationReason creation_reason, 165 web_app::ShortcutCreationReason creation_reason,
168 std::vector<base::FilePath>* out_filenames) { 166 std::vector<base::FilePath>* out_filenames) {
169 // Ensure web_app_path exists. 167 // Ensure web_app_path exists.
170 if (!base::PathExists(web_app_path) && 168 if (!base::PathExists(web_app_path) &&
171 !base::CreateDirectory(web_app_path)) { 169 !base::CreateDirectory(web_app_path)) {
172 return false; 170 return false;
173 } 171 }
174 172
175 // Generates file name to use with persisted ico and shortcut file. 173 // Generates file name to use with persisted ico and shortcut file.
176 base::FilePath file_name = 174 base::FilePath icon_file =
177 web_app::internals::GetSanitizedFileName(shortcut_info.title); 175 web_app::internals::GetIconFilePath(web_app_path, shortcut_info.title);
178
179 // Creates an ico file to use with shortcut.
180 base::FilePath icon_file = web_app_path.Append(file_name).AddExtension(
181 FILE_PATH_LITERAL(".ico"));
182 if (!web_app::internals::CheckAndSaveIcon(icon_file, shortcut_info.favicon)) { 176 if (!web_app::internals::CheckAndSaveIcon(icon_file, shortcut_info.favicon)) {
183 return false; 177 return false;
184 } 178 }
185 179
186 base::FilePath chrome_exe; 180 base::FilePath chrome_exe;
187 if (!PathService::Get(base::FILE_EXE, &chrome_exe)) { 181 if (!PathService::Get(base::FILE_EXE, &chrome_exe)) {
188 NOTREACHED(); 182 NOTREACHED();
189 return false; 183 return false;
190 } 184 }
191 185
(...skipping 15 matching lines...) Expand all
207 if (description.length() >= MAX_PATH) 201 if (description.length() >= MAX_PATH)
208 description.resize(MAX_PATH - 1); 202 description.resize(MAX_PATH - 1);
209 203
210 // Generates app id from web app url and profile path. 204 // Generates app id from web app url and profile path.
211 std::string app_name(web_app::GenerateApplicationNameFromInfo(shortcut_info)); 205 std::string app_name(web_app::GenerateApplicationNameFromInfo(shortcut_info));
212 base::string16 app_id(ShellIntegration::GetAppModelIdForProfile( 206 base::string16 app_id(ShellIntegration::GetAppModelIdForProfile(
213 base::UTF8ToUTF16(app_name), shortcut_info.profile_path)); 207 base::UTF8ToUTF16(app_name), shortcut_info.profile_path));
214 208
215 bool success = true; 209 bool success = true;
216 for (size_t i = 0; i < shortcut_paths.size(); ++i) { 210 for (size_t i = 0; i < shortcut_paths.size(); ++i) {
217 base::FilePath shortcut_file = shortcut_paths[i].Append(file_name). 211 base::FilePath shortcut_file =
218 AddExtension(installer::kLnkExt); 212 shortcut_paths[i]
213 .Append(
214 web_app::internals::GetSanitizedFileName(shortcut_info.title))
215 .AddExtension(installer::kLnkExt);
219 if (creation_reason == web_app::SHORTCUT_CREATION_AUTOMATED) { 216 if (creation_reason == web_app::SHORTCUT_CREATION_AUTOMATED) {
220 // Check whether there is an existing shortcut to this app. 217 // Check whether there is an existing shortcut to this app.
221 std::vector<base::FilePath> shortcut_files = 218 std::vector<base::FilePath> shortcut_files =
222 FindAppShortcutsByProfileAndTitle(shortcut_paths[i], 219 FindAppShortcutsByProfileAndTitle(shortcut_paths[i],
223 shortcut_info.profile_path, 220 shortcut_info.profile_path,
224 shortcut_info.title); 221 shortcut_info.title);
225 if (!shortcut_files.empty()) 222 if (!shortcut_files.empty())
226 continue; 223 continue;
227 } 224 }
228 if (shortcut_paths[i] != web_app_path) { 225 if (shortcut_paths[i] != web_app_path) {
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
328 } // namespace 325 } // namespace
329 326
330 namespace web_app { 327 namespace web_app {
331 328
332 base::FilePath CreateShortcutInWebAppDir( 329 base::FilePath CreateShortcutInWebAppDir(
333 const base::FilePath& web_app_dir, 330 const base::FilePath& web_app_dir,
334 const ShellIntegration::ShortcutInfo& shortcut_info) { 331 const ShellIntegration::ShortcutInfo& shortcut_info) {
335 std::vector<base::FilePath> paths; 332 std::vector<base::FilePath> paths;
336 paths.push_back(web_app_dir); 333 paths.push_back(web_app_dir);
337 std::vector<base::FilePath> out_filenames; 334 std::vector<base::FilePath> out_filenames;
338 CreateShortcutsInPaths(web_app_dir, shortcut_info, paths, 335 base::FilePath web_app_dir_shortcut =
339 SHORTCUT_CREATION_BY_USER, &out_filenames); 336 web_app_dir.Append(web_app::internals::GetSanitizedFileName(
340 DCHECK_EQ(out_filenames.size(), 1u); 337 shortcut_info.title))
341 return out_filenames[0]; 338 .AddExtension(installer::kLnkExt);
339 if (!PathExists(web_app_dir_shortcut)) {
340 CreateShortcutsInPaths(web_app_dir,
341 shortcut_info,
342 paths,
343 SHORTCUT_CREATION_BY_USER,
344 &out_filenames);
345 DCHECK_EQ(out_filenames.size(), 1u);
346 DCHECK_EQ(out_filenames[0].value(), web_app_dir_shortcut.value());
347 } else {
348 web_app::internals::CheckAndSaveIcon(
benwells 2014/03/27 01:53:22 Nit: you don't need web_app:: here.
349 web_app::internals::GetIconFilePath(web_app_dir, shortcut_info.title),
350 shortcut_info.favicon);
351 }
352 return web_app_dir_shortcut;
342 } 353 }
343 354
344 namespace internals { 355 namespace internals {
345 356
346 // Saves |image| to |icon_file| if the file is outdated and refresh shell's 357 // Saves |image| to |icon_file| if the file is outdated and refresh shell's
347 // icon cache to ensure correct icon is displayed. Returns true if icon_file 358 // icon cache to ensure correct icon is displayed. Returns true if icon_file
348 // is up to date or successfully updated. 359 // is up to date or successfully updated.
349 bool CheckAndSaveIcon(const base::FilePath& icon_file, 360 bool CheckAndSaveIcon(const base::FilePath& icon_file,
350 const gfx::ImageFamily& image) { 361 const gfx::ImageFamily& image) {
351 if (ShouldUpdateIcon(icon_file, image)) { 362 if (ShouldUpdateIcon(icon_file, image)) {
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
435 // Use the web app path shortcut for pinning to avoid having unique 446 // Use the web app path shortcut for pinning to avoid having unique
436 // numbers in the application name. 447 // numbers in the application name.
437 base::FilePath shortcut_to_pin = web_app_path.Append(file_name). 448 base::FilePath shortcut_to_pin = web_app_path.Append(file_name).
438 AddExtension(installer::kLnkExt); 449 AddExtension(installer::kLnkExt);
439 base::win::TaskbarPinShortcutLink(shortcut_to_pin.value().c_str()); 450 base::win::TaskbarPinShortcutLink(shortcut_to_pin.value().c_str());
440 } 451 }
441 } 452 }
442 453
443 // If an icon file exists, and is out of date, replace it with the new icon 454 // If an icon file exists, and is out of date, replace it with the new icon
444 // and let the shell know the icon has been modified. 455 // and let the shell know the icon has been modified.
445 base::FilePath icon_file = web_app_path.Append(file_name).AddExtension( 456 base::FilePath icon_file =
446 FILE_PATH_LITERAL(".ico")); 457 web_app::internals::GetIconFilePath(web_app_path, shortcut_info.title);
benwells 2014/03/27 01:53:22 Nit: you don't need the namespace here as you're i
447 if (base::PathExists(icon_file)) { 458 if (base::PathExists(icon_file)) {
448 web_app::internals::CheckAndSaveIcon(icon_file, shortcut_info.favicon); 459 web_app::internals::CheckAndSaveIcon(icon_file, shortcut_info.favicon);
449 } 460 }
450 } 461 }
451 462
452 void DeletePlatformShortcuts( 463 void DeletePlatformShortcuts(
453 const base::FilePath& web_app_path, 464 const base::FilePath& web_app_path,
454 const ShellIntegration::ShortcutInfo& shortcut_info) { 465 const ShellIntegration::ShortcutInfo& shortcut_info) {
455 GetShortcutLocationsAndDeleteShortcuts( 466 GetShortcutLocationsAndDeleteShortcuts(
456 web_app_path, shortcut_info.profile_path, shortcut_info.title, NULL, 467 web_app_path, shortcut_info.profile_path, shortcut_info.title, NULL,
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
528 &path)) { 539 &path)) {
529 NOTREACHED(); 540 NOTREACHED();
530 continue; 541 continue;
531 } 542 }
532 shortcut_paths.push_back(path); 543 shortcut_paths.push_back(path);
533 } 544 }
534 } 545 }
535 return shortcut_paths; 546 return shortcut_paths;
536 } 547 }
537 548
549 base::FilePath GetIconFilePath(const base::FilePath& web_app_path,
550 const base::string16& title) {
551 return web_app_path.Append(web_app::internals::GetSanitizedFileName(title))
552 .AddExtension(FILE_PATH_LITERAL(".ico"));
553 }
554
538 } // namespace internals 555 } // namespace internals
539 556
540 } // namespace web_app 557 } // namespace web_app
OLDNEW
« no previous file with comments | « chrome/browser/web_applications/web_app_win.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698