// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/extensions/app_shortcut_manager.h" #include "base/command_line.h" #include "base/utf_string_conversions.h" #include "chrome/browser/ui/webui/extensions/extension_icon_source.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/web_applications/web_app.h" #include "chrome/common/chrome_notification_types.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/extensions/extension_resource.h" #include "content/public/browser/notification_details.h" #include "content/public/browser/notification_source.h" #include "grit/theme_resources.h" namespace { // Allow tests to disable shortcut creation, to prevent developers' desktops // becoming overrun with shortcuts. bool disable_shortcut_creation_for_tests = false; } // namespace AppShortcutManager::AppShortcutManager(Profile* profile) : profile_(profile), tracker_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_INSTALLED, content::Source<Profile>(profile_)); } void AppShortcutManager::OnImageLoaded(SkBitmap *image, const ExtensionResource &resource, int index) { // If the image failed to load (e.g. if the resource being loaded was empty) // use the standard application icon. if (!image || image->isNull()) image = ExtensionIconSource::LoadImageByResourceId(IDR_APP_DEFAULT_ICON); shortcut_info_.favicon = *image; web_app::CreateShortcut(profile_->GetPath(), shortcut_info_); } void AppShortcutManager::Observe(int type, const content::NotificationSource& source, const content::NotificationDetails& details) { DCHECK(type == chrome::NOTIFICATION_EXTENSION_INSTALLED); const Extension* extension = content::Details<const Extension>(details).ptr(); if (!disable_shortcut_creation_for_tests && extension->is_platform_app()) InstallApplicationShortcuts(extension); } // static void AppShortcutManager::SetShortcutCreationDisabledForTesting(bool disabled) { disable_shortcut_creation_for_tests = disabled; } void AppShortcutManager::InstallApplicationShortcuts( const Extension* extension) { #if defined(OS_MACOSX) // TODO(sail): For now only install shortcuts if enable platform apps is true. if (!CommandLine::ForCurrentProcess()->HasSwitch( switches::kEnablePlatformApps)) { return; } #endif const int kAppIconSize = 32; shortcut_info_.extension_id = extension->id(); shortcut_info_.url = GURL(extension->launch_web_url()); shortcut_info_.title = UTF8ToUTF16(extension->name()); shortcut_info_.description = UTF8ToUTF16(extension->description()); shortcut_info_.create_in_applications_menu = true; shortcut_info_.create_in_quick_launch_bar = true; shortcut_info_.create_on_desktop = true; // The icon will be resized to |max_size|. const gfx::Size max_size(kAppIconSize, kAppIconSize); // Look for an icon. If there is no icon at the ideal size, we will resize // whatever we can get. Making a large icon smaller is prefered to making a // small icon larger, so look for a larger icon first: ExtensionResource icon_resource = extension->GetIconResource( kAppIconSize, ExtensionIconSet::MATCH_BIGGER); // If no icon exists that is the desired size or larger, get the // largest icon available: if (icon_resource.empty()) { icon_resource = extension->GetIconResource( kAppIconSize, ExtensionIconSet::MATCH_SMALLER); } // icon_resource may still be empty at this point, in which case LoadImage // which call the OnImageLoaded callback with a NULL image and exit // immediately. tracker_.LoadImage(extension, icon_resource, max_size, ImageLoadingTracker::DONT_CACHE); }