Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(353)

Side by Side Diff: chrome/browser/cocoa/extensions/extension_infobar_controller.mm

Issue 4767001: Make TabContents own its infobar delegates.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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/cocoa/extensions/extension_infobar_controller.h" 5 #import "chrome/browser/cocoa/extensions/extension_infobar_controller.h"
6 6
7 #include <cmath> 7 #include <cmath>
8 8
9 #include "app/resource_bundle.h" 9 #include "app/resource_bundle.h"
10 #import "chrome/browser/cocoa/animatable_view.h" 10 #import "chrome/browser/cocoa/animatable_view.h"
(...skipping 29 matching lines...) Expand all
40 - (CGFloat)clampedExtensionViewHeight; 40 - (CGFloat)clampedExtensionViewHeight;
41 // Adjusts the width of the extension's hosted view to match the window's width 41 // Adjusts the width of the extension's hosted view to match the window's width
42 // and sets the proper height for it as well. 42 // and sets the proper height for it as well.
43 - (void)adjustExtensionViewSize; 43 - (void)adjustExtensionViewSize;
44 // Sets the image to be used in the button on the left side of the infobar. 44 // Sets the image to be used in the button on the left side of the infobar.
45 - (void)setButtonImage:(NSImage*)image; 45 - (void)setButtonImage:(NSImage*)image;
46 @end 46 @end
47 47
48 // A helper class to bridge the asynchronous Skia bitmap loading mechanism to 48 // A helper class to bridge the asynchronous Skia bitmap loading mechanism to
49 // the extension's button. 49 // the extension's button.
50 class InfobarBridge : public ExtensionInfoBarDelegate::DelegateObserver, 50 class InfobarBridge : public ImageLoadingTracker::Observer {
51 public ImageLoadingTracker::Observer {
52 public: 51 public:
53 explicit InfobarBridge(ExtensionInfoBarController* owner) 52 explicit InfobarBridge(ExtensionInfoBarController* owner)
54 : owner_(owner), 53 : owner_(owner),
55 delegate_([owner delegate]->AsExtensionInfoBarDelegate()),
56 tracker_(this) { 54 tracker_(this) {
57 delegate_->set_observer(this);
58 LoadIcon(); 55 LoadIcon();
59 } 56 }
60 57
61 virtual ~InfobarBridge() { 58 virtual ~InfobarBridge() {
62 if (delegate_)
63 delegate_->set_observer(NULL);
64 } 59 }
65 60
66 // Load the Extension's icon image. 61 // Load the Extension's icon image.
67 void LoadIcon() { 62 void LoadIcon() {
68 const Extension* extension = delegate_->extension_host()->extension(); 63 const Extension* extension = [owner_ delegate]->
64 AsExtensionInfoBarDelegate()->extension_host()->extension();
69 ExtensionResource icon_resource = extension->GetIconResource( 65 ExtensionResource icon_resource = extension->GetIconResource(
70 Extension::EXTENSION_ICON_BITTY, ExtensionIconSet::MATCH_EXACTLY); 66 Extension::EXTENSION_ICON_BITTY, ExtensionIconSet::MATCH_EXACTLY);
71 if (!icon_resource.relative_path().empty()) { 67 if (!icon_resource.relative_path().empty()) {
72 tracker_.LoadImage(extension, icon_resource, 68 tracker_.LoadImage(extension, icon_resource,
73 gfx::Size(Extension::EXTENSION_ICON_BITTY, 69 gfx::Size(Extension::EXTENSION_ICON_BITTY,
74 Extension::EXTENSION_ICON_BITTY), 70 Extension::EXTENSION_ICON_BITTY),
75 ImageLoadingTracker::DONT_CACHE); 71 ImageLoadingTracker::DONT_CACHE);
76 } else { 72 } else {
77 OnImageLoaded(NULL, icon_resource, 0); 73 OnImageLoaded(NULL, icon_resource, 0);
78 } 74 }
79 } 75 }
80 76
81 // ImageLoadingTracker::Observer implementation. 77 // ImageLoadingTracker::Observer implementation.
82 // TODO(andybons): The infobar view implementations share a lot of the same 78 // TODO(andybons): The infobar view implementations share a lot of the same
83 // code. Come up with a strategy to share amongst them. 79 // code. Come up with a strategy to share amongst them.
84 virtual void OnImageLoaded( 80 virtual void OnImageLoaded(SkBitmap* image,
85 SkBitmap* image, ExtensionResource resource, int index) { 81 ExtensionResource resource,
86 if (!delegate_) 82 int index) {
87 return; // The delegate can go away while the image asynchronously loads.
88
89 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 83 ResourceBundle& rb = ResourceBundle::GetSharedInstance();
90 84
91 // Fall back on the default extension icon on failure. 85 // Fall back on the default extension icon on failure.
92 SkBitmap* icon; 86 SkBitmap* icon;
93 if (!image || image->empty()) 87 if (!image || image->empty())
94 icon = rb.GetBitmapNamed(IDR_EXTENSIONS_SECTION); 88 icon = rb.GetBitmapNamed(IDR_EXTENSIONS_SECTION);
95 else 89 else
96 icon = image; 90 icon = image;
97 91
98 SkBitmap* drop_image = rb.GetBitmapNamed(IDR_APP_DROPARROW); 92 SkBitmap* drop_image = rb.GetBitmapNamed(IDR_APP_DROPARROW);
99 93
100 const int image_size = Extension::EXTENSION_ICON_BITTY; 94 const int image_size = Extension::EXTENSION_ICON_BITTY;
101 scoped_ptr<gfx::CanvasSkia> canvas( 95 scoped_ptr<gfx::CanvasSkia> canvas(
102 new gfx::CanvasSkia( 96 new gfx::CanvasSkia(
103 image_size + kDropArrowLeftMarginPx + drop_image->width(), 97 image_size + kDropArrowLeftMarginPx + drop_image->width(),
104 image_size, false)); 98 image_size, false));
105 canvas->DrawBitmapInt(*icon, 99 canvas->DrawBitmapInt(*icon,
106 0, 0, icon->width(), icon->height(), 100 0, 0, icon->width(), icon->height(),
107 0, 0, image_size, image_size, 101 0, 0, image_size, image_size,
108 false); 102 false);
109 canvas->DrawBitmapInt(*drop_image, 103 canvas->DrawBitmapInt(*drop_image,
110 image_size + kDropArrowLeftMarginPx, 104 image_size + kDropArrowLeftMarginPx,
111 image_size / 2); 105 image_size / 2);
112 [owner_ setButtonImage:gfx::SkBitmapToNSImage(canvas->ExtractBitmap())]; 106 [owner_ setButtonImage:gfx::SkBitmapToNSImage(canvas->ExtractBitmap())];
113 } 107 }
114 108
115 // Overridden from ExtensionInfoBarDelegate::DelegateObserver:
116 virtual void OnDelegateDeleted() {
117 delegate_ = NULL;
118 }
119
120 private: 109 private:
121 // Weak. Owns us. 110 // Weak. Owns us.
122 ExtensionInfoBarController* owner_; 111 ExtensionInfoBarController* owner_;
123 112
124 // Weak.
125 ExtensionInfoBarDelegate* delegate_;
126
127 // Loads the extensions's icon on the file thread. 113 // Loads the extensions's icon on the file thread.
128 ImageLoadingTracker tracker_; 114 ImageLoadingTracker tracker_;
129 115
130 DISALLOW_COPY_AND_ASSIGN(InfobarBridge); 116 DISALLOW_COPY_AND_ASSIGN(InfobarBridge);
131 }; 117 };
132 118
133 119
134 @implementation ExtensionInfoBarController 120 @implementation ExtensionInfoBarController
135 121
136 - (id)initWithDelegate:(InfoBarDelegate*)delegate 122 - (id)initWithDelegate:(InfoBarDelegate*)delegate
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
257 243
258 @end 244 @end
259 245
260 InfoBar* ExtensionInfoBarDelegate::CreateInfoBar() { 246 InfoBar* ExtensionInfoBarDelegate::CreateInfoBar() {
261 NSWindow* window = [(NSView*)tab_contents_->GetContentNativeView() window]; 247 NSWindow* window = [(NSView*)tab_contents_->GetContentNativeView() window];
262 ExtensionInfoBarController* controller = 248 ExtensionInfoBarController* controller =
263 [[ExtensionInfoBarController alloc] initWithDelegate:this 249 [[ExtensionInfoBarController alloc] initWithDelegate:this
264 window:window]; 250 window:window];
265 return new InfoBar(controller); 251 return new InfoBar(controller);
266 } 252 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698