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

Side by Side Diff: chrome/browser/ui/cocoa/infobars/extension_infobar_controller.mm

Issue 22694006: Infobar system refactor. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 7 years 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) 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/infobars/extension_infobar_controller.h" 5 #import "chrome/browser/ui/cocoa/infobars/extension_infobar_controller.h"
6 6
7 #include <cmath> 7 #include <cmath>
8 8
9 #include "chrome/browser/extensions/extension_infobar_delegate.h" 9 #include "chrome/browser/extensions/extension_infobar_delegate.h"
10 #include "chrome/browser/extensions/extension_view_host.h" 10 #include "chrome/browser/extensions/extension_view_host.h"
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
45 - (CGFloat)clampedExtensionViewHeight; 45 - (CGFloat)clampedExtensionViewHeight;
46 // Adjusts the width of the extension's hosted view to match the window's width 46 // Adjusts the width of the extension's hosted view to match the window's width
47 // and sets the proper height for it as well. 47 // and sets the proper height for it as well.
48 - (void)adjustExtensionViewSize; 48 - (void)adjustExtensionViewSize;
49 // Sets the image to be used in the button on the left side of the infobar. 49 // Sets the image to be used in the button on the left side of the infobar.
50 - (void)setButtonImage:(NSImage*)image; 50 - (void)setButtonImage:(NSImage*)image;
51 @end 51 @end
52 52
53 // A helper class to bridge the asynchronous Skia bitmap loading mechanism to 53 // A helper class to bridge the asynchronous Skia bitmap loading mechanism to
54 // the extension's button. 54 // the extension's button.
55 class InfobarBridge : public ExtensionInfoBarDelegate::DelegateObserver { 55 class InfobarBridge {
56 public: 56 public:
57 explicit InfobarBridge(ExtensionInfoBarController* owner) 57 explicit InfobarBridge(ExtensionInfoBarController* owner)
58 : owner_(owner), 58 : owner_(owner),
59 delegate_([owner delegate]->AsExtensionInfoBarDelegate()), 59 delegate_([owner delegate]->AsExtensionInfoBarDelegate()),
60 weak_ptr_factory_(this) { 60 weak_ptr_factory_(this) {
61 delegate_->set_observer(this);
62 LoadIcon(); 61 LoadIcon();
63 } 62 }
64 63
65 virtual ~InfobarBridge() {
66 if (delegate_)
67 delegate_->set_observer(NULL);
68 }
69
70 // Load the Extension's icon image. 64 // Load the Extension's icon image.
71 void LoadIcon() { 65 void LoadIcon() {
72 const extensions::Extension* extension = delegate_->extension_view_host()-> 66 const extensions::Extension* extension = delegate_->extension_view_host()->
73 extension(); 67 extension();
74 extensions::ExtensionResource icon_resource = 68 extensions::ExtensionResource icon_resource =
75 extensions::IconsInfo::GetIconResource( 69 extensions::IconsInfo::GetIconResource(
76 extension, 70 extension,
77 extension_misc::EXTENSION_ICON_BITTY, 71 extension_misc::EXTENSION_ICON_BITTY,
78 ExtensionIconSet::MATCH_EXACTLY); 72 ExtensionIconSet::MATCH_EXACTLY);
79 extensions::ImageLoader* loader = extensions::ImageLoader::Get( 73 extensions::ImageLoader* loader = extensions::ImageLoader::Get(
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
112 0, 0, icon->width(), icon->height(), 106 0, 0, icon->width(), icon->height(),
113 0, 0, image_size, image_size, 107 0, 0, image_size, image_size,
114 false); 108 false);
115 canvas->DrawImageInt(*drop_image, 109 canvas->DrawImageInt(*drop_image,
116 image_size + kDropArrowLeftMarginPx, 110 image_size + kDropArrowLeftMarginPx,
117 image_size / 2); 111 image_size / 2);
118 [owner_ setButtonImage:gfx::SkBitmapToNSImage( 112 [owner_ setButtonImage:gfx::SkBitmapToNSImage(
119 canvas->ExtractImageRep().sk_bitmap())]; 113 canvas->ExtractImageRep().sk_bitmap())];
120 } 114 }
121 115
122 // Overridden from ExtensionInfoBarDelegate::DelegateObserver:
123 virtual void OnDelegateDeleted() OVERRIDE {
124 delegate_ = NULL;
125 }
126
127 private: 116 private:
128 // Weak. Owns us. 117 // Weak. Owns us.
129 ExtensionInfoBarController* owner_; 118 ExtensionInfoBarController* owner_;
130 119
131 // Weak. 120 // Weak.
132 ExtensionInfoBarDelegate* delegate_; 121 ExtensionInfoBarDelegate* delegate_;
133 122
134 base::WeakPtrFactory<InfobarBridge> weak_ptr_factory_; 123 base::WeakPtrFactory<InfobarBridge> weak_ptr_factory_;
135 124
136 DISALLOW_COPY_AND_ASSIGN(InfobarBridge); 125 DISALLOW_COPY_AND_ASSIGN(InfobarBridge);
137 }; 126 };
138 127
139 128
140 @implementation ExtensionInfoBarController 129 @implementation ExtensionInfoBarController
141 130
142 - (id)initWithInfoBar:(InfoBarCocoa*)infobar 131 - (id)initWithInfoBar:(InfoBarCocoa*)infobar {
143 window:(NSWindow*)window {
144 if ((self = [super initWithInfoBar:infobar])) { 132 if ((self = [super initWithInfoBar:infobar])) {
145 window_ = window;
146 dropdownButton_.reset([[MenuButton alloc] init]); 133 dropdownButton_.reset([[MenuButton alloc] init]);
147 [dropdownButton_ setOpenMenuOnClick:YES]; 134 [dropdownButton_ setOpenMenuOnClick:YES];
148 135
149 extensions::ExtensionViewHost* extensionViewHost =
150 [self delegate]->AsExtensionInfoBarDelegate()->extension_view_host();
151 Browser* browser = chrome::FindBrowserWithWebContents(
152 [self infobar]->OwnerCocoa()->web_contents());
153 contextMenuController_.reset([[ExtensionActionContextMenuController alloc]
154 initWithExtension:extensionViewHost->extension()
155 browser:browser
156 extensionAction:NULL]);
157
158 base::scoped_nsobject<NSMenu> contextMenu( 136 base::scoped_nsobject<NSMenu> contextMenu(
159 [[NSMenu alloc] initWithTitle:@""]); 137 [[NSMenu alloc] initWithTitle:@""]);
160 [contextMenu setDelegate:self]; 138 [contextMenu setDelegate:self];
161 // See menu_button.h for documentation on why this is needed. 139 // See menu_button.h for documentation on why this is needed.
162 [contextMenu addItemWithTitle:@"" action:NULL keyEquivalent:@""]; 140 [contextMenu addItemWithTitle:@"" action:NULL keyEquivalent:@""];
163 [dropdownButton_ setAttachedMenu:contextMenu]; 141 [dropdownButton_ setAttachedMenu:contextMenu];
164 142
165 bridge_.reset(new InfobarBridge(self)); 143 bridge_.reset(new InfobarBridge(self));
166 } 144 }
167 return self; 145 return self;
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 // the parent infobar view matches the height of the extension's native view. 195 // the parent infobar view matches the height of the extension's native view.
218 [[NSNotificationCenter defaultCenter] 196 [[NSNotificationCenter defaultCenter]
219 addObserver:self 197 addObserver:self
220 selector:@selector(extensionViewFrameChanged) 198 selector:@selector(extensionViewFrameChanged)
221 name:NSViewFrameDidChangeNotification 199 name:NSViewFrameDidChangeNotification
222 object:extensionView_]; 200 object:extensionView_];
223 201
224 [[NSNotificationCenter defaultCenter] 202 [[NSNotificationCenter defaultCenter]
225 addObserver:self 203 addObserver:self
226 selector:@selector(adjustExtensionViewSize) 204 selector:@selector(adjustExtensionViewSize)
227 name:NSWindowDidResizeNotification 205 name:NSViewFrameDidChangeNotification
228 object:window_]; 206 object:[self view]];
207 }
208
209 - (void)infobarWillHide {
210 [[dropdownButton_ menu] cancelTracking];
211 [super infobarWillHide];
229 } 212 }
230 213
231 - (void)infobarWillClose { 214 - (void)infobarWillClose {
232 [self disablePopUpMenu:[dropdownButton_ menu]]; 215 [self disablePopUpMenu:[dropdownButton_ menu]];
233 [super infobarWillClose]; 216 [super infobarWillClose];
234 } 217 }
235 218
236 - (void)extensionViewFrameChanged { 219 - (void)extensionViewFrameChanged {
237 [self adjustExtensionViewSize]; 220 [self adjustExtensionViewSize];
238 [self infobar]->SetBarTargetHeight([self clampedExtensionViewHeight]); 221 [self infobar]->SetBarTargetHeight([self clampedExtensionViewHeight]);
239 } 222 }
240 223
241 - (CGFloat)clampedExtensionViewHeight { 224 - (CGFloat)clampedExtensionViewHeight {
242 CGFloat height = [self delegate]->AsExtensionInfoBarDelegate()->height(); 225 CGFloat height = [self delegate]->AsExtensionInfoBarDelegate()->height();
243 return std::max(kToolbarMinHeightPx, std::min(height, kToolbarMaxHeightPx)); 226 return std::max(kToolbarMinHeightPx, std::min(height, kToolbarMaxHeightPx));
244 } 227 }
245 228
246 - (void)adjustExtensionViewSize { 229 - (void)adjustExtensionViewSize {
247 [extensionView_ setPostsFrameChangedNotifications:NO]; 230 [extensionView_ setPostsFrameChangedNotifications:NO];
248 NSSize extensionViewSize = [extensionView_ frame].size; 231 NSSize extensionViewSize = [extensionView_ frame].size;
249 extensionViewSize.width = NSWidth([window_ frame]); 232 extensionViewSize.width = NSWidth([[self view] frame]);
250 extensionViewSize.height = [self clampedExtensionViewHeight]; 233 extensionViewSize.height = [self clampedExtensionViewHeight];
251 [extensionView_ setFrameSize:extensionViewSize]; 234 [extensionView_ setFrameSize:extensionViewSize];
252 [extensionView_ setPostsFrameChangedNotifications:YES]; 235 [extensionView_ setPostsFrameChangedNotifications:YES];
253 } 236 }
254 237
255 - (void)setButtonImage:(NSImage*)image { 238 - (void)setButtonImage:(NSImage*)image {
256 [dropdownButton_ setImage:image]; 239 [dropdownButton_ setImage:image];
257 } 240 }
258 241
259 - (void)menuNeedsUpdate:(NSMenu*)menu { 242 - (void)menuNeedsUpdate:(NSMenu*)menu {
243 DCHECK([self isOwned]);
244
245 if (!contextMenuController_) {
246 extensions::ExtensionViewHost* extensionViewHost =
247 [self delegate]->AsExtensionInfoBarDelegate()->extension_view_host();
248 Browser* browser = chrome::FindBrowserWithWebContents(
249 [self infobar]->OwnerCocoa()->web_contents());
250 contextMenuController_.reset([[ExtensionActionContextMenuController alloc]
251 initWithExtension:extensionViewHost->extension()
252 browser:browser
253 extensionAction:NULL]);
254 }
255
260 [menu removeAllItems]; 256 [menu removeAllItems];
261 [contextMenuController_ populateMenu:menu]; 257 [contextMenuController_ populateMenu:menu];
262 } 258 }
263 259
264 @end 260 @end
265 261
266 InfoBar* ExtensionInfoBarDelegate::CreateInfoBar(InfoBarService* owner) { 262 // static
267 scoped_ptr<InfoBarCocoa> infobar(new InfoBarCocoa(owner, this)); 263 scoped_ptr<InfoBar> ExtensionInfoBarDelegate::CreateInfoBar(
268 NSWindow* window = 264 scoped_ptr<ExtensionInfoBarDelegate> delegate) {
269 [(NSView*)owner->web_contents()->GetView()->GetContentNativeView() 265 scoped_ptr<InfoBarCocoa> infobar(
270 window]; 266 new InfoBarCocoa(delegate.PassAs<InfoBarDelegate>()));
271 base::scoped_nsobject<ExtensionInfoBarController> controller( 267 base::scoped_nsobject<ExtensionInfoBarController> controller(
272 [[ExtensionInfoBarController alloc] initWithInfoBar:infobar.get() 268 [[ExtensionInfoBarController alloc] initWithInfoBar:infobar.get()]);
273 window:window]);
274 infobar->set_controller(controller); 269 infobar->set_controller(controller);
275 return infobar.release(); 270 return infobar.PassAs<InfoBar>();
276 } 271 }
OLDNEW
« no previous file with comments | « chrome/browser/ui/cocoa/infobars/extension_infobar_controller.h ('k') | chrome/browser/ui/cocoa/infobars/infobar_cocoa.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698