| // Copyright 2012 The Chromium Authors |
| // 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_action_icon_factory.h" |
| |
| #include "base/metrics/histogram_macros.h" |
| #include "chrome/browser/extensions/extension_ui_util.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "extensions/browser/extension_action.h" |
| #include "extensions/common/extension.h" |
| #include "extensions/common/image_util.h" |
| #include "extensions/common/manifest.h" |
| #include "ui/gfx/image/image.h" |
| #include "ui/gfx/image/image_skia.h" |
| |
| using extensions::Extension; |
| using extensions::IconImage; |
| |
| namespace { |
| |
| bool g_allow_invisible_icons = true; |
| |
| } // namespace |
| |
| // static |
| void ExtensionActionIconFactory::SetAllowInvisibleIconsForTest(bool value) { |
| g_allow_invisible_icons = value; |
| } |
| |
| ExtensionActionIconFactory::ExtensionActionIconFactory( |
| Profile* profile, |
| const Extension* extension, |
| extensions::ExtensionAction* action, |
| Observer* observer) |
| : profile_(profile), |
| action_(action), |
| observer_(observer), |
| should_check_icons_(extension->location() != |
| extensions::mojom::ManifestLocation::kUnpacked) { |
| if (action->default_icon_image()) |
| icon_image_observation_.Observe(action->default_icon_image()); |
| } |
| |
| ExtensionActionIconFactory::~ExtensionActionIconFactory() {} |
| |
| // extensions::IconImage::Observer overrides. |
| void ExtensionActionIconFactory::OnExtensionIconImageChanged(IconImage* image) { |
| if (observer_) |
| observer_->OnIconUpdated(); |
| } |
| |
| void ExtensionActionIconFactory::OnExtensionIconImageDestroyed( |
| IconImage* image) { |
| icon_image_observation_.Reset(); |
| } |
| |
| gfx::Image ExtensionActionIconFactory::GetIcon(int tab_id) { |
| gfx::Image icon = action_->GetExplicitlySetIcon(tab_id); |
| if (!icon.IsEmpty()) |
| return icon; |
| |
| icon = action_->GetDeclarativeIcon(tab_id); |
| if (!icon.IsEmpty()) |
| return icon; |
| |
| if (cached_default_icon_image_.IsEmpty()) { |
| icon = action_->GetDefaultIconImage(); |
| // If the extension is packed, then check the icon for visibility. Icons |
| // for unpacked extensions are checked at load time, so we ignore them |
| // here. |
| if (should_check_icons_) { |
| const SkBitmap* const bitmap = icon.ToSkBitmap(); |
| const bool is_sufficiently_visible = |
| extensions::image_util::IsIconSufficientlyVisible(*bitmap); |
| UMA_HISTOGRAM_BOOLEAN("Extensions.ManifestIconSetIconWasVisibleForPacked", |
| is_sufficiently_visible); |
| if (!is_sufficiently_visible && !g_allow_invisible_icons) { |
| icon = action_->GetPlaceholderIconImage(); |
| } |
| } |
| cached_default_icon_image_ = icon; |
| } |
| |
| return cached_default_icon_image_; |
| } |