| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #import "chrome/browser/ui/cocoa/extensions/browser_action_button.h" | 5 #import "chrome/browser/ui/cocoa/extensions/browser_action_button.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <cmath> | 8 #include <cmath> |
| 9 | 9 |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 43 } // anonymous namespace | 43 } // anonymous namespace |
| 44 | 44 |
| 45 // A helper class to bridge the asynchronous Skia bitmap loading mechanism to | 45 // A helper class to bridge the asynchronous Skia bitmap loading mechanism to |
| 46 // the extension's button. | 46 // the extension's button. |
| 47 class ExtensionImageTrackerBridge : public content::NotificationObserver, | 47 class ExtensionImageTrackerBridge : public content::NotificationObserver, |
| 48 public ImageLoadingTracker::Observer { | 48 public ImageLoadingTracker::Observer { |
| 49 public: | 49 public: |
| 50 ExtensionImageTrackerBridge(BrowserActionButton* owner, | 50 ExtensionImageTrackerBridge(BrowserActionButton* owner, |
| 51 const Extension* extension) | 51 const Extension* extension) |
| 52 : owner_(owner), | 52 : owner_(owner), |
| 53 tracker_(this) { | 53 tracker_(this), |
| 54 browser_action_(extension->browser_action()) { |
| 54 // The Browser Action API does not allow the default icon path to be | 55 // The Browser Action API does not allow the default icon path to be |
| 55 // changed at runtime, so we can load this now and cache it. | 56 // changed at runtime, so we can load this now and cache it. |
| 56 std::string path = extension->browser_action()->default_icon_path(); | 57 std::string path = extension->browser_action()->default_icon_path(); |
| 57 if (!path.empty()) { | 58 if (!path.empty()) { |
| 58 tracker_.LoadImage(extension, extension->GetResource(path), | 59 tracker_.LoadImage(extension, extension->GetResource(path), |
| 59 gfx::Size(Extension::kBrowserActionIconMaxSize, | 60 gfx::Size(Extension::kBrowserActionIconMaxSize, |
| 60 Extension::kBrowserActionIconMaxSize), | 61 Extension::kBrowserActionIconMaxSize), |
| 61 ImageLoadingTracker::DONT_CACHE); | 62 ImageLoadingTracker::DONT_CACHE); |
| 62 } else { | |
| 63 // Set the icon to be the default extensions icon. | |
| 64 SkBitmap bm = *ResourceBundle::GetSharedInstance().GetBitmapNamed( | |
| 65 IDR_EXTENSIONS_FAVICON); | |
| 66 [owner_ setDefaultIcon:gfx::SkBitmapToNSImage(bm)]; | |
| 67 [owner_ updateState]; | |
| 68 } | 63 } |
| 69 registrar_.Add( | 64 registrar_.Add( |
| 70 this, chrome::NOTIFICATION_EXTENSION_BROWSER_ACTION_UPDATED, | 65 this, chrome::NOTIFICATION_EXTENSION_BROWSER_ACTION_UPDATED, |
| 71 content::Source<ExtensionAction>(extension->browser_action())); | 66 content::Source<ExtensionAction>(browser_action_)); |
| 72 } | 67 } |
| 73 | 68 |
| 74 ~ExtensionImageTrackerBridge() {} | 69 ~ExtensionImageTrackerBridge() {} |
| 75 | 70 |
| 76 // ImageLoadingTracker::Observer implementation. | 71 // ImageLoadingTracker::Observer implementation. |
| 77 void OnImageLoaded(const gfx::Image& image, | 72 void OnImageLoaded(const gfx::Image& image, |
| 78 const std::string& extension_id, | 73 const std::string& extension_id, |
| 79 int index) OVERRIDE { | 74 int index) OVERRIDE { |
| 80 if (!image.IsEmpty()) | 75 browser_action_->CacheIcon(browser_action_->default_icon_path(), image); |
| 81 [owner_ setDefaultIcon:image.ToNSImage()]; | |
| 82 [owner_ updateState]; | 76 [owner_ updateState]; |
| 83 } | 77 } |
| 84 | 78 |
| 85 // Overridden from content::NotificationObserver. | 79 // Overridden from content::NotificationObserver. |
| 86 void Observe(int type, | 80 void Observe(int type, |
| 87 const content::NotificationSource& source, | 81 const content::NotificationSource& source, |
| 88 const content::NotificationDetails& details) { | 82 const content::NotificationDetails& details) { |
| 89 if (type == chrome::NOTIFICATION_EXTENSION_BROWSER_ACTION_UPDATED) | 83 if (type == chrome::NOTIFICATION_EXTENSION_BROWSER_ACTION_UPDATED) |
| 90 [owner_ updateState]; | 84 [owner_ updateState]; |
| 91 else | 85 else |
| 92 NOTREACHED(); | 86 NOTREACHED(); |
| 93 } | 87 } |
| 94 | 88 |
| 95 private: | 89 private: |
| 96 // Weak. Owns us. | 90 // Weak. Owns us. |
| 97 BrowserActionButton* owner_; | 91 BrowserActionButton* owner_; |
| 98 | 92 |
| 99 // Loads the button's icons for us on the file thread. | 93 // Loads the button's icons for us on the file thread. |
| 100 ImageLoadingTracker tracker_; | 94 ImageLoadingTracker tracker_; |
| 101 | 95 |
| 96 // The browser action whose images we're loading. |
| 97 ExtensionAction* const browser_action_; |
| 98 |
| 102 // Used for registering to receive notifications and automatic clean up. | 99 // Used for registering to receive notifications and automatic clean up. |
| 103 content::NotificationRegistrar registrar_; | 100 content::NotificationRegistrar registrar_; |
| 104 | 101 |
| 105 DISALLOW_COPY_AND_ASSIGN(ExtensionImageTrackerBridge); | 102 DISALLOW_COPY_AND_ASSIGN(ExtensionImageTrackerBridge); |
| 106 }; | 103 }; |
| 107 | 104 |
| 108 @interface BrowserActionCell (Internals) | 105 @interface BrowserActionCell (Internals) |
| 109 - (void)drawBadgeWithinFrame:(NSRect)frame; | 106 - (void)drawBadgeWithinFrame:(NSRect)frame; |
| 110 @end | 107 @end |
| 111 | 108 |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 234 self, NSViewAnimationTargetKey, | 231 self, NSViewAnimationTargetKey, |
| 235 [NSValue valueWithRect:[self frame]], NSViewAnimationStartFrameKey, | 232 [NSValue valueWithRect:[self frame]], NSViewAnimationStartFrameKey, |
| 236 [NSValue valueWithRect:frameRect], NSViewAnimationEndFrameKey, | 233 [NSValue valueWithRect:frameRect], NSViewAnimationEndFrameKey, |
| 237 nil]; | 234 nil]; |
| 238 [moveAnimation_ setViewAnimations: | 235 [moveAnimation_ setViewAnimations: |
| 239 [NSArray arrayWithObject:animationDictionary]]; | 236 [NSArray arrayWithObject:animationDictionary]]; |
| 240 [moveAnimation_ startAnimation]; | 237 [moveAnimation_ startAnimation]; |
| 241 } | 238 } |
| 242 } | 239 } |
| 243 | 240 |
| 244 - (void)setDefaultIcon:(NSImage*)image { | |
| 245 defaultIcon_.reset([image retain]); | |
| 246 } | |
| 247 | |
| 248 - (void)setTabSpecificIcon:(NSImage*)image { | |
| 249 tabSpecificIcon_.reset([image retain]); | |
| 250 } | |
| 251 | |
| 252 - (void)updateState { | 241 - (void)updateState { |
| 253 if (tabId_ < 0) | 242 if (tabId_ < 0) |
| 254 return; | 243 return; |
| 255 | 244 |
| 256 std::string tooltip = extension_->browser_action()->GetTitle(tabId_); | 245 std::string tooltip = extension_->browser_action()->GetTitle(tabId_); |
| 257 if (tooltip.empty()) { | 246 if (tooltip.empty()) { |
| 258 [self setToolTip:nil]; | 247 [self setToolTip:nil]; |
| 259 } else { | 248 } else { |
| 260 [self setToolTip:base::SysUTF8ToNSString(tooltip)]; | 249 [self setToolTip:base::SysUTF8ToNSString(tooltip)]; |
| 261 } | 250 } |
| 262 | 251 |
| 263 SkBitmap image = extension_->browser_action()->GetIcon(tabId_); | 252 gfx::Image image = extension_->browser_action()->GetIcon(tabId_); |
| 264 if (!image.isNull()) { | 253 if (!image.IsEmpty()) |
| 265 [self setTabSpecificIcon:gfx::SkBitmapToNSImage(image)]; | 254 [self setImage:image.ToNSImage()]; |
| 266 [self setImage:tabSpecificIcon_]; | |
| 267 } else if (defaultIcon_) { | |
| 268 [self setImage:defaultIcon_]; | |
| 269 } | |
| 270 | 255 |
| 271 [[self cell] setTabId:tabId_]; | 256 [[self cell] setTabId:tabId_]; |
| 272 | 257 |
| 273 bool enabled = extension_->browser_action()->GetIsVisible(tabId_); | 258 bool enabled = extension_->browser_action()->GetIsVisible(tabId_); |
| 274 [self setEnabled:enabled ? YES : NO]; | 259 [self setEnabled:enabled ? YES : NO]; |
| 275 | 260 |
| 276 [self setNeedsDisplay:YES]; | 261 [self setNeedsDisplay:YES]; |
| 277 } | 262 } |
| 278 | 263 |
| 279 - (BOOL)isAnimating { | 264 - (BOOL)isAnimating { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 322 } | 307 } |
| 323 | 308 |
| 324 - (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView*)controlView { | 309 - (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView*)controlView { |
| 325 gfx::ScopedNSGraphicsContextSaveGState scopedGState; | 310 gfx::ScopedNSGraphicsContextSaveGState scopedGState; |
| 326 [super drawInteriorWithFrame:cellFrame inView:controlView]; | 311 [super drawInteriorWithFrame:cellFrame inView:controlView]; |
| 327 cellFrame.origin.y += kBrowserActionBadgeOriginYOffset; | 312 cellFrame.origin.y += kBrowserActionBadgeOriginYOffset; |
| 328 [self drawBadgeWithinFrame:cellFrame]; | 313 [self drawBadgeWithinFrame:cellFrame]; |
| 329 } | 314 } |
| 330 | 315 |
| 331 @end | 316 @end |
| OLD | NEW |