Index: chrome/browser/extensions/image_loader.cc |
diff --git a/chrome/browser/extensions/image_loader.cc b/chrome/browser/extensions/image_loader.cc |
deleted file mode 100644 |
index 7c76c4dcded06086a2fd1b7d0165f7140967a174..0000000000000000000000000000000000000000 |
--- a/chrome/browser/extensions/image_loader.cc |
+++ /dev/null |
@@ -1,424 +0,0 @@ |
-// 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/image_loader.h" |
- |
-#include <map> |
-#include <vector> |
- |
-#include "base/callback.h" |
-#include "base/compiler_specific.h" |
-#include "base/file_util.h" |
-#include "base/lazy_instance.h" |
-#include "base/path_service.h" |
-#include "base/strings/string_number_conversions.h" |
-#include "base/threading/sequenced_worker_pool.h" |
-#include "chrome/browser/extensions/image_loader_factory.h" |
-#include "chrome/common/chrome_paths.h" |
-#include "content/public/browser/browser_thread.h" |
-#include "extensions/common/extension.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/image/image_family.h" |
-#include "ui/gfx/image/image_skia.h" |
- |
-#if defined(OS_CHROMEOS) |
-#include "ui/file_manager/file_manager_resource_util.h" |
-#endif |
- |
-#if defined(USE_AURA) |
-#include "ui/keyboard/keyboard_util.h" |
-#endif |
- |
-using content::BrowserThread; |
-using extensions::Extension; |
-using extensions::ImageLoader; |
-using extensions::Manifest; |
- |
-namespace { |
- |
-bool ShouldResizeImageRepresentation( |
- ImageLoader::ImageRepresentation::ResizeCondition resize_method, |
- const gfx::Size& decoded_size, |
- const gfx::Size& desired_size) { |
- switch (resize_method) { |
- case ImageLoader::ImageRepresentation::ALWAYS_RESIZE: |
- return decoded_size != desired_size; |
- case ImageLoader::ImageRepresentation::RESIZE_WHEN_LARGER: |
- return decoded_size.width() > desired_size.width() || |
- decoded_size.height() > desired_size.height(); |
- case ImageLoader::ImageRepresentation::NEVER_RESIZE: |
- return false; |
- default: |
- NOTREACHED(); |
- return false; |
- } |
-} |
- |
-SkBitmap ResizeIfNeeded(const SkBitmap& bitmap, |
- const ImageLoader::ImageRepresentation& image_info) { |
- gfx::Size original_size(bitmap.width(), bitmap.height()); |
- if (ShouldResizeImageRepresentation(image_info.resize_condition, |
- original_size, |
- image_info.desired_size)) { |
- return skia::ImageOperations::Resize( |
- bitmap, skia::ImageOperations::RESIZE_LANCZOS3, |
- image_info.desired_size.width(), image_info.desired_size.height()); |
- } |
- |
- return bitmap; |
-} |
- |
-void LoadResourceOnUIThread(int resource_id, SkBitmap* bitmap) { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- |
- gfx::ImageSkia image( |
- *ResourceBundle::GetSharedInstance().GetImageSkiaNamed(resource_id)); |
- image.MakeThreadSafe(); |
- *bitmap = *image.bitmap(); |
-} |
- |
-void LoadImageOnBlockingPool(const ImageLoader::ImageRepresentation& image_info, |
- SkBitmap* bitmap) { |
- DCHECK(BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread()); |
- |
- // Read the file from disk. |
- std::string file_contents; |
- base::FilePath path = image_info.resource.GetFilePath(); |
- if (path.empty() || !base::ReadFileToString(path, &file_contents)) { |
- return; |
- } |
- |
- const unsigned char* data = |
- reinterpret_cast<const unsigned char*>(file_contents.data()); |
- // Note: This class only decodes bitmaps from extension resources. Chrome |
- // doesn't (for security reasons) directly load extension resources provided |
- // by the extension author, but instead decodes them in a separate |
- // locked-down utility process. Only if the decoding succeeds is the image |
- // saved from memory to disk and subsequently used in the Chrome UI. |
- // Chrome is therefore decoding bitmaps here that were generated by Chrome. |
- gfx::PNGCodec::Decode(data, file_contents.length(), bitmap); |
-} |
- |
-// Add the resources from |entries| (there are |size| of them) to |
-// |path_to_resource_id| after normalizing separators. |
-void AddComponentResourceEntries( |
- std::map<base::FilePath, int>* path_to_resource_id, |
- const GritResourceMap* entries, |
- size_t size) { |
- for (size_t i = 0; i < size; ++i) { |
- base::FilePath resource_path = base::FilePath().AppendASCII( |
- entries[i].name); |
- resource_path = resource_path.NormalizePathSeparators(); |
- |
- DCHECK(path_to_resource_id->find(resource_path) == |
- path_to_resource_id->end()); |
- (*path_to_resource_id)[resource_path] = entries[i].value; |
- } |
-} |
- |
-std::vector<SkBitmap> LoadResourceBitmaps( |
- const Extension* extension, |
- const std::vector<ImageLoader::ImageRepresentation>& info_list) { |
- // Loading resources has to happen on the UI thread. So do this first, and |
- // pass the rest of the work off as a blocking pool task. |
- std::vector<SkBitmap> bitmaps; |
- bitmaps.resize(info_list.size()); |
- |
- int i = 0; |
- for (std::vector<ImageLoader::ImageRepresentation>::const_iterator |
- it = info_list.begin(); |
- it != info_list.end(); |
- ++it, ++i) { |
- DCHECK(it->resource.relative_path().empty() || |
- extension->path() == it->resource.extension_root()); |
- |
- int resource_id; |
- if (extension->location() == Manifest::COMPONENT && |
- ImageLoader::IsComponentExtensionResource( |
- extension->path(), it->resource.relative_path(), &resource_id)) { |
- LoadResourceOnUIThread(resource_id, &bitmaps[i]); |
- } |
- } |
- return bitmaps; |
-} |
- |
-} // namespace |
- |
-namespace extensions { |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// ImageLoader::ImageRepresentation |
- |
-ImageLoader::ImageRepresentation::ImageRepresentation( |
- const ExtensionResource& resource, |
- ResizeCondition resize_condition, |
- const gfx::Size& desired_size, |
- ui::ScaleFactor scale_factor) |
- : resource(resource), |
- resize_condition(resize_condition), |
- desired_size(desired_size), |
- scale_factor(scale_factor) { |
-} |
- |
-ImageLoader::ImageRepresentation::~ImageRepresentation() { |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// ImageLoader::LoadResult |
- |
-struct ImageLoader::LoadResult { |
- LoadResult(const SkBitmap& bitmap, |
- const gfx::Size& original_size, |
- const ImageRepresentation& image_representation); |
- ~LoadResult(); |
- |
- SkBitmap bitmap; |
- gfx::Size original_size; |
- ImageRepresentation image_representation; |
-}; |
- |
-ImageLoader::LoadResult::LoadResult( |
- const SkBitmap& bitmap, |
- const gfx::Size& original_size, |
- const ImageLoader::ImageRepresentation& image_representation) |
- : bitmap(bitmap), |
- original_size(original_size), |
- image_representation(image_representation) { |
-} |
- |
-ImageLoader::LoadResult::~LoadResult() { |
-} |
- |
-namespace { |
- |
-// Need to be after ImageRepresentation and LoadResult are defined. |
-std::vector<ImageLoader::LoadResult> LoadImagesOnBlockingPool( |
- const std::vector<ImageLoader::ImageRepresentation>& info_list, |
- const std::vector<SkBitmap>& bitmaps) { |
- DCHECK(BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread()); |
- std::vector<ImageLoader::LoadResult> load_result; |
- |
- for (size_t i = 0; i < info_list.size(); ++i) { |
- const ImageLoader::ImageRepresentation& image = info_list[i]; |
- |
- // If we don't have a path there isn't anything we can do, just skip it. |
- if (image.resource.relative_path().empty()) |
- continue; |
- |
- SkBitmap bitmap; |
- if (bitmaps[i].isNull()) |
- LoadImageOnBlockingPool(image, &bitmap); |
- else |
- bitmap = bitmaps[i]; |
- |
- // If the image failed to load, skip it. |
- if (bitmap.isNull() || bitmap.empty()) |
- continue; |
- |
- gfx::Size original_size(bitmap.width(), bitmap.height()); |
- bitmap = ResizeIfNeeded(bitmap, image); |
- |
- load_result.push_back( |
- ImageLoader::LoadResult(bitmap, original_size, image)); |
- } |
- |
- return load_result; |
-} |
- |
-} // namespace |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// ImageLoader |
- |
-ImageLoader::ImageLoader() |
- : weak_ptr_factory_(this) { |
-} |
- |
-ImageLoader::~ImageLoader() { |
-} |
- |
-// static |
-ImageLoader* ImageLoader::Get(content::BrowserContext* context) { |
- return ImageLoaderFactory::GetForBrowserContext(context); |
-} |
- |
-// A map from a resource path to the resource ID. Used only by |
-// IsComponentExtensionResource below. |
-static base::LazyInstance<std::map<base::FilePath, int> > path_to_resource_id = |
- LAZY_INSTANCE_INITIALIZER; |
- |
-// static |
-bool ImageLoader::IsComponentExtensionResource( |
- const base::FilePath& extension_path, |
- const base::FilePath& resource_path, |
- int* resource_id) { |
- static const GritResourceMap kExtraComponentExtensionResources[] = { |
- {"web_store/webstore_icon_128.png", IDR_WEBSTORE_ICON}, |
- {"web_store/webstore_icon_16.png", IDR_WEBSTORE_ICON_16}, |
- {"chrome_app/product_logo_128.png", IDR_PRODUCT_LOGO_128}, |
- {"chrome_app/product_logo_16.png", IDR_PRODUCT_LOGO_16}, |
-#if defined(ENABLE_SETTINGS_APP) |
- {"settings_app/settings_app_icon_128.png", IDR_SETTINGS_APP_ICON_128}, |
- {"settings_app/settings_app_icon_16.png", IDR_SETTINGS_APP_ICON_16}, |
- {"settings_app/settings_app_icon_32.png", IDR_SETTINGS_APP_ICON_32}, |
- {"settings_app/settings_app_icon_48.png", IDR_SETTINGS_APP_ICON_48}, |
-#endif |
- }; |
- |
- if (path_to_resource_id.Get().empty()) { |
- AddComponentResourceEntries( |
- path_to_resource_id.Pointer(), |
- kComponentExtensionResources, |
- kComponentExtensionResourcesSize); |
- AddComponentResourceEntries( |
- path_to_resource_id.Pointer(), |
- kExtraComponentExtensionResources, |
- arraysize(kExtraComponentExtensionResources)); |
-#if defined(OS_CHROMEOS) |
- size_t file_manager_resource_size; |
- const GritResourceMap* file_manager_resources = |
- file_manager::GetFileManagerResources(&file_manager_resource_size); |
- AddComponentResourceEntries( |
- path_to_resource_id.Pointer(), |
- file_manager_resources, |
- file_manager_resource_size); |
- |
- size_t keyboard_resource_size; |
- const GritResourceMap* keyboard_resources = |
- keyboard::GetKeyboardExtensionResources(&keyboard_resource_size); |
- AddComponentResourceEntries( |
- path_to_resource_id.Pointer(), |
- keyboard_resources, |
- keyboard_resource_size); |
-#endif |
- } |
- |
- base::FilePath directory_path = extension_path; |
- base::FilePath resources_dir; |
- base::FilePath relative_path; |
- if (!PathService::Get(chrome::DIR_RESOURCES, &resources_dir) || |
- !resources_dir.AppendRelativePath(directory_path, &relative_path)) { |
- return false; |
- } |
- relative_path = relative_path.Append(resource_path); |
- relative_path = relative_path.NormalizePathSeparators(); |
- |
- std::map<base::FilePath, int>::const_iterator entry = |
- path_to_resource_id.Get().find(relative_path); |
- if (entry != path_to_resource_id.Get().end()) |
- *resource_id = entry->second; |
- |
- return entry != path_to_resource_id.Get().end(); |
-} |
- |
-void ImageLoader::LoadImageAsync(const Extension* extension, |
- const ExtensionResource& resource, |
- const gfx::Size& max_size, |
- const ImageLoaderImageCallback& callback) { |
- std::vector<ImageRepresentation> info_list; |
- info_list.push_back(ImageRepresentation( |
- resource, |
- ImageRepresentation::RESIZE_WHEN_LARGER, |
- max_size, |
- ui::SCALE_FACTOR_100P)); |
- LoadImagesAsync(extension, info_list, callback); |
-} |
- |
-void ImageLoader::LoadImagesAsync( |
- const Extension* extension, |
- const std::vector<ImageRepresentation>& info_list, |
- const ImageLoaderImageCallback& callback) { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- DCHECK(!BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread()); |
- base::PostTaskAndReplyWithResult( |
- BrowserThread::GetBlockingPool(), |
- FROM_HERE, |
- base::Bind(LoadImagesOnBlockingPool, |
- info_list, |
- LoadResourceBitmaps(extension, info_list)), |
- base::Bind( |
- &ImageLoader::ReplyBack, weak_ptr_factory_.GetWeakPtr(), callback)); |
-} |
- |
-void ImageLoader::LoadImageFamilyAsync( |
- const extensions::Extension* extension, |
- const std::vector<ImageRepresentation>& info_list, |
- const ImageLoaderImageFamilyCallback& callback) { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- DCHECK(!BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread()); |
- base::PostTaskAndReplyWithResult( |
- BrowserThread::GetBlockingPool(), |
- FROM_HERE, |
- base::Bind(LoadImagesOnBlockingPool, |
- info_list, |
- LoadResourceBitmaps(extension, info_list)), |
- base::Bind(&ImageLoader::ReplyBackWithImageFamily, |
- weak_ptr_factory_.GetWeakPtr(), |
- callback)); |
-} |
- |
-void ImageLoader::ReplyBack(const ImageLoaderImageCallback& callback, |
- const std::vector<LoadResult>& load_result) { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- |
- gfx::ImageSkia image_skia; |
- |
- for (std::vector<LoadResult>::const_iterator it = load_result.begin(); |
- it != load_result.end(); ++it) { |
- const SkBitmap& bitmap = it->bitmap; |
- const ImageRepresentation& image_rep = it->image_representation; |
- |
- image_skia.AddRepresentation(gfx::ImageSkiaRep( |
- bitmap, |
- ui::GetScaleForScaleFactor(image_rep.scale_factor))); |
- } |
- |
- gfx::Image image; |
- if (!image_skia.isNull()) { |
- image_skia.MakeThreadSafe(); |
- image = gfx::Image(image_skia); |
- } |
- |
- callback.Run(image); |
-} |
- |
-void ImageLoader::ReplyBackWithImageFamily( |
- const ImageLoaderImageFamilyCallback& callback, |
- const std::vector<LoadResult>& load_result) { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- |
- std::map<std::pair<int, int>, gfx::ImageSkia> image_skia_map; |
- gfx::ImageFamily image_family; |
- |
- for (std::vector<LoadResult>::const_iterator it = load_result.begin(); |
- it != load_result.end(); |
- ++it) { |
- const SkBitmap& bitmap = it->bitmap; |
- const ImageRepresentation& image_rep = it->image_representation; |
- const std::pair<int, int> key = std::make_pair( |
- image_rep.desired_size.width(), image_rep.desired_size.height()); |
- // Create a new ImageSkia for this width/height, or add a representation to |
- // an existing ImageSkia with the same width/height. |
- image_skia_map[key].AddRepresentation( |
- gfx::ImageSkiaRep(bitmap, |
- ui::GetScaleForScaleFactor(image_rep.scale_factor))); |
- } |
- |
- for (std::map<std::pair<int, int>, gfx::ImageSkia>::iterator it = |
- image_skia_map.begin(); |
- it != image_skia_map.end(); |
- ++it) { |
- it->second.MakeThreadSafe(); |
- image_family.Add(it->second); |
- } |
- |
- callback.Run(image_family); |
-} |
- |
-} // namespace extensions |