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

Unified Diff: chrome/browser/ui/webui/extensions/extension_icon_source.cc

Issue 26161002: Refactored loading of applications / extensions icons. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added TODO and comments. Created 7 years, 2 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/webui/extensions/extension_icon_source.cc
diff --git a/chrome/browser/ui/webui/extensions/extension_icon_source.cc b/chrome/browser/ui/webui/extensions/extension_icon_source.cc
index 22dcf451fe4ee374f1deac33142481526fa83d0f..6d8abd4d78deadfe6c4c1955e6069a9831b06828 100644
--- a/chrome/browser/ui/webui/extensions/extension_icon_source.cc
+++ b/chrome/browser/ui/webui/extensions/extension_icon_source.cc
@@ -39,28 +39,6 @@
namespace extensions {
-namespace {
-
-scoped_refptr<base::RefCountedMemory> BitmapToMemory(const SkBitmap* image) {
- base::RefCountedBytes* image_bytes = new base::RefCountedBytes;
- gfx::PNGCodec::EncodeBGRASkBitmap(*image, false, &image_bytes->data());
- return image_bytes;
-}
-
-SkBitmap DesaturateImage(const SkBitmap* image) {
- color_utils::HSL shift = {-1, 0, 0.6};
- return SkBitmapOperations::CreateHSLShiftedBitmap(*image, shift);
-}
-
-SkBitmap* ToBitmap(const unsigned char* data, size_t size) {
- SkBitmap* decoded = new SkBitmap();
- bool success = gfx::PNGCodec::Decode(data, size, decoded);
- DCHECK(success);
- return decoded;
-}
-
-} // namespace
-
ExtensionIconSource::ExtensionIconSource(Profile* profile) : profile_(profile) {
}
@@ -93,18 +71,6 @@ GURL ExtensionIconSource::GetIconURL(const Extension* extension,
return icon_url;
}
-// static
-SkBitmap* ExtensionIconSource::LoadImageByResourceId(int resource_id) {
- std::string contents = ResourceBundle::GetSharedInstance()
- .GetRawDataResourceForScale(resource_id,
- ui::SCALE_FACTOR_100P).as_string();
-
- // Convert and return it.
- const unsigned char* data =
- reinterpret_cast<const unsigned char*>(contents.data());
- return ToBitmap(data, contents.length());
-}
-
std::string ExtensionIconSource::GetSource() const {
return chrome::kChromeUIExtensionIconHost;
}
@@ -124,23 +90,12 @@ void ExtensionIconSource::StartDataRequest(
// the request data available for later.
static int next_id = 0;
if (!ParseData(path, ++next_id, callback)) {
- // If the request data cannot be parsed, request parameters will not be
- // added to |request_map_|.
- // Send back the default application icon (not resized or desaturated) as
- // the default response.
- callback.Run(BitmapToMemory(GetDefaultAppImage()).get());
- return;
+ // If the request data cannot be parsed, we will request anyway a default
+ // icon (not resized or desaturated).
+ SetData(next_id, callback, NULL, false, -1, ExtensionIconSet::MATCH_BIGGER);
}
- ExtensionIconRequest* request = GetData(next_id);
- ExtensionResource icon = IconsInfo::GetIconResource(
- request->extension, request->size, request->match);
-
- if (icon.relative_path().empty()) {
- LoadIconFailed(next_id);
- } else {
- LoadExtensionImage(icon, next_id);
- }
+ LoadExtensionImage(next_id);
}
ExtensionIconSource::~ExtensionIconSource() {
@@ -148,125 +103,21 @@ ExtensionIconSource::~ExtensionIconSource() {
STLDeleteValues(&request_map_);
}
-const SkBitmap* ExtensionIconSource::GetDefaultAppImage() {
- if (!default_app_data_.get())
- default_app_data_.reset(LoadImageByResourceId(IDR_APP_DEFAULT_ICON));
-
- return default_app_data_.get();
-}
-
-const SkBitmap* ExtensionIconSource::GetDefaultExtensionImage() {
- if (!default_extension_data_.get()) {
- default_extension_data_.reset(
- LoadImageByResourceId(IDR_EXTENSION_DEFAULT_ICON));
- }
-
- return default_extension_data_.get();
-}
-
-void ExtensionIconSource::FinalizeImage(const SkBitmap* image,
- int request_id) {
- SkBitmap bitmap;
- ExtensionIconRequest* request = GetData(request_id);
- if (request->grayscale)
- bitmap = DesaturateImage(image);
- else
- bitmap = *image;
-
- request->callback.Run(BitmapToMemory(&bitmap).get());
- ClearData(request_id);
-}
-
-void ExtensionIconSource::LoadDefaultImage(int request_id) {
- ExtensionIconRequest* request = GetData(request_id);
- const SkBitmap* default_image = NULL;
-
- if (request->extension->is_app())
- default_image = GetDefaultAppImage();
- else
- default_image = GetDefaultExtensionImage();
-
- SkBitmap resized_image(skia::ImageOperations::Resize(
- *default_image, skia::ImageOperations::RESIZE_LANCZOS3,
- request->size, request->size));
-
- // There are cases where Resize returns an empty bitmap, for example if you
- // ask for an image too large. In this case it is better to return the default
- // image than returning nothing at all.
- if (resized_image.empty())
- resized_image = *default_image;
-
- FinalizeImage(&resized_image, request_id);
-}
-
-void ExtensionIconSource::LoadExtensionImage(const ExtensionResource& icon,
- int request_id) {
- ExtensionIconRequest* request = GetData(request_id);
- ImageLoader::Get(profile_)->LoadImageAsync(
- request->extension, icon,
- gfx::Size(request->size, request->size),
- base::Bind(&ExtensionIconSource::OnImageLoaded, AsWeakPtr(), request_id));
-}
-
-void ExtensionIconSource::LoadFaviconImage(int request_id) {
- FaviconService* favicon_service =
- FaviconServiceFactory::GetForProfile(profile_, Profile::EXPLICIT_ACCESS);
- // Fall back to the default icons if the service isn't available.
- if (favicon_service == NULL) {
- LoadDefaultImage(request_id);
- return;
- }
-
- GURL favicon_url =
- AppLaunchInfo::GetFullLaunchURL(GetData(request_id)->extension);
- favicon_service->GetRawFaviconForURL(
- FaviconService::FaviconForURLParams(
- profile_, favicon_url, chrome::FAVICON, gfx::kFaviconSize),
- ui::SCALE_FACTOR_100P,
- base::Bind(&ExtensionIconSource::OnFaviconDataAvailable,
- base::Unretained(this), request_id),
- &cancelable_task_tracker_);
-}
-
-void ExtensionIconSource::OnFaviconDataAvailable(
- int request_id,
- const chrome::FaviconBitmapResult& bitmap_result) {
+void ExtensionIconSource::LoadExtensionImage(int request_id) {
ExtensionIconRequest* request = GetData(request_id);
-
- // Fallback to the default icon if there wasn't a favicon.
- if (!bitmap_result.is_valid()) {
- LoadDefaultImage(request_id);
- return;
- }
-
- if (!request->grayscale) {
- // If we don't need a grayscale image, then we can bypass FinalizeImage
- // to avoid unnecessary conversions.
- request->callback.Run(bitmap_result.bitmap_data.get());
- ClearData(request_id);
- } else {
- FinalizeImage(ToBitmap(bitmap_result.bitmap_data->front(),
- bitmap_result.bitmap_data->size()), request_id);
- }
-}
-
-void ExtensionIconSource::OnImageLoaded(int request_id,
- const gfx::Image& image) {
- if (image.IsEmpty())
- LoadIconFailed(request_id);
- else
- FinalizeImage(image.ToSkBitmap(), request_id);
+ ImageLoader::Get(profile_)->LoadExtensionIconAsync(
+ request->extension,
+ request->size,
+ request->match,
+ request->grayscale,
+ base::Bind(&ExtensionIconSource::OnIconLoaded, AsWeakPtr(), request_id));
}
-void ExtensionIconSource::LoadIconFailed(int request_id) {
+void ExtensionIconSource::OnIconLoaded(int request_id, const gfx::Image& image)
+{
ExtensionIconRequest* request = GetData(request_id);
- ExtensionResource icon = IconsInfo::GetIconResource(
- request->extension, request->size, request->match);
-
- if (request->size == extension_misc::EXTENSION_ICON_BITTY)
- LoadFaviconImage(request_id);
- else
- LoadDefaultImage(request_id);
+ request->callback.Run(ImageLoader::BitmapToMemory(image.ToSkBitmap()).get());
+ ClearData(request_id);
}
bool ExtensionIconSource::ParseData(

Powered by Google App Engine
This is Rietveld 408576698