Commit 18fb3d13 authored by yoz@chromium.org's avatar yoz@chromium.org

Add custom icon support to GlobalError. Show extension icon in permissions increase bubble.

http://i.imgur.com/VHG6Zbl.png

BUG=229102

Review URL: https://chromiumcodereview.appspot.com/15745022

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@202795 0039d316-1c4b-4281-b951-d872f2087c98
parent d0ddb326
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include "chrome/browser/extensions/extension_install_ui.h" #include "chrome/browser/extensions/extension_install_ui.h"
#include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/extension_uninstall_dialog.h" #include "chrome/browser/extensions/extension_uninstall_dialog.h"
#include "chrome/browser/extensions/image_loader.h"
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/global_error/global_error.h" #include "chrome/browser/ui/global_error/global_error.h"
...@@ -26,6 +27,8 @@ ...@@ -26,6 +27,8 @@
#include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/common/chrome_notification_types.h" #include "chrome/common/chrome_notification_types.h"
#include "chrome/common/extensions/extension.h" #include "chrome/common/extensions/extension.h"
#include "chrome/common/extensions/extension_icon_set.h"
#include "chrome/common/extensions/manifest_handlers/icons_handler.h"
#include "chrome/common/extensions/permissions/permission_set.h" #include "chrome/common/extensions/permissions/permission_set.h"
#include "content/public/browser/notification_details.h" #include "content/public/browser/notification_details.h"
#include "content/public/browser/notification_observer.h" #include "content/public/browser/notification_observer.h"
...@@ -35,11 +38,16 @@ ...@@ -35,11 +38,16 @@
#include "grit/generated_resources.h" #include "grit/generated_resources.h"
#include "grit/theme_resources.h" #include "grit/theme_resources.h"
#include "ui/base/l10n/l10n_util.h" #include "ui/base/l10n/l10n_util.h"
#include "ui/gfx/image/image.h"
#include "ui/gfx/image/image_skia_operations.h"
#include "ui/gfx/size.h"
using extensions::Extension; using extensions::Extension;
namespace { namespace {
static const int kIconSize = extension_misc::EXTENSION_ICON_SMALL;
static base::LazyInstance< static base::LazyInstance<
std::bitset<IDC_EXTENSION_DISABLED_LAST - std::bitset<IDC_EXTENSION_DISABLED_LAST -
IDC_EXTENSION_DISABLED_FIRST + 1> > IDC_EXTENSION_DISABLED_FIRST + 1> >
...@@ -131,7 +139,8 @@ class ExtensionDisabledGlobalError : public GlobalError, ...@@ -131,7 +139,8 @@ class ExtensionDisabledGlobalError : public GlobalError,
public ExtensionUninstallDialog::Delegate { public ExtensionUninstallDialog::Delegate {
public: public:
ExtensionDisabledGlobalError(ExtensionService* service, ExtensionDisabledGlobalError(ExtensionService* service,
const Extension* extension); const Extension* extension,
const gfx::Image& icon);
virtual ~ExtensionDisabledGlobalError(); virtual ~ExtensionDisabledGlobalError();
// GlobalError implementation. // GlobalError implementation.
...@@ -141,6 +150,7 @@ class ExtensionDisabledGlobalError : public GlobalError, ...@@ -141,6 +150,7 @@ class ExtensionDisabledGlobalError : public GlobalError,
virtual string16 MenuItemLabel() OVERRIDE; virtual string16 MenuItemLabel() OVERRIDE;
virtual void ExecuteMenuItem(Browser* browser) OVERRIDE; virtual void ExecuteMenuItem(Browser* browser) OVERRIDE;
virtual bool HasBubbleView() OVERRIDE; virtual bool HasBubbleView() OVERRIDE;
virtual gfx::Image GetBubbleViewIcon() OVERRIDE;
virtual string16 GetBubbleViewTitle() OVERRIDE; virtual string16 GetBubbleViewTitle() OVERRIDE;
virtual std::vector<string16> GetBubbleViewMessages() OVERRIDE; virtual std::vector<string16> GetBubbleViewMessages() OVERRIDE;
virtual string16 GetBubbleViewAcceptButtonLabel() OVERRIDE; virtual string16 GetBubbleViewAcceptButtonLabel() OVERRIDE;
...@@ -161,6 +171,7 @@ class ExtensionDisabledGlobalError : public GlobalError, ...@@ -161,6 +171,7 @@ class ExtensionDisabledGlobalError : public GlobalError,
private: private:
ExtensionService* service_; ExtensionService* service_;
const Extension* extension_; const Extension* extension_;
gfx::Image icon_;
// How the user responded to the error; used for metrics. // How the user responded to the error; used for metrics.
enum UserResponse { enum UserResponse {
...@@ -182,11 +193,22 @@ class ExtensionDisabledGlobalError : public GlobalError, ...@@ -182,11 +193,22 @@ class ExtensionDisabledGlobalError : public GlobalError,
// TODO(yoz): create error at startup for disabled extensions. // TODO(yoz): create error at startup for disabled extensions.
ExtensionDisabledGlobalError::ExtensionDisabledGlobalError( ExtensionDisabledGlobalError::ExtensionDisabledGlobalError(
ExtensionService* service, ExtensionService* service,
const Extension* extension) const Extension* extension,
const gfx::Image& icon)
: service_(service), : service_(service),
extension_(extension), extension_(extension),
icon_(icon),
user_response_(IGNORED), user_response_(IGNORED),
menu_command_id_(GetMenuCommandID()) { menu_command_id_(GetMenuCommandID()) {
if (icon_.IsEmpty()) {
icon_ = gfx::Image(
gfx::ImageSkiaOperations::CreateResizedImage(
extension_->is_app() ?
extensions::IconsInfo::GetDefaultAppIcon() :
extensions::IconsInfo::GetDefaultExtensionIcon(),
skia::ImageOperations::RESIZE_BEST,
gfx::Size(kIconSize, kIconSize)));
}
registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED, registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED,
content::Source<Profile>(service->profile())); content::Source<Profile>(service->profile()));
registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED, registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED,
...@@ -225,6 +247,10 @@ bool ExtensionDisabledGlobalError::HasBubbleView() { ...@@ -225,6 +247,10 @@ bool ExtensionDisabledGlobalError::HasBubbleView() {
return true; return true;
} }
gfx::Image ExtensionDisabledGlobalError::GetBubbleViewIcon() {
return icon_;
}
string16 ExtensionDisabledGlobalError::GetBubbleViewTitle() { string16 ExtensionDisabledGlobalError::GetBubbleViewTitle() {
return l10n_util::GetStringFUTF16(IDS_EXTENSION_DISABLED_ERROR_TITLE, return l10n_util::GetStringFUTF16(IDS_EXTENSION_DISABLED_ERROR_TITLE,
UTF8ToUTF16(extension_->name())); UTF8ToUTF16(extension_->name()));
...@@ -319,10 +345,28 @@ void ExtensionDisabledGlobalError::Observe( ...@@ -319,10 +345,28 @@ void ExtensionDisabledGlobalError::Observe(
namespace extensions { namespace extensions {
void AddExtensionDisabledErrorWithIcon(base::WeakPtr<ExtensionService> service,
const std::string& extension_id,
const gfx::Image& icon) {
if (!service.get())
return;
const Extension* extension = service->GetInstalledExtension(extension_id);
if (extension) {
GlobalErrorServiceFactory::GetForProfile(service->profile())->
AddGlobalError(new ExtensionDisabledGlobalError(
service, extension, icon));
}
}
void AddExtensionDisabledError(ExtensionService* service, void AddExtensionDisabledError(ExtensionService* service,
const Extension* extension) { const Extension* extension) {
GlobalErrorServiceFactory::GetForProfile(service->profile())-> extensions::ExtensionResource image = extensions::IconsInfo::GetIconResource(
AddGlobalError(new ExtensionDisabledGlobalError(service, extension)); extension, kIconSize, ExtensionIconSet::MATCH_BIGGER);
gfx::Size size(kIconSize, kIconSize);
ImageLoader::Get(service->profile())->LoadImageAsync(
extension, image, size,
base::Bind(&AddExtensionDisabledErrorWithIcon,
service->AsWeakPtr(), extension->id()));
} }
void ShowExtensionDisabledDialog(ExtensionService* service, void ShowExtensionDisabledDialog(ExtensionService* service,
......
...@@ -23,7 +23,6 @@ ...@@ -23,7 +23,6 @@
#include "grit/generated_resources.h" #include "grit/generated_resources.h"
#import "third_party/GTM/AppKit/GTMUILocalizerAndLayoutTweaker.h" #import "third_party/GTM/AppKit/GTMUILocalizerAndLayoutTweaker.h"
#include "ui/base/l10n/l10n_util.h" #include "ui/base/l10n/l10n_util.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/gfx/image/image.h" #include "ui/gfx/image/image.h"
namespace { namespace {
...@@ -83,9 +82,9 @@ class Bridge : public GlobalErrorBubbleViewBase { ...@@ -83,9 +82,9 @@ class Bridge : public GlobalErrorBubbleViewBase {
DCHECK(error_); DCHECK(error_);
ResourceBundle& rb = ResourceBundle::GetSharedInstance(); gfx::Image image = error_->GetBubbleViewIcon();
[iconView_ setImage:rb.GetNativeImageNamed( DCHECK(!image.IsEmpty());
error_->GetBubbleViewIconResourceID()).ToNSImage()]; [iconView_ setImage:image.ToNSImage()];
[title_ setStringValue:SysUTF16ToNSString(error_->GetBubbleViewTitle())]; [title_ setStringValue:SysUTF16ToNSString(error_->GetBubbleViewTitle())];
std::vector<string16> messages = error_->GetBubbleViewMessages(); std::vector<string16> messages = error_->GetBubbleViewMessages();
......
...@@ -7,6 +7,8 @@ ...@@ -7,6 +7,8 @@
#include "base/logging.h" #include "base/logging.h"
#include "chrome/browser/ui/global_error/global_error_bubble_view_base.h" #include "chrome/browser/ui/global_error/global_error_bubble_view_base.h"
#include "grit/theme_resources.h" #include "grit/theme_resources.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/gfx/image/image.h"
GlobalError::GlobalError() GlobalError::GlobalError()
: has_shown_bubble_view_(false), : has_shown_bubble_view_(false),
...@@ -45,10 +47,11 @@ GlobalErrorBubbleViewBase* GlobalError::GetBubbleView() { ...@@ -45,10 +47,11 @@ GlobalErrorBubbleViewBase* GlobalError::GetBubbleView() {
return bubble_view_; return bubble_view_;
} }
int GlobalError::GetBubbleViewIconResourceID() { gfx::Image GlobalError::GetBubbleViewIcon() {
// If you change this make sure to also change the menu icon and the wrench // If you change this make sure to also change the menu icon and the wrench
// icon color. // icon color.
return IDR_INPUT_ALERT; return ResourceBundle::GetSharedInstance().GetNativeImageNamed(
IDR_INPUT_ALERT);
} }
void GlobalError::BubbleViewDidClose(Browser* browser) { void GlobalError::BubbleViewDidClose(Browser* browser) {
......
...@@ -14,6 +14,10 @@ ...@@ -14,6 +14,10 @@
class Browser; class Browser;
class GlobalErrorBubbleViewBase; class GlobalErrorBubbleViewBase;
namespace gfx {
class Image;
}
// This object describes a single global error. // This object describes a single global error.
class GlobalError : public base::SupportsWeakPtr<GlobalError> { class GlobalError : public base::SupportsWeakPtr<GlobalError> {
public: public:
...@@ -50,8 +54,8 @@ class GlobalError : public base::SupportsWeakPtr<GlobalError> { ...@@ -50,8 +54,8 @@ class GlobalError : public base::SupportsWeakPtr<GlobalError> {
void ShowBubbleView(Browser* browser); void ShowBubbleView(Browser* browser);
// Returns the bubble view. // Returns the bubble view.
virtual GlobalErrorBubbleViewBase* GetBubbleView(); virtual GlobalErrorBubbleViewBase* GetBubbleView();
// Returns the resource ID for bubble view icon. // Returns an icon to use for the bubble view.
int GetBubbleViewIconResourceID(); virtual gfx::Image GetBubbleViewIcon();
// Returns the title for the bubble view. // Returns the title for the bubble view.
virtual string16 GetBubbleViewTitle() = 0; virtual string16 GetBubbleViewTitle() = 0;
// Returns the messages for the bubble view, one per line. Multiple messages // Returns the messages for the bubble view, one per line. Multiple messages
......
...@@ -17,7 +17,6 @@ ...@@ -17,7 +17,6 @@
#include "chrome/browser/ui/gtk/gtk_theme_service.h" #include "chrome/browser/ui/gtk/gtk_theme_service.h"
#include "chrome/browser/ui/gtk/gtk_util.h" #include "chrome/browser/ui/gtk/gtk_util.h"
#include "ui/base/gtk/gtk_hig_constants.h" #include "ui/base/gtk/gtk_hig_constants.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/gfx/gtk_util.h" #include "ui/gfx/gtk_util.h"
#include "ui/gfx/image/image.h" #include "ui/gfx/image/image.h"
...@@ -48,9 +47,9 @@ GlobalErrorBubble::GlobalErrorBubble(Browser* browser, ...@@ -48,9 +47,9 @@ GlobalErrorBubble::GlobalErrorBubble(Browser* browser,
GtkThemeService* theme_service = GtkThemeService* theme_service =
GtkThemeService::GetFrom(browser_->profile()); GtkThemeService::GetFrom(browser_->profile());
int resource_id = error_->GetBubbleViewIconResourceID(); gfx::Image image = error_->GetBubbleViewIcon();
ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); CHECK(!image.IsEmpty());
GdkPixbuf* pixbuf = rb.GetNativeImageNamed(resource_id).ToGdkPixbuf(); GdkPixbuf* pixbuf = image.ToGdkPixbuf();
GtkWidget* image_view = gtk_image_new_from_pixbuf(pixbuf); GtkWidget* image_view = gtk_image_new_from_pixbuf(pixbuf);
GtkWidget* title_label = theme_service->BuildLabel( GtkWidget* title_label = theme_service->BuildLabel(
......
...@@ -70,9 +70,10 @@ GlobalErrorBubbleView::GlobalErrorBubbleView( ...@@ -70,9 +70,10 @@ GlobalErrorBubbleView::GlobalErrorBubbleView(
gfx::Insets(kAnchorVerticalInset, 0, kAnchorVerticalInset, 0)); gfx::Insets(kAnchorVerticalInset, 0, kAnchorVerticalInset, 0));
ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
int resource_id = error_->GetBubbleViewIconResourceID(); gfx::Image image = error_->GetBubbleViewIcon();
CHECK(!image.IsEmpty());
scoped_ptr<views::ImageView> image_view(new views::ImageView()); scoped_ptr<views::ImageView> image_view(new views::ImageView());
image_view->SetImage(rb.GetImageNamed(resource_id).ToImageSkia()); image_view->SetImage(image.ToImageSkia());
string16 title_string(error_->GetBubbleViewTitle()); string16 title_string(error_->GetBubbleViewTitle());
scoped_ptr<views::Label> title_label(new views::Label(title_string)); scoped_ptr<views::Label> title_label(new views::Label(title_string));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment