| Index: chrome/browser/ui/cocoa/extensions/browser_action_button.mm
|
| diff --git a/chrome/browser/ui/cocoa/extensions/browser_action_button.mm b/chrome/browser/ui/cocoa/extensions/browser_action_button.mm
|
| index d188840ef0f7fa18aa87bc2bc8b0d1f243883b0c..93fa87978383e3616d80a6c7d7c75118e876a9a2 100644
|
| --- a/chrome/browser/ui/cocoa/extensions/browser_action_button.mm
|
| +++ b/chrome/browser/ui/cocoa/extensions/browser_action_button.mm
|
| @@ -9,7 +9,7 @@
|
|
|
| #include "base/logging.h"
|
| #include "base/sys_string_conversions.h"
|
| -#include "chrome/browser/extensions/image_loading_tracker.h"
|
| +#include "chrome/browser/extensions/extension_action_icon_factory.h"
|
| #include "chrome/browser/ui/cocoa/extensions/extension_action_context_menu.h"
|
| #include "chrome/common/chrome_notification_types.h"
|
| #include "chrome/common/extensions/extension.h"
|
| @@ -40,35 +40,24 @@ const CGFloat kAnimationDuration = 0.2;
|
|
|
| // A helper class to bridge the asynchronous Skia bitmap loading mechanism to
|
| // the extension's button.
|
| -class ExtensionImageTrackerBridge : public content::NotificationObserver,
|
| - public ImageLoadingTracker::Observer {
|
| +class ExtensionActionIconFactoryBridge
|
| + : public content::NotificationObserver,
|
| + public ExtensionActionIconFactory::Observer {
|
| public:
|
| - ExtensionImageTrackerBridge(BrowserActionButton* owner,
|
| - const Extension* extension)
|
| + ExtensionActionIconFactoryBridge(BrowserActionButton* owner,
|
| + const Extension* extension)
|
| : owner_(owner),
|
| - tracker_(this),
|
| + icon_factory_(extension, extension->browser_action(), this),
|
| browser_action_(extension->browser_action()) {
|
| - // The Browser Action API does not allow the default icon path to be
|
| - // changed at runtime, so we can load this now and cache it.
|
| - std::string path = extension->browser_action()->default_icon_path();
|
| - if (!path.empty()) {
|
| - tracker_.LoadImage(extension, extension->GetResource(path),
|
| - gfx::Size(Extension::kBrowserActionIconMaxSize,
|
| - Extension::kBrowserActionIconMaxSize),
|
| - ImageLoadingTracker::DONT_CACHE);
|
| - }
|
| registrar_.Add(
|
| this, chrome::NOTIFICATION_EXTENSION_BROWSER_ACTION_UPDATED,
|
| content::Source<ExtensionAction>(browser_action_));
|
| }
|
|
|
| - ~ExtensionImageTrackerBridge() {}
|
| + virtual ~ExtensionActionIconFactoryBridge() {}
|
|
|
| // ImageLoadingTracker::Observer implementation.
|
| - void OnImageLoaded(const gfx::Image& image,
|
| - const std::string& extension_id,
|
| - int index) OVERRIDE {
|
| - browser_action_->CacheIcon(image);
|
| + void OnIconUpdated() OVERRIDE {
|
| [owner_ updateState];
|
| }
|
|
|
| @@ -82,12 +71,19 @@ class ExtensionImageTrackerBridge : public content::NotificationObserver,
|
| NOTREACHED();
|
| }
|
|
|
| + gfx::Image GetIcon(int tabId) {
|
| + return icon_factory_.GetIcon(tabId);
|
| + }
|
| +
|
| private:
|
| // Weak. Owns us.
|
| BrowserActionButton* owner_;
|
|
|
| - // Loads the button's icons for us on the file thread.
|
| - ImageLoadingTracker tracker_;
|
| + // The object that will be used to get the browser action icon for us.
|
| + // It may load the icon asynchronously (in which case the initial icon
|
| + // returned by the factory will be transparent), so we have to observe it for
|
| + // updates to the icon.
|
| + ExtensionActionIconFactory icon_factory_;
|
|
|
| // The browser action whose images we're loading.
|
| ExtensionAction* const browser_action_;
|
| @@ -95,7 +91,7 @@ class ExtensionImageTrackerBridge : public content::NotificationObserver,
|
| // Used for registering to receive notifications and automatic clean up.
|
| content::NotificationRegistrar registrar_;
|
|
|
| - DISALLOW_COPY_AND_ASSIGN(ExtensionImageTrackerBridge);
|
| + DISALLOW_COPY_AND_ASSIGN(ExtensionActionIconFactoryBridge);
|
| };
|
|
|
| @interface BrowserActionCell (Internals)
|
| @@ -151,7 +147,8 @@ class ExtensionImageTrackerBridge : public content::NotificationObserver,
|
|
|
| tabId_ = tabId;
|
| extension_ = extension;
|
| - imageLoadingBridge_.reset(new ExtensionImageTrackerBridge(self, extension));
|
| + iconFactoryBridge_.reset(
|
| + new ExtensionActionIconFactoryBridge(self, extension));
|
|
|
| moveAnimation_.reset([[NSViewAnimation alloc] init]);
|
| [moveAnimation_ gtm_setDuration:kAnimationDuration
|
| @@ -250,7 +247,8 @@ class ExtensionImageTrackerBridge : public content::NotificationObserver,
|
| [self setToolTip:base::SysUTF8ToNSString(tooltip)];
|
| }
|
|
|
| - gfx::Image image = extension_->browser_action()->GetIcon(tabId_);
|
| + gfx::Image image = iconFactoryBridge_->GetIcon(tabId_);
|
| +
|
| if (!image.IsEmpty())
|
| [self setImage:image.ToNSImage()];
|
|
|
|
|