Index: chrome/common/extensions/extension.cc |
=================================================================== |
--- chrome/common/extensions/extension.cc (revision 50770) |
+++ chrome/common/extensions/extension.cc (working copy) |
@@ -760,11 +760,11 @@ |
#elif defined(OS_WIN) |
FilePath relative_file_path(UTF8ToWide(relative_path)); |
#endif |
- return ExtensionResource(path(), relative_file_path); |
+ return ExtensionResource(id(), path(), relative_file_path); |
} |
ExtensionResource Extension::GetResource(const FilePath& relative_file_path) { |
- return ExtensionResource(path(), relative_file_path); |
+ return ExtensionResource(id(), path(), relative_file_path); |
} |
// TODO(rafaelw): Move ParsePEMKeyBytes, ProducePEM & FormatPEMForOutput to a |
@@ -1584,28 +1584,63 @@ |
NotificationService::NoDetails()); |
} |
+static std::string SizeToString(const gfx::Size& max_size) { |
+ return IntToString(max_size.width()) + "x" + IntToString(max_size.height()); |
+} |
+ |
void Extension::SetCachedImage(const ExtensionResource& source, |
- const SkBitmap& image) { |
+ const SkBitmap& image, |
+ const gfx::Size& original_size) { |
DCHECK(source.extension_root() == path()); // The resource must come from |
// this extension. |
- image_cache_[source.relative_path()] = image; |
+ const FilePath& path = source.relative_path(); |
+ gfx::Size actual_size(image.width(), image.height()); |
+ if (actual_size == original_size) { |
+ image_cache_[ImageCacheKey(path, std::string())] = image; |
+ } else { |
+ image_cache_[ImageCacheKey(path, SizeToString(actual_size))] = image; |
+ } |
} |
-bool Extension::HasCachedImage(const ExtensionResource& source) { |
+bool Extension::HasCachedImage(const ExtensionResource& source, |
+ const gfx::Size& max_size) { |
DCHECK(source.extension_root() == path()); // The resource must come from |
// this extension. |
- return image_cache_.find(source.relative_path()) != image_cache_.end(); |
+ return GetCachedImageImpl(source, max_size) != NULL; |
} |
-SkBitmap Extension::GetCachedImage(const ExtensionResource& source) { |
+SkBitmap Extension::GetCachedImage(const ExtensionResource& source, |
+ const gfx::Size& max_size) { |
DCHECK(source.extension_root() == path()); // The resource must come from |
// this extension. |
- ImageCache::iterator i = image_cache_.find(source.relative_path()); |
- if (i == image_cache_.end()) |
- return SkBitmap(); |
- return i->second; |
+ SkBitmap* image = GetCachedImageImpl(source, max_size); |
+ return image ? *image : SkBitmap(); |
} |
+SkBitmap* Extension::GetCachedImageImpl(const ExtensionResource& source, |
+ const gfx::Size& max_size) { |
+ const FilePath& path = source.relative_path(); |
+ |
+ // Look for exact size match. |
+ ImageCache::iterator i = image_cache_.find( |
+ ImageCacheKey(path, SizeToString(max_size))); |
+ if (i != image_cache_.end()) |
+ return &(i->second); |
+ |
+ // If we have the original size version cached, return that if it's small |
+ // enough. |
+ i = image_cache_.find(ImageCacheKey(path, std::string())); |
+ if (i != image_cache_.end()) { |
+ SkBitmap& image = i->second; |
+ if (image.width() <= max_size.width() && |
+ image.height() <= max_size.height()) |
+ return &(i->second); |
+ } |
+ |
+ return NULL; |
+} |
+ |
+ |
ExtensionResource Extension::GetIconPath(Icons icon) { |
std::map<int, std::string>::const_iterator iter = icons_.find(icon); |
if (iter == icons_.end()) |