Index: extensions/browser/extension_icon_image.cc |
diff --git a/extensions/browser/extension_icon_image.cc b/extensions/browser/extension_icon_image.cc |
index 5ebc40017920f6190631bb21baf4fb5030308d28..31ddd615c18a9e06fdb5739fc0e915a3e4ac9dd3 100644 |
--- a/extensions/browser/extension_icon_image.cc |
+++ b/extensions/browser/extension_icon_image.cc |
@@ -11,6 +11,7 @@ |
#include "extensions/browser/image_loader.h" |
#include "extensions/browser/notification_types.h" |
#include "extensions/common/extension.h" |
+#include "ui/base/layout.h" |
#include "ui/gfx/canvas.h" |
#include "ui/gfx/geometry/size.h" |
#include "ui/gfx/geometry/size_conversions.h" |
@@ -223,7 +224,21 @@ void IconImage::OnImageLoaded(float scale, const gfx::Image& image_in) { |
DCHECK(!rep.is_null()); |
DCHECK_EQ(scale, rep.scale()); |
- // Remove old representation if there is one. |
+ // Remove fractional scale image representations as they may have become |
+ // stale here. These images are generated by ImageSkia on request from |
+ // supported scales like 1x, 2x, etc. |
+ // TODO(oshima) |
+ // A better approach might be to set the |image_| member using the ImageSkia |
+ // copy from the image passed in and set the |image_skia_| member using |
+ // image_.ToImageSkia(). However that does not work correctly as the |
+ // ImageSkia from the image does not contain a source which breaks requests |
+ // for scaled images. |
+ std::vector<gfx::ImageSkiaRep> reps = image_skia_.image_reps(); |
+ for (const auto rep : reps) { |
+ if (!ui::IsSupportedScale(rep.scale())) |
+ image_skia_.RemoveRepresentation(rep.scale()); |
+ } |
+ |
image_skia_.RemoveRepresentation(scale); |
image_skia_.AddRepresentation(rep); |