X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fchrome%2Fbrowser%2Fextensions%2Fextension_action.cc;h=f4f70471ac1cf073b5146f575f41e477a81a2946;hb=ff3e2503a20db9193d323c1d19c38c68004dec4a;hp=c24edd2c8cf5362a3d057179330d32c77d2ba26e;hpb=7338fba38ba696536d1cc9d389afd716a6ab2fe6;p=platform%2Fframework%2Fweb%2Fcrosswalk.git diff --git a/src/chrome/browser/extensions/extension_action.cc b/src/chrome/browser/extensions/extension_action.cc index c24edd2..f4f7047 100644 --- a/src/chrome/browser/extensions/extension_action.cc +++ b/src/chrome/browser/extensions/extension_action.cc @@ -53,108 +53,7 @@ class GetAttentionImageSource : public gfx::ImageSkiaSource { } // namespace -// TODO(tbarzic): Merge AnimationIconImageSource and IconAnimation together. -// Source for painting animated skia image. -class AnimatedIconImageSource : public gfx::ImageSkiaSource { - public: - AnimatedIconImageSource( - const gfx::ImageSkia& image, - base::WeakPtr animation) - : image_(image), - animation_(animation) { - } - - private: - virtual ~AnimatedIconImageSource() {} - - virtual gfx::ImageSkiaRep GetImageForScale(float scale) OVERRIDE { - gfx::ImageSkiaRep original_rep = image_.GetRepresentation(scale); - if (!animation_.get()) - return original_rep; - - // Original representation's scale factor may be different from scale - // factor passed to this method. We want to use the former (since we are - // using bitmap for that scale). - return gfx::ImageSkiaRep( - animation_->Apply(original_rep.sk_bitmap()), original_rep.scale()); - } - - gfx::ImageSkia image_; - base::WeakPtr animation_; - - DISALLOW_COPY_AND_ASSIGN(AnimatedIconImageSource); -}; - const int ExtensionAction::kDefaultTabId = -1; -// 100ms animation at 50fps (so 5 animation frames in total). -const int kIconFadeInDurationMs = 100; -const int kIconFadeInFramesPerSecond = 50; - -ExtensionAction::IconAnimation::IconAnimation() - : gfx::LinearAnimation(kIconFadeInDurationMs, kIconFadeInFramesPerSecond, - NULL), - weak_ptr_factory_(this) {} - -ExtensionAction::IconAnimation::~IconAnimation() { - // Make sure observers don't access *this after its destructor has started. - weak_ptr_factory_.InvalidateWeakPtrs(); - // In case the animation was destroyed before it finished (likely due to - // delays in timer scheduling), make sure it's fully visible. - FOR_EACH_OBSERVER(Observer, observers_, OnIconChanged()); -} - -const SkBitmap& ExtensionAction::IconAnimation::Apply( - const SkBitmap& icon) const { - DCHECK_GT(icon.width(), 0); - DCHECK_GT(icon.height(), 0); - - if (!device_.get() || - (device_->width() != icon.width()) || - (device_->height() != icon.height())) { - device_.reset(new SkBitmapDevice( - SkBitmap::kARGB_8888_Config, icon.width(), icon.height(), true)); - } - - SkCanvas canvas(device_.get()); - canvas.clear(SK_ColorWHITE); - SkPaint paint; - paint.setAlpha(CurrentValueBetween(0, 255)); - canvas.drawBitmap(icon, 0, 0, &paint); - return device_->accessBitmap(false); -} - -base::WeakPtr -ExtensionAction::IconAnimation::AsWeakPtr() { - return weak_ptr_factory_.GetWeakPtr(); -} - -void ExtensionAction::IconAnimation::AddObserver( - ExtensionAction::IconAnimation::Observer* observer) { - observers_.AddObserver(observer); -} - -void ExtensionAction::IconAnimation::RemoveObserver( - ExtensionAction::IconAnimation::Observer* observer) { - observers_.RemoveObserver(observer); -} - -void ExtensionAction::IconAnimation::AnimateToState(double state) { - FOR_EACH_OBSERVER(Observer, observers_, OnIconChanged()); -} - -ExtensionAction::IconAnimation::ScopedObserver::ScopedObserver( - const base::WeakPtr& icon_animation, - Observer* observer) - : icon_animation_(icon_animation), - observer_(observer) { - if (icon_animation.get()) - icon_animation->AddObserver(observer); -} - -ExtensionAction::IconAnimation::ScopedObserver::~ScopedObserver() { - if (icon_animation_.get()) - icon_animation_->RemoveObserver(observer_); -} ExtensionAction::ExtensionAction( const std::string& extension_id, @@ -165,9 +64,8 @@ ExtensionAction::ExtensionAction( has_changed_(false) { // Page/script actions are hidden/disabled by default, and browser actions are // visible/enabled by default. - SetAppearance(kDefaultTabId, - action_type == extensions::ActionInfo::TYPE_BROWSER ? - ExtensionAction::ACTIVE : ExtensionAction::INVISIBLE); + SetIsVisible(kDefaultTabId, + action_type == extensions::ActionInfo::TYPE_BROWSER); SetTitle(kDefaultTabId, manifest_data.default_title); SetPopupUrl(kDefaultTabId, manifest_data.default_popup_url); if (!manifest_data.default_icon.empty()) { @@ -190,8 +88,7 @@ scoped_ptr ExtensionAction::CopyForTest() const { copy->badge_text_ = badge_text_; copy->badge_background_color_ = badge_background_color_; copy->badge_text_color_ = badge_text_color_; - copy->appearance_ = appearance_; - copy->icon_animation_ = icon_animation_; + copy->is_visible_ = is_visible_; copy->id_ = id_; if (default_icon_) @@ -237,27 +134,17 @@ void ExtensionAction::SetIcon(int tab_id, const gfx::Image& image) { SetValue(&icon_, tab_id, image.AsImageSkia()); } -gfx::Image ExtensionAction::ApplyAttentionAndAnimation( - const gfx::ImageSkia& original_icon, - int tab_id) const { - gfx::ImageSkia icon = original_icon; - if (GetValue(&appearance_, tab_id) == WANTS_ATTENTION) - icon = gfx::ImageSkia(new GetAttentionImageSource(icon), icon.size()); - - return gfx::Image(ApplyIconAnimation(tab_id, icon)); -} - gfx::ImageSkia ExtensionAction::GetExplicitlySetIcon(int tab_id) const { return GetValue(&icon_, tab_id); } -bool ExtensionAction::SetAppearance(int tab_id, Appearance new_appearance) { - const Appearance old_appearance = GetValue(&appearance_, tab_id); +bool ExtensionAction::SetIsVisible(int tab_id, bool new_visibility) { + const bool old_visibility = GetValue(&is_visible_, tab_id); - if (old_appearance == new_appearance) + if (old_visibility == new_visibility) return false; - SetValue(&appearance_, tab_id, new_appearance); + SetValue(&is_visible_, tab_id, new_visibility); return true; } @@ -281,12 +168,11 @@ void ExtensionAction::ClearAllValuesForTab(int tab_id) { badge_text_.erase(tab_id); badge_text_color_.erase(tab_id); badge_background_color_.erase(tab_id); - appearance_.erase(tab_id); + is_visible_.erase(tab_id); // TODO(jyasskin): Erase the element from declarative_show_count_ // when the tab's closed. There's a race between the // PageActionController and the ContentRulesRegistry on navigation, // which prevents me from cleaning everything up now. - icon_animation_.erase(tab_id); } void ExtensionAction::PaintBadge(gfx::Canvas* canvas, @@ -336,37 +222,3 @@ int ExtensionAction::GetIconWidth(int tab_id) const { return ui::ResourceBundle::GetSharedInstance().GetImageNamed( IDR_EXTENSIONS_FAVICON).ToImageSkia()->width(); } - -base::WeakPtr ExtensionAction::GetIconAnimation( - int tab_id) const { - std::map >::iterator it = - icon_animation_.find(tab_id); - if (it == icon_animation_.end()) - return base::WeakPtr(); - if (it->second.get()) - return it->second; - - // Take this opportunity to remove all the NULL IconAnimations from - // icon_animation_. - icon_animation_.erase(it); - for (it = icon_animation_.begin(); it != icon_animation_.end();) { - if (it->second.get()) { - ++it; - } else { - // The WeakPtr is null; remove it from the map. - icon_animation_.erase(it++); - } - } - return base::WeakPtr(); -} - -gfx::ImageSkia ExtensionAction::ApplyIconAnimation( - int tab_id, - const gfx::ImageSkia& icon) const { - base::WeakPtr animation = GetIconAnimation(tab_id); - if (animation.get() == NULL) - return icon; - - return gfx::ImageSkia(new AnimatedIconImageSource(icon, animation), - icon.size()); -}