| Index: chrome/browser/extensions/extension_icon_image.cc
|
| diff --git a/chrome/browser/extensions/extension_icon_image.cc b/chrome/browser/extensions/extension_icon_image.cc
|
| deleted file mode 100644
|
| index 595a11ff980a07608c8dac3ad6710d93578195de..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/extensions/extension_icon_image.cc
|
| +++ /dev/null
|
| @@ -1,239 +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/extension_icon_image.h"
|
| -
|
| -#include <vector>
|
| -
|
| -#include "base/bind.h"
|
| -#include "chrome/browser/chrome_notification_types.h"
|
| -#include "chrome/browser/extensions/image_loader.h"
|
| -#include "content/public/browser/notification_service.h"
|
| -#include "extensions/common/extension.h"
|
| -#include "ui/gfx/canvas.h"
|
| -#include "ui/gfx/image/canvas_image_source.h"
|
| -#include "ui/gfx/image/image.h"
|
| -#include "ui/gfx/image/image_skia_operations.h"
|
| -#include "ui/gfx/image/image_skia_source.h"
|
| -#include "ui/gfx/size.h"
|
| -#include "ui/gfx/size_conversions.h"
|
| -
|
| -// The ImageSkia provided by extensions::IconImage contains ImageSkiaReps that
|
| -// are computed and updated using the following algorithm (if no default icon
|
| -// was supplied, transparent icon is considered the default):
|
| -// - |LoadImageForScaleFactors()| searches the extension for an icon of an
|
| -// appropriate size. If the extension doesn't have a icon resource needed for
|
| -// the image representation, the default icon's representation for the
|
| -// requested scale factor is returned by ImageSkiaSource.
|
| -// - If the extension has the resource, IconImage tries to load it using
|
| -// ImageLoader.
|
| -// - |ImageLoader| is asynchronous.
|
| -// - ImageSkiaSource will initially return transparent image resource of the
|
| -// desired size.
|
| -// - The image will be updated with an appropriate image representation when
|
| -// the |ImageLoader| finishes. The image representation is chosen the same
|
| -// way as in the synchronous case. The observer is notified of the image
|
| -// change, unless the added image representation is transparent (in which
|
| -// case the image had already contained the appropriate image
|
| -// representation).
|
| -
|
| -namespace {
|
| -
|
| -const int kMatchBiggerTreshold = 32;
|
| -
|
| -extensions::ExtensionResource GetExtensionIconResource(
|
| - const extensions::Extension* extension,
|
| - const ExtensionIconSet& icons,
|
| - int size,
|
| - ExtensionIconSet::MatchType match_type) {
|
| - std::string path = icons.Get(size, match_type);
|
| - if (path.empty())
|
| - return extensions::ExtensionResource();
|
| -
|
| - return extension->GetResource(path);
|
| -}
|
| -
|
| -class BlankImageSource : public gfx::CanvasImageSource {
|
| - public:
|
| - explicit BlankImageSource(const gfx::Size& size_in_dip)
|
| - : CanvasImageSource(size_in_dip, /*is_opaque =*/ false) {
|
| - }
|
| - virtual ~BlankImageSource() {}
|
| -
|
| - private:
|
| - // gfx::CanvasImageSource overrides:
|
| - virtual void Draw(gfx::Canvas* canvas) OVERRIDE {
|
| - canvas->DrawColor(SkColorSetARGB(0, 0, 0, 0));
|
| - }
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(BlankImageSource);
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -namespace extensions {
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// IconImage::Source
|
| -
|
| -class IconImage::Source : public gfx::ImageSkiaSource {
|
| - public:
|
| - Source(IconImage* host, const gfx::Size& size_in_dip);
|
| - virtual ~Source();
|
| -
|
| - void ResetHost();
|
| -
|
| - private:
|
| - // gfx::ImageSkiaSource overrides:
|
| - virtual gfx::ImageSkiaRep GetImageForScale(float scale) OVERRIDE;
|
| -
|
| - // Used to load images, possibly asynchronously. NULLed out when the IconImage
|
| - // is destroyed.
|
| - IconImage* host_;
|
| -
|
| - // Image whose representations will be used until |host_| loads the real
|
| - // representations for the image.
|
| - gfx::ImageSkia blank_image_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(Source);
|
| -};
|
| -
|
| -IconImage::Source::Source(IconImage* host, const gfx::Size& size_in_dip)
|
| - : host_(host),
|
| - blank_image_(new BlankImageSource(size_in_dip), size_in_dip) {
|
| -}
|
| -
|
| -IconImage::Source::~Source() {
|
| -}
|
| -
|
| -void IconImage::Source::ResetHost() {
|
| - host_ = NULL;
|
| -}
|
| -
|
| -gfx::ImageSkiaRep IconImage::Source::GetImageForScale(float scale) {
|
| - gfx::ImageSkiaRep representation;
|
| - if (host_) {
|
| - representation =
|
| - host_->LoadImageForScaleFactor(ui::GetSupportedScaleFactor(scale));
|
| - }
|
| -
|
| - if (!representation.is_null())
|
| - return representation;
|
| -
|
| - return blank_image_.GetRepresentation(scale);
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// IconImage
|
| -
|
| -IconImage::IconImage(
|
| - content::BrowserContext* context,
|
| - const Extension* extension,
|
| - const ExtensionIconSet& icon_set,
|
| - int resource_size_in_dip,
|
| - const gfx::ImageSkia& default_icon,
|
| - Observer* observer)
|
| - : browser_context_(context),
|
| - extension_(extension),
|
| - icon_set_(icon_set),
|
| - resource_size_in_dip_(resource_size_in_dip),
|
| - observer_(observer),
|
| - source_(NULL),
|
| - default_icon_(gfx::ImageSkiaOperations::CreateResizedImage(
|
| - default_icon,
|
| - skia::ImageOperations::RESIZE_BEST,
|
| - gfx::Size(resource_size_in_dip, resource_size_in_dip))),
|
| - weak_ptr_factory_(this) {
|
| - gfx::Size resource_size(resource_size_in_dip, resource_size_in_dip);
|
| - source_ = new Source(this, resource_size);
|
| - image_skia_ = gfx::ImageSkia(source_, resource_size);
|
| -
|
| - registrar_.Add(this,
|
| - chrome::NOTIFICATION_EXTENSION_REMOVED,
|
| - content::NotificationService::AllSources());
|
| -}
|
| -
|
| -IconImage::~IconImage() {
|
| - source_->ResetHost();
|
| -}
|
| -
|
| -gfx::ImageSkiaRep IconImage::LoadImageForScaleFactor(
|
| - ui::ScaleFactor scale_factor) {
|
| - // Do nothing if extension is unloaded.
|
| - if (!extension_)
|
| - return gfx::ImageSkiaRep();
|
| -
|
| - const float scale = ui::GetScaleForScaleFactor(scale_factor);
|
| - const int resource_size_in_pixel =
|
| - static_cast<int>(resource_size_in_dip_ * scale);
|
| -
|
| - extensions::ExtensionResource resource;
|
| -
|
| - // Find extension resource for non bundled component extensions.
|
| - // We try loading bigger image only if resource size is >= 32.
|
| - if (resource_size_in_pixel >= kMatchBiggerTreshold) {
|
| - resource = GetExtensionIconResource(extension_, icon_set_,
|
| - resource_size_in_pixel, ExtensionIconSet::MATCH_BIGGER);
|
| - }
|
| -
|
| - // If resource is not found by now, try matching smaller one.
|
| - if (resource.empty()) {
|
| - resource = GetExtensionIconResource(extension_, icon_set_,
|
| - resource_size_in_pixel, ExtensionIconSet::MATCH_SMALLER);
|
| - }
|
| -
|
| - // If there is no resource found, return default icon.
|
| - if (resource.empty())
|
| - return default_icon_.GetRepresentation(scale);
|
| -
|
| - std::vector<ImageLoader::ImageRepresentation> info_list;
|
| - info_list.push_back(ImageLoader::ImageRepresentation(
|
| - resource,
|
| - ImageLoader::ImageRepresentation::ALWAYS_RESIZE,
|
| - gfx::ToFlooredSize(gfx::ScaleSize(
|
| - gfx::Size(resource_size_in_dip_, resource_size_in_dip_), scale)),
|
| - scale_factor));
|
| -
|
| - extensions::ImageLoader* loader =
|
| - extensions::ImageLoader::Get(browser_context_);
|
| - loader->LoadImagesAsync(extension_, info_list,
|
| - base::Bind(&IconImage::OnImageLoaded,
|
| - weak_ptr_factory_.GetWeakPtr(),
|
| - scale));
|
| -
|
| - return gfx::ImageSkiaRep();
|
| -}
|
| -
|
| -void IconImage::OnImageLoaded(float scale, const gfx::Image& image_in) {
|
| - const gfx::ImageSkia* image =
|
| - image_in.IsEmpty() ? &default_icon_ : image_in.ToImageSkia();
|
| -
|
| - // Maybe default icon was not set.
|
| - if (image->isNull())
|
| - return;
|
| -
|
| - gfx::ImageSkiaRep rep = image->GetRepresentation(scale);
|
| - DCHECK(!rep.is_null());
|
| - DCHECK_EQ(scale, rep.scale());
|
| -
|
| - // Remove old representation if there is one.
|
| - image_skia_.RemoveRepresentation(scale);
|
| - image_skia_.AddRepresentation(rep);
|
| -
|
| - if (observer_)
|
| - observer_->OnExtensionIconImageChanged(this);
|
| -}
|
| -
|
| -void IconImage::Observe(int type,
|
| - const content::NotificationSource& source,
|
| - const content::NotificationDetails& details) {
|
| - DCHECK_EQ(type, chrome::NOTIFICATION_EXTENSION_REMOVED);
|
| -
|
| - const Extension* extension = content::Details<const Extension>(details).ptr();
|
| -
|
| - if (extension_ == extension)
|
| - extension_ = NULL;
|
| -}
|
| -
|
| -} // namespace extensions
|
|
|