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

Unified Diff: chrome/browser/extensions/image_loader.cc

Issue 334053003: Moves extension_icon_image and image_loader to extensions/browser (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: include fail Created 6 years, 6 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
« no previous file with comments | « chrome/browser/extensions/image_loader.h ('k') | chrome/browser/extensions/image_loader_factory.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « chrome/browser/extensions/image_loader.h ('k') | chrome/browser/extensions/image_loader_factory.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698