| Index: trunk/src/chrome/browser/extensions/image_loader.cc
|
| ===================================================================
|
| --- trunk/src/chrome/browser/extensions/image_loader.cc (revision 227519)
|
| +++ trunk/src/chrome/browser/extensions/image_loader.cc (working copy)
|
| @@ -7,7 +7,6 @@
|
| #include <map>
|
| #include <vector>
|
|
|
| -#include "base/base64.h"
|
| #include "base/callback.h"
|
| #include "base/compiler_specific.h"
|
| #include "base/file_util.h"
|
| @@ -16,26 +15,16 @@
|
| #include "base/strings/string_number_conversions.h"
|
| #include "base/threading/sequenced_worker_pool.h"
|
| #include "chrome/browser/extensions/image_loader_factory.h"
|
| -#include "chrome/browser/favicon/favicon_service.h"
|
| -#include "chrome/browser/favicon/favicon_service_factory.h"
|
| #include "chrome/common/chrome_paths.h"
|
| #include "chrome/common/extensions/extension.h"
|
| -#include "chrome/common/extensions/extension_icon_set.h"
|
| -#include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
|
| -#include "chrome/common/extensions/manifest_handlers/icons_handler.h"
|
| #include "content/public/browser/browser_thread.h"
|
| -#include "content/public/common/url_constants.h"
|
| #include "grit/chrome_unscaled_resources.h"
|
| #include "grit/component_extension_resources_map.h"
|
| #include "grit/theme_resources.h"
|
| #include "skia/ext/image_operations.h"
|
| #include "ui/base/resource/resource_bundle.h"
|
| #include "ui/gfx/codec/png_codec.h"
|
| -#include "ui/gfx/color_utils.h"
|
| -#include "ui/gfx/favicon_size.h"
|
| #include "ui/gfx/image/image_skia.h"
|
| -#include "ui/gfx/size.h"
|
| -#include "ui/gfx/skbitmap_operations.h"
|
|
|
| #if defined(USE_AURA)
|
| #include "ui/keyboard/keyboard_util.h"
|
| @@ -126,54 +115,6 @@
|
| }
|
| }
|
|
|
| -// Returns a PNG image data URL of a given image.
|
| -GURL GetImageDataURL(const gfx::Image& image) {
|
| - if (image.IsEmpty())
|
| - return GURL();
|
| -
|
| - scoped_refptr<base::RefCountedMemory> mem =
|
| - ImageLoader::BitmapToMemory(image.ToSkBitmap());
|
| - std::string contents_base64;
|
| - // TODO(dvh): contents_base64 calculation of the result of the function is
|
| - // sub-optimal: it's a concatenation of 3 strings and |contents_base64| can
|
| - // be huge. Additionally, the GURL is returned by copy.
|
| - // crbug/304759.
|
| - if (!base::Base64Encode(
|
| - std::string(reinterpret_cast<const char*>(mem->front()), mem->size()),
|
| - &contents_base64))
|
| - return GURL();
|
| -
|
| - const char kDataURLPrefix[] = ":image/png;base64,";
|
| - return GURL(std::string(chrome::kDataScheme) + kDataURLPrefix +
|
| - contents_base64);
|
| -}
|
| -
|
| -// Converts the image to grayscale.
|
| -SkBitmap DesaturateImage(const SkBitmap* image) {
|
| - color_utils::HSL shift = {-1, 0, 0.6};
|
| - return SkBitmapOperations::CreateHSLShiftedBitmap(*image, shift);
|
| -}
|
| -
|
| -// Creates an image from PNG data.
|
| -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;
|
| -}
|
| -
|
| -// Load an image from a resource given its identifier |resource_id|.
|
| -SkBitmap* GetImageByResourceId(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());
|
| -}
|
| -
|
| } // namespace
|
|
|
| namespace extensions {
|
| @@ -224,8 +165,8 @@
|
| ////////////////////////////////////////////////////////////////////////////////
|
| // ImageLoader
|
|
|
| -ImageLoader::ImageLoader(Profile* profile)
|
| - : weak_ptr_factory_(this), profile_(profile) {
|
| +ImageLoader::ImageLoader()
|
| + : weak_ptr_factory_(this) {
|
| }
|
|
|
| ImageLoader::~ImageLoader() {
|
| @@ -406,273 +347,4 @@
|
| callback.Run(image);
|
| }
|
|
|
| -void ImageLoader::LoadExtensionIconAsync(
|
| - const extensions::Extension* extension,
|
| - int icon_size,
|
| - ExtensionIconSet::MatchType match,
|
| - bool grayscale,
|
| - const base::Callback<void(const gfx::Image&)>& callback) {
|
| - // |extension| can be NULL when the default icon is requested. In this case,
|
| - // fail the icon loading, which will result in the default icon being loaded.
|
| - if (extension == NULL) {
|
| - LoadIconFailed(extension, icon_size, grayscale, callback);
|
| - return;
|
| - }
|
| -
|
| - ExtensionResource resource = IconsInfo::GetIconResource(
|
| - extension, icon_size, match);
|
| - LoadImageAsync(extension,
|
| - resource,
|
| - gfx::Size(icon_size, icon_size),
|
| - base::Bind(&ImageLoader::LoadExtensionIconDone,
|
| - base::Unretained(this),
|
| - extension,
|
| - icon_size,
|
| - grayscale,
|
| - callback));
|
| -}
|
| -
|
| -void ImageLoader::LoadExtensionIconDone(
|
| - const extensions::Extension* extension,
|
| - int icon_size,
|
| - bool grayscale,
|
| - const base::Callback<void(const gfx::Image&)>& callback,
|
| - const gfx::Image& image) {
|
| - if (image.IsEmpty())
|
| - LoadIconFailed(extension, icon_size, grayscale, callback);
|
| - else
|
| - FinalizeImage(image, grayscale, callback);
|
| -}
|
| -
|
| -void ImageLoader::LoadIconFailed(
|
| - const extensions::Extension* extension,
|
| - int icon_size,
|
| - bool grayscale,
|
| - const base::Callback<void(const gfx::Image&)>& callback) {
|
| - if ((extension != NULL) &&
|
| - (icon_size == extension_misc::EXTENSION_ICON_BITTY))
|
| - LoadFaviconImage(extension, icon_size, grayscale, callback);
|
| - else
|
| - LoadDefaultImage(extension, icon_size, grayscale, callback);
|
| -}
|
| -
|
| -void ImageLoader::LoadFaviconImage(
|
| - const extensions::Extension* extension,
|
| - int icon_size,
|
| - bool grayscale,
|
| - const base::Callback<void(const gfx::Image&)>& callback) {
|
| - FaviconService* favicon_service = NULL;
|
| - if (profile_ != NULL)
|
| - 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(extension, icon_size, grayscale, callback);
|
| - return;
|
| - }
|
| -
|
| - GURL favicon_url = AppLaunchInfo::GetFullLaunchURL(extension);
|
| - favicon_service->GetRawFaviconForURL(
|
| - FaviconService::FaviconForURLParams(
|
| - profile_, favicon_url, chrome::FAVICON, gfx::kFaviconSize),
|
| - ui::SCALE_FACTOR_100P,
|
| - base::Bind(&ImageLoader::OnFaviconDataAvailable,
|
| - base::Unretained(this),
|
| - extension,
|
| - icon_size,
|
| - grayscale,
|
| - callback),
|
| - &cancelable_task_tracker_);
|
| -}
|
| -
|
| -void ImageLoader::OnFaviconDataAvailable(
|
| - const extensions::Extension* extension,
|
| - int icon_size,
|
| - bool grayscale,
|
| - const base::Callback<void(const gfx::Image&)>& callback,
|
| - const chrome::FaviconBitmapResult& bitmap_result) {
|
| - // Fallback to the default icon if there wasn't a favicon.
|
| - if (!bitmap_result.is_valid()) {
|
| - LoadDefaultImage(extension, icon_size, grayscale, callback);
|
| - return;
|
| - }
|
| -
|
| - gfx::Image image = gfx::Image::CreateFrom1xBitmap(*ToBitmap(
|
| - bitmap_result.bitmap_data->front(), bitmap_result.bitmap_data->size()));
|
| - FinalizeImage(image, grayscale, callback);
|
| -}
|
| -
|
| -void ImageLoader::LoadDefaultImage(
|
| - const extensions::Extension* extension,
|
| - int icon_size,
|
| - bool grayscale,
|
| - const base::Callback<void(const gfx::Image&)>& callback) {
|
| - content::BrowserThread::PostTask(
|
| - content::BrowserThread::FILE,
|
| - FROM_HERE,
|
| - base::Bind(&ImageLoader::LoadDefaultImageOnFileThread,
|
| - base::Unretained(this),
|
| - extension,
|
| - icon_size,
|
| - grayscale,
|
| - callback));
|
| -}
|
| -
|
| -void ImageLoader::LoadDefaultImageOnFileThread(
|
| - const extensions::Extension* extension,
|
| - int icon_size,
|
| - bool grayscale,
|
| - const base::Callback<void(const gfx::Image&)>& callback) {
|
| - const SkBitmap* default_image = NULL;
|
| - if ((extension == NULL) || (extension->is_app()))
|
| - default_image = GetDefaultAppImage();
|
| - else
|
| - default_image = GetDefaultExtensionImage();
|
| -
|
| - SkBitmap result_image;
|
| - if (icon_size == -1) {
|
| - // If a specific size was not requested.
|
| - result_image = *default_image;
|
| - } else {
|
| - SkBitmap resized_image(
|
| - skia::ImageOperations::Resize(*default_image,
|
| - skia::ImageOperations::RESIZE_LANCZOS3,
|
| - icon_size,
|
| - icon_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;
|
| - result_image = resized_image;
|
| - }
|
| -
|
| - content::BrowserThread::PostTask(
|
| - content::BrowserThread::UI,
|
| - FROM_HERE,
|
| - base::Bind(&ImageLoader::LoadDefaultImageDone,
|
| - base::Unretained(this),
|
| - gfx::Image::CreateFrom1xBitmap(result_image),
|
| - grayscale,
|
| - callback));
|
| -}
|
| -
|
| -void ImageLoader::LoadDefaultImageDone(
|
| - const gfx::Image image,
|
| - bool grayscale,
|
| - const base::Callback<void(const gfx::Image&)>& callback) {
|
| - FinalizeImage(image, grayscale, callback);
|
| -}
|
| -
|
| -void ImageLoader::FinalizeImage(
|
| - const gfx::Image& image,
|
| - bool grayscale,
|
| - const base::Callback<void(const gfx::Image&)>& callback) {
|
| - content::BrowserThread::PostTask(
|
| - content::BrowserThread::FILE,
|
| - FROM_HERE,
|
| - base::Bind(&ImageLoader::FinalizeImageOnFileThread,
|
| - base::Unretained(this),
|
| - image,
|
| - grayscale,
|
| - callback));
|
| -}
|
| -
|
| -void ImageLoader::FinalizeImageOnFileThread(
|
| - const gfx::Image image,
|
| - bool grayscale,
|
| - const base::Callback<void(const gfx::Image&)>& callback) {
|
| - SkBitmap bitmap;
|
| - if (grayscale)
|
| - bitmap = DesaturateImage(image.ToSkBitmap());
|
| - else
|
| - bitmap = *image.ToSkBitmap();
|
| -
|
| - gfx::Image modifiedImage = gfx::Image::CreateFrom1xBitmap(bitmap);
|
| - content::BrowserThread::PostTask(content::BrowserThread::UI,
|
| - FROM_HERE,
|
| - base::Bind(&ImageLoader::FinalizeImageDone,
|
| - base::Unretained(this),
|
| - modifiedImage,
|
| - callback));
|
| -}
|
| -
|
| -void ImageLoader::FinalizeImageDone(
|
| - const gfx::Image image,
|
| - const base::Callback<void(const gfx::Image&)>& callback) {
|
| - callback.Run(image);
|
| -}
|
| -
|
| -void ImageLoader::LoadExtensionIconDataURLAsync(
|
| - const extensions::Extension* extension,
|
| - int icon_size,
|
| - ExtensionIconSet::MatchType match,
|
| - bool grayscale,
|
| - const base::Callback<void(const GURL&)>& callback) {
|
| - LoadExtensionIconAsync(extension,
|
| - icon_size,
|
| - match,
|
| - grayscale,
|
| - base::Bind(&ImageLoader::OnIconAvailable,
|
| - base::Unretained(this),
|
| - callback));
|
| -}
|
| -
|
| -void ImageLoader::OnIconAvailable(
|
| - const base::Callback<void(const GURL&)>& callback,
|
| - const gfx::Image& image) {
|
| - content::BrowserThread::PostTask(
|
| - content::BrowserThread::FILE,
|
| - FROM_HERE,
|
| - base::Bind(&ImageLoader::ConvertIconToURLOnFileThread,
|
| - base::Unretained(this),
|
| - image,
|
| - callback));
|
| -}
|
| -
|
| -void ImageLoader::ConvertIconToURLOnFileThread(
|
| - const gfx::Image image,
|
| - const base::Callback<void(const GURL&)>& callback) {
|
| - GURL url = GetImageDataURL(image);
|
| - // TODO(dvh): |url| can be huge and it's passed by copy to
|
| - // OnIconConvertedToURL(). It can be optimized.
|
| - // crbug/304759.
|
| - content::BrowserThread::PostTask(
|
| - content::BrowserThread::UI,
|
| - FROM_HERE,
|
| - base::Bind(&ImageLoader::OnIconConvertedToURL,
|
| - base::Unretained(this),
|
| - url,
|
| - callback));
|
| -}
|
| -
|
| -void ImageLoader::OnIconConvertedToURL(
|
| - const GURL url,
|
| - const base::Callback<void(const GURL&)>& callback) {
|
| - callback.Run(url);
|
| -}
|
| -
|
| -const SkBitmap* ImageLoader::GetDefaultAppImage() {
|
| - if (!default_app_icon_.get())
|
| - default_app_icon_.reset(GetImageByResourceId(IDR_APP_DEFAULT_ICON));
|
| -
|
| - return default_app_icon_.get();
|
| -}
|
| -
|
| -const SkBitmap* ImageLoader::GetDefaultExtensionImage() {
|
| - if (!default_extension_icon_.get()) {
|
| - default_extension_icon_.reset(
|
| - GetImageByResourceId(IDR_EXTENSION_DEFAULT_ICON));
|
| - }
|
| -
|
| - return default_extension_icon_.get();
|
| -}
|
| -
|
| -scoped_refptr<base::RefCountedMemory> ImageLoader::BitmapToMemory(
|
| - const SkBitmap* image) {
|
| - base::RefCountedBytes* image_bytes = new base::RefCountedBytes;
|
| - gfx::PNGCodec::EncodeBGRASkBitmap(*image, false, &image_bytes->data());
|
| - return image_bytes;
|
| -}
|
| -
|
| } // namespace extensions
|
|
|