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 @@
#include "chrome/browser/extensions/extension_install_ui.h"
#include "chrome/browser/extensions/extension_service.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/ui/browser.h"
#include "chrome/browser/ui/global_error/global_error.h"
......@@ -26,6 +27,8 @@
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/common/chrome_notification_types.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 "content/public/browser/notification_details.h"
#include "content/public/browser/notification_observer.h"
......@@ -35,11 +38,16 @@
#include "grit/generated_resources.h"
#include "grit/theme_resources.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;
namespace {
static const int kIconSize = extension_misc::EXTENSION_ICON_SMALL;
static base::LazyInstance<
std::bitset<IDC_EXTENSION_DISABLED_LAST -
IDC_EXTENSION_DISABLED_FIRST + 1> >
......@@ -131,7 +139,8 @@ class ExtensionDisabledGlobalError : public GlobalError,
public ExtensionUninstallDialog::Delegate {
public:
ExtensionDisabledGlobalError(ExtensionService* service,
const Extension* extension);
const Extension* extension,
const gfx::Image& icon);
virtual ~ExtensionDisabledGlobalError();
// GlobalError implementation.
......@@ -141,6 +150,7 @@ class ExtensionDisabledGlobalError : public GlobalError,
virtual string16 MenuItemLabel() OVERRIDE;
virtual void ExecuteMenuItem(Browser* browser) OVERRIDE;
virtual bool HasBubbleView() OVERRIDE;
virtual gfx::Image GetBubbleViewIcon() OVERRIDE;
virtual string16 GetBubbleViewTitle() OVERRIDE;
virtual std::vector<string16> GetBubbleViewMessages() OVERRIDE;
virtual string16 GetBubbleViewAcceptButtonLabel() OVERRIDE;
......@@ -161,6 +171,7 @@ class ExtensionDisabledGlobalError : public GlobalError,
private:
ExtensionService* service_;
const Extension* extension_;
gfx::Image icon_;
// How the user responded to the error; used for metrics.
enum UserResponse {
......@@ -182,11 +193,22 @@ class ExtensionDisabledGlobalError : public GlobalError,
// TODO(yoz): create error at startup for disabled extensions.
ExtensionDisabledGlobalError::ExtensionDisabledGlobalError(
ExtensionService* service,
const Extension* extension)
const Extension* extension,
const gfx::Image& icon)
: service_(service),
extension_(extension),
icon_(icon),
user_response_(IGNORED),
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,
content::Source<Profile>(service->profile()));
registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED,
......@@ -225,6 +247,10 @@ bool ExtensionDisabledGlobalError::HasBubbleView() {
return true;
}
gfx::Image ExtensionDisabledGlobalError::GetBubbleViewIcon() {
return icon_;
}
string16 ExtensionDisabledGlobalError::GetBubbleViewTitle() {
return l10n_util::GetStringFUTF16(IDS_EXTENSION_DISABLED_ERROR_TITLE,
UTF8ToUTF16(extension_->name()));
......@@ -319,10 +345,28 @@ void ExtensionDisabledGlobalError::Observe(
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,
const Extension* extension) {
GlobalErrorServiceFactory::GetForProfile(service->profile())->
AddGlobalError(new ExtensionDisabledGlobalError(service, extension));
extensions::ExtensionResource image = extensions::IconsInfo::GetIconResource(
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,
......
......@@ -23,7 +23,6 @@
#include "grit/generated_resources.h"
#import "third_party/GTM/AppKit/GTMUILocalizerAndLayoutTweaker.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/gfx/image/image.h"
namespace {
......@@ -83,9 +82,9 @@ class Bridge : public GlobalErrorBubbleViewBase {
DCHECK(error_);
ResourceBundle& rb = ResourceBundle::GetSharedInstance();
[iconView_ setImage:rb.GetNativeImageNamed(
error_->GetBubbleViewIconResourceID()).ToNSImage()];
gfx::Image image = error_->GetBubbleViewIcon();
DCHECK(!image.IsEmpty());
[iconView_ setImage:image.ToNSImage()];
[title_ setStringValue:SysUTF16ToNSString(error_->GetBubbleViewTitle())];
std::vector<string16> messages = error_->GetBubbleViewMessages();
......
......@@ -7,6 +7,8 @@
#include "base/logging.h"
#include "chrome/browser/ui/global_error/global_error_bubble_view_base.h"
#include "grit/theme_resources.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/gfx/image/image.h"
GlobalError::GlobalError()
: has_shown_bubble_view_(false),
......@@ -45,10 +47,11 @@ GlobalErrorBubbleViewBase* GlobalError::GetBubbleView() {
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
// icon color.
return IDR_INPUT_ALERT;
return ResourceBundle::GetSharedInstance().GetNativeImageNamed(
IDR_INPUT_ALERT);
}
void GlobalError::BubbleViewDidClose(Browser* browser) {
......
......@@ -14,6 +14,10 @@
class Browser;
class GlobalErrorBubbleViewBase;
namespace gfx {
class Image;
}
// This object describes a single global error.
class GlobalError : public base::SupportsWeakPtr<GlobalError> {
public:
......@@ -50,8 +54,8 @@ class GlobalError : public base::SupportsWeakPtr<GlobalError> {
void ShowBubbleView(Browser* browser);
// Returns the bubble view.
virtual GlobalErrorBubbleViewBase* GetBubbleView();
// Returns the resource ID for bubble view icon.
int GetBubbleViewIconResourceID();
// Returns an icon to use for the bubble view.
virtual gfx::Image GetBubbleViewIcon();
// Returns the title for the bubble view.
virtual string16 GetBubbleViewTitle() = 0;
// Returns the messages for the bubble view, one per line. Multiple messages
......
......@@ -17,7 +17,6 @@
#include "chrome/browser/ui/gtk/gtk_theme_service.h"
#include "chrome/browser/ui/gtk/gtk_util.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/image/image.h"
......@@ -48,9 +47,9 @@ GlobalErrorBubble::GlobalErrorBubble(Browser* browser,
GtkThemeService* theme_service =
GtkThemeService::GetFrom(browser_->profile());
int resource_id = error_->GetBubbleViewIconResourceID();
ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
GdkPixbuf* pixbuf = rb.GetNativeImageNamed(resource_id).ToGdkPixbuf();
gfx::Image image = error_->GetBubbleViewIcon();
CHECK(!image.IsEmpty());
GdkPixbuf* pixbuf = image.ToGdkPixbuf();
GtkWidget* image_view = gtk_image_new_from_pixbuf(pixbuf);
GtkWidget* title_label = theme_service->BuildLabel(
......
......@@ -70,9 +70,10 @@ GlobalErrorBubbleView::GlobalErrorBubbleView(
gfx::Insets(kAnchorVerticalInset, 0, kAnchorVerticalInset, 0));
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());
image_view->SetImage(rb.GetImageNamed(resource_id).ToImageSkia());
image_view->SetImage(image.ToImageSkia());
string16 title_string(error_->GetBubbleViewTitle());
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