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

Side by Side Diff: chrome/browser/ui/web_applications/web_app_ui.cc

Issue 212273002: Move UpdateShortcutInfoAndIconForApp from web_app_ui to web_app (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 9 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/ui/web_applications/web_app_ui.h" 5 #include "chrome/browser/ui/web_applications/web_app_ui.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/file_util.h"
10 #include "base/path_service.h"
11 #include "base/prefs/pref_service.h"
12 #include "base/strings/string16.h"
13 #include "base/strings/utf_string_conversions.h" 9 #include "base/strings/utf_string_conversions.h"
14 #include "chrome/browser/chrome_notification_types.h" 10 #include "chrome/browser/chrome_notification_types.h"
15 #include "chrome/browser/extensions/image_loader.h"
16 #include "chrome/browser/extensions/tab_helper.h" 11 #include "chrome/browser/extensions/tab_helper.h"
17 #include "chrome/browser/favicon/favicon_tab_helper.h" 12 #include "chrome/browser/favicon/favicon_tab_helper.h"
18 #include "chrome/browser/history/select_favicon_frames.h" 13 #include "chrome/browser/history/select_favicon_frames.h"
19 #include "chrome/browser/profiles/profile.h" 14 #include "chrome/browser/profiles/profile.h"
20 #include "chrome/browser/web_applications/web_app.h"
21 #include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
22 #include "chrome/common/extensions/manifest_handlers/icons_handler.h"
23 #include "chrome/common/pref_names.h"
24 #include "content/public/browser/browser_thread.h" 15 #include "content/public/browser/browser_thread.h"
25 #include "content/public/browser/notification_details.h" 16 #include "content/public/browser/notification_details.h"
26 #include "content/public/browser/notification_registrar.h" 17 #include "content/public/browser/notification_registrar.h"
27 #include "content/public/browser/notification_source.h" 18 #include "content/public/browser/notification_source.h"
28 #include "content/public/browser/web_contents.h" 19 #include "content/public/browser/web_contents.h"
29 #include "extensions/common/extension.h"
30 #include "grit/theme_resources.h"
31 #include "skia/ext/image_operations.h"
32 #include "third_party/skia/include/core/SkBitmap.h"
33 #include "ui/base/resource/resource_bundle.h"
34 #include "ui/gfx/image/image.h"
35 #include "ui/gfx/image/image_family.h"
36 #include "ui/gfx/image/image_skia.h"
37 #include "url/gurl.h" 20 #include "url/gurl.h"
38 21
39 #if defined(OS_POSIX) && !defined(OS_MACOSX) 22 #if defined(OS_POSIX) && !defined(OS_MACOSX)
40 #include "base/environment.h" 23 #include "base/environment.h"
41 #endif 24 #endif
42 25
43 #if defined(OS_WIN) 26 #if defined(OS_WIN)
44 #include "base/win/shortcut.h" 27 #include "base/win/shortcut.h"
45 #include "base/win/windows_version.h" 28 #include "base/win/windows_version.h"
46 #include "chrome/browser/web_applications/web_app_win.h" 29 #include "chrome/browser/web_applications/web_app_win.h"
47 #include "ui/gfx/icon_util.h" 30 #include "ui/gfx/icon_util.h"
48 #endif 31 #endif
49 32
50 using content::BrowserThread; 33 using content::BrowserThread;
51 using content::NavigationController; 34 using content::NavigationController;
52 using content::WebContents; 35 using content::WebContents;
53 36
54 namespace { 37 namespace {
55 38
56 #if defined(OS_MACOSX)
57 const int kDesiredSizes[] = {16, 32, 128, 256, 512};
58 const size_t kNumDesiredSizes = arraysize(kDesiredSizes);
59 #elif defined(OS_LINUX)
60 // Linux supports icons of any size. FreeDesktop Icon Theme Specification states
61 // that "Minimally you should install a 48x48 icon in the hicolor theme."
62 const int kDesiredSizes[] = {16, 32, 48, 128, 256, 512};
63 const size_t kNumDesiredSizes = arraysize(kDesiredSizes);
64 #elif defined(OS_WIN)
65 const int* kDesiredSizes = IconUtil::kIconDimensions;
66 const size_t kNumDesiredSizes = IconUtil::kNumIconDimensions;
67 #else
68 const int kDesiredSizes[] = {32};
69 const size_t kNumDesiredSizes = arraysize(kDesiredSizes);
70 #endif
71
72 #if defined(OS_WIN) 39 #if defined(OS_WIN)
benwells 2014/03/26 23:50:21 Can we kill this entire file? Seems like the rest
jackhou1 2014/03/27 00:03:57 Yeah I agree. Could we do that in another CL? The
73 // UpdateShortcutWorker holds all context data needed for update shortcut. 40 // UpdateShortcutWorker holds all context data needed for update shortcut.
74 // It schedules a pre-update check to find all shortcuts that needs to be 41 // It schedules a pre-update check to find all shortcuts that needs to be
75 // updated. If there are such shortcuts, it schedules icon download and 42 // updated. If there are such shortcuts, it schedules icon download and
76 // update them when icons are downloaded. It observes TAB_CLOSING notification 43 // update them when icons are downloaded. It observes TAB_CLOSING notification
77 // and cancels all the work when the underlying tab is closing. 44 // and cancels all the work when the underlying tab is closing.
78 class UpdateShortcutWorker : public content::NotificationObserver { 45 class UpdateShortcutWorker : public content::NotificationObserver {
79 public: 46 public:
80 explicit UpdateShortcutWorker(WebContents* web_contents); 47 explicit UpdateShortcutWorker(WebContents* web_contents);
81 48
82 void Run(); 49 void Run();
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after
336 base::Unretained(this))); 303 base::Unretained(this)));
337 } 304 }
338 } 305 }
339 306
340 void UpdateShortcutWorker::DeleteMeOnUIThread() { 307 void UpdateShortcutWorker::DeleteMeOnUIThread() {
341 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 308 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
342 delete this; 309 delete this;
343 } 310 }
344 #endif // defined(OS_WIN) 311 #endif // defined(OS_WIN)
345 312
346 void OnImageLoaded(ShellIntegration::ShortcutInfo shortcut_info,
347 web_app::ShortcutInfoCallback callback,
348 const gfx::ImageFamily& image_family) {
349 // If the image failed to load (e.g. if the resource being loaded was empty)
350 // use the standard application icon.
351 if (image_family.empty()) {
352 gfx::Image default_icon =
353 ResourceBundle::GetSharedInstance().GetImageNamed(IDR_APP_DEFAULT_ICON);
354 int size = kDesiredSizes[kNumDesiredSizes - 1];
355 SkBitmap bmp = skia::ImageOperations::Resize(
356 *default_icon.ToSkBitmap(), skia::ImageOperations::RESIZE_BEST,
357 size, size);
358 gfx::ImageSkia image_skia = gfx::ImageSkia::CreateFrom1xBitmap(bmp);
359 // We are on the UI thread, and this image is needed from the FILE thread,
360 // for creating shortcut icon files.
361 image_skia.MakeThreadSafe();
362 shortcut_info.favicon.Add(gfx::Image(image_skia));
363 } else {
364 shortcut_info.favicon = image_family;
365 }
366
367 callback.Run(shortcut_info);
368 }
369
370 } // namespace 313 } // namespace
371 314
372 namespace web_app { 315 namespace web_app {
373 316
374 ShellIntegration::ShortcutInfo ShortcutInfoForExtensionAndProfile(
375 const extensions::Extension* extension, Profile* profile) {
376 ShellIntegration::ShortcutInfo shortcut_info;
377 web_app::UpdateShortcutInfoForApp(*extension, profile, &shortcut_info);
378 return shortcut_info;
379 }
380
381 void GetShortcutInfoForTab(WebContents* web_contents, 317 void GetShortcutInfoForTab(WebContents* web_contents,
382 ShellIntegration::ShortcutInfo* info) { 318 ShellIntegration::ShortcutInfo* info) {
383 DCHECK(info); // Must provide a valid info. 319 DCHECK(info); // Must provide a valid info.
384 320
385 const FaviconTabHelper* favicon_tab_helper = 321 const FaviconTabHelper* favicon_tab_helper =
386 FaviconTabHelper::FromWebContents(web_contents); 322 FaviconTabHelper::FromWebContents(web_contents);
387 const extensions::TabHelper* extensions_tab_helper = 323 const extensions::TabHelper* extensions_tab_helper =
388 extensions::TabHelper::FromWebContents(web_contents); 324 extensions::TabHelper::FromWebContents(web_contents);
389 const WebApplicationInfo& app_info = extensions_tab_helper->web_app_info(); 325 const WebApplicationInfo& app_info = extensions_tab_helper->web_app_info();
390 326
(...skipping 12 matching lines...) Expand all
403 } 339 }
404 340
405 void UpdateShortcutForTabContents(WebContents* web_contents) { 341 void UpdateShortcutForTabContents(WebContents* web_contents) {
406 #if defined(OS_WIN) 342 #if defined(OS_WIN)
407 // UpdateShortcutWorker will delete itself when it's done. 343 // UpdateShortcutWorker will delete itself when it's done.
408 UpdateShortcutWorker* worker = new UpdateShortcutWorker(web_contents); 344 UpdateShortcutWorker* worker = new UpdateShortcutWorker(web_contents);
409 worker->Run(); 345 worker->Run();
410 #endif // defined(OS_WIN) 346 #endif // defined(OS_WIN)
411 } 347 }
412 348
413 void UpdateShortcutInfoForApp(const extensions::Extension& app,
414 Profile* profile,
415 ShellIntegration::ShortcutInfo* shortcut_info) {
416 shortcut_info->extension_id = app.id();
417 shortcut_info->is_platform_app = app.is_platform_app();
418 shortcut_info->url = extensions::AppLaunchInfo::GetLaunchWebURL(&app);
419 shortcut_info->title = base::UTF8ToUTF16(app.name());
420 shortcut_info->description = base::UTF8ToUTF16(app.description());
421 shortcut_info->extension_path = app.path();
422 shortcut_info->profile_path = profile->GetPath();
423 shortcut_info->profile_name =
424 profile->GetPrefs()->GetString(prefs::kProfileName);
425 }
426
427 void UpdateShortcutInfoAndIconForApp(
428 const extensions::Extension* extension,
429 Profile* profile,
430 const web_app::ShortcutInfoCallback& callback) {
431 ShellIntegration::ShortcutInfo shortcut_info =
432 ShortcutInfoForExtensionAndProfile(extension, profile);
433
434 std::vector<extensions::ImageLoader::ImageRepresentation> info_list;
435 for (size_t i = 0; i < kNumDesiredSizes; ++i) {
436 int size = kDesiredSizes[i];
437 extensions::ExtensionResource resource =
438 extensions::IconsInfo::GetIconResource(
439 extension, size, ExtensionIconSet::MATCH_EXACTLY);
440 if (!resource.empty()) {
441 info_list.push_back(extensions::ImageLoader::ImageRepresentation(
442 resource,
443 extensions::ImageLoader::ImageRepresentation::ALWAYS_RESIZE,
444 gfx::Size(size, size),
445 ui::SCALE_FACTOR_100P));
446 }
447 }
448
449 if (info_list.empty()) {
450 size_t i = kNumDesiredSizes - 1;
451 int size = kDesiredSizes[i];
452
453 // If there is no icon at the desired sizes, we will resize what we can get.
454 // Making a large icon smaller is preferred to making a small icon larger,
455 // so look for a larger icon first:
456 extensions::ExtensionResource resource =
457 extensions::IconsInfo::GetIconResource(
458 extension, size, ExtensionIconSet::MATCH_BIGGER);
459 if (resource.empty()) {
460 resource = extensions::IconsInfo::GetIconResource(
461 extension, size, ExtensionIconSet::MATCH_SMALLER);
462 }
463 info_list.push_back(extensions::ImageLoader::ImageRepresentation(
464 resource,
465 extensions::ImageLoader::ImageRepresentation::ALWAYS_RESIZE,
466 gfx::Size(size, size),
467 ui::SCALE_FACTOR_100P));
468 }
469
470 // |info_list| may still be empty at this point, in which case
471 // LoadImageFamilyAsync will call the OnImageLoaded callback with an empty
472 // image and exit immediately.
473 extensions::ImageLoader::Get(profile)->LoadImageFamilyAsync(
474 extension,
475 info_list,
476 base::Bind(&OnImageLoaded, shortcut_info, callback));
477 }
478
479 } // namespace web_app 349 } // namespace web_app
OLDNEW
« no previous file with comments | « chrome/browser/ui/web_applications/web_app_ui.h ('k') | chrome/browser/web_applications/web_app.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698