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

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

Issue 7876004: [Mac] Break stale controller refs in infobar close. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Also fix target on the close button. Created 9 years, 3 months 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) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 <Cocoa/Cocoa.h> 5 #import <Cocoa/Cocoa.h>
6 6
7 #include "base/logging.h" // for NOTREACHED() 7 #include "base/logging.h" // for NOTREACHED()
8 #include "base/mac/mac_util.h" 8 #include "base/mac/mac_util.h"
9 #include "base/sys_string_conversions.h" 9 #include "base/sys_string_conversions.h"
10 #include "chrome/browser/infobars/infobar_tab_helper.h" 10 #include "chrome/browser/infobars/infobar_tab_helper.h"
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
71 if (delegate_->GetIcon()) { 71 if (delegate_->GetIcon()) {
72 [image_ setImage:*(delegate_->GetIcon())]; 72 [image_ setImage:*(delegate_->GetIcon())];
73 } else { 73 } else {
74 // No icon, remove it from the view and grow the textfield to include the 74 // No icon, remove it from the view and grow the textfield to include the
75 // space. 75 // space.
76 NSRect imageFrame = [image_ frame]; 76 NSRect imageFrame = [image_ frame];
77 NSRect labelFrame = [labelPlaceholder_ frame]; 77 NSRect labelFrame = [labelPlaceholder_ frame];
78 labelFrame.size.width += NSMinX(imageFrame) - NSMinX(labelFrame); 78 labelFrame.size.width += NSMinX(imageFrame) - NSMinX(labelFrame);
79 labelFrame.origin.x = imageFrame.origin.x; 79 labelFrame.origin.x = imageFrame.origin.x;
80 [image_ removeFromSuperview]; 80 [image_ removeFromSuperview];
81 image_ = nil;
81 [labelPlaceholder_ setFrame:labelFrame]; 82 [labelPlaceholder_ setFrame:labelFrame];
82 } 83 }
83 [self initializeLabel]; 84 [self initializeLabel];
84 85
85 [self addAdditionalControls]; 86 [self addAdditionalControls];
86 87
87 infoBarView_.tipApex = [self pointForTipApex]; 88 infoBarView_.tipApex = [self pointForTipApex];
88 [infoBarView_ setInfobarType:delegate_->GetInfoBarType()]; 89 [infoBarView_ setInfobarType:delegate_->GetInfoBarType()];
89 } 90 }
90 91
92 - (void)dealloc {
93 [okButton_ setTarget:nil];
94 [cancelButton_ setTarget:nil];
95 [closeButton_ setTarget:nil];
96 [super dealloc];
97 }
98
91 // Called when someone clicks on the embedded link. 99 // Called when someone clicks on the embedded link.
92 - (BOOL) textView:(NSTextView*)textView 100 - (BOOL) textView:(NSTextView*)textView
93 clickedOnLink:(id)link 101 clickedOnLink:(id)link
94 atIndex:(NSUInteger)charIndex { 102 atIndex:(NSUInteger)charIndex {
95 if ([self respondsToSelector:@selector(linkClicked)]) 103 if ([self respondsToSelector:@selector(linkClicked)])
96 [self performSelector:@selector(linkClicked)]; 104 [self performSelector:@selector(linkClicked)];
97 return YES; 105 return YES;
98 } 106 }
99 107
100 // Called when someone clicks on the ok button. 108 // Called when someone clicks on the ok button.
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
169 177
170 - (void)infobarWillClose { 178 - (void)infobarWillClose {
171 // Default implementation does nothing. 179 // Default implementation does nothing.
172 } 180 }
173 181
174 - (void)removeButtons { 182 - (void)removeButtons {
175 // Extend the label all the way across. 183 // Extend the label all the way across.
176 NSRect labelFrame = [label_.get() frame]; 184 NSRect labelFrame = [label_.get() frame];
177 labelFrame.size.width = NSMaxX([cancelButton_ frame]) - NSMinX(labelFrame); 185 labelFrame.size.width = NSMaxX([cancelButton_ frame]) - NSMinX(labelFrame);
178 [okButton_ removeFromSuperview]; 186 [okButton_ removeFromSuperview];
187 okButton_ = nil;
179 [cancelButton_ removeFromSuperview]; 188 [cancelButton_ removeFromSuperview];
189 cancelButton_ = nil;
180 [label_.get() setFrame:labelFrame]; 190 [label_.get() setFrame:labelFrame];
181 } 191 }
182 192
183 @end 193 @end
184 194
185 @implementation InfoBarController (PrivateMethods) 195 @implementation InfoBarController (PrivateMethods)
186 196
187 - (void)initializeLabel { 197 - (void)initializeLabel {
188 // Replace the label placeholder NSTextField with the real label NSTextView. 198 // Replace the label placeholder NSTextField with the real label NSTextView.
189 // The former doesn't show links in a nice way, but the latter can't be added 199 // The former doesn't show links in a nice way, but the latter can't be added
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
352 okButtonFrame = [okButton_ frame]; 362 okButtonFrame = [okButton_ frame];
353 363
354 // Position the ok button to the left of the Close button. 364 // Position the ok button to the left of the Close button.
355 okButtonFrame.origin.x = rightEdge - okButtonFrame.size.width; 365 okButtonFrame.origin.x = rightEdge - okButtonFrame.size.width;
356 [okButton_ setFrame:okButtonFrame]; 366 [okButton_ setFrame:okButtonFrame];
357 367
358 // Update the rightEdge 368 // Update the rightEdge
359 rightEdge = NSMinX(okButtonFrame); 369 rightEdge = NSMinX(okButtonFrame);
360 } else { 370 } else {
361 [okButton_ removeFromSuperview]; 371 [okButton_ removeFromSuperview];
372 okButton_ = nil;
362 } 373 }
363 374
364 // Update and position the Cancel button if needed. Otherwise, hide it. 375 // Update and position the Cancel button if needed. Otherwise, hide it.
365 if (visibleButtons & ConfirmInfoBarDelegate::BUTTON_CANCEL) { 376 if (visibleButtons & ConfirmInfoBarDelegate::BUTTON_CANCEL) {
366 [cancelButton_ setTitle:base::SysUTF16ToNSString( 377 [cancelButton_ setTitle:base::SysUTF16ToNSString(
367 delegate->GetButtonLabel(ConfirmInfoBarDelegate::BUTTON_CANCEL))]; 378 delegate->GetButtonLabel(ConfirmInfoBarDelegate::BUTTON_CANCEL))];
368 [GTMUILocalizerAndLayoutTweaker sizeToFitView:cancelButton_]; 379 [GTMUILocalizerAndLayoutTweaker sizeToFitView:cancelButton_];
369 cancelButtonFrame = [cancelButton_ frame]; 380 cancelButtonFrame = [cancelButton_ frame];
370 381
371 // If we had a Ok button, leave space between the buttons. 382 // If we had a Ok button, leave space between the buttons.
372 if (visibleButtons & ConfirmInfoBarDelegate::BUTTON_OK) { 383 if (visibleButtons & ConfirmInfoBarDelegate::BUTTON_OK) {
373 rightEdge -= spaceBetweenButtons; 384 rightEdge -= spaceBetweenButtons;
374 } 385 }
375 386
376 // Position the Cancel button on our current right edge. 387 // Position the Cancel button on our current right edge.
377 cancelButtonFrame.origin.x = rightEdge - cancelButtonFrame.size.width; 388 cancelButtonFrame.origin.x = rightEdge - cancelButtonFrame.size.width;
378 [cancelButton_ setFrame:cancelButtonFrame]; 389 [cancelButton_ setFrame:cancelButtonFrame];
379 390
380 // Update the rightEdge. 391 // Update the rightEdge.
381 rightEdge = NSMinX(cancelButtonFrame); 392 rightEdge = NSMinX(cancelButtonFrame);
382 } else { 393 } else {
383 [cancelButton_ removeFromSuperview]; 394 [cancelButton_ removeFromSuperview];
395 cancelButton_ = nil;
384 } 396 }
385 397
386 // If we had either button, leave space before the edge of the textfield. 398 // If we had either button, leave space before the edge of the textfield.
387 if ((visibleButtons & ConfirmInfoBarDelegate::BUTTON_CANCEL) || 399 if ((visibleButtons & ConfirmInfoBarDelegate::BUTTON_CANCEL) ||
388 (visibleButtons & ConfirmInfoBarDelegate::BUTTON_OK)) { 400 (visibleButtons & ConfirmInfoBarDelegate::BUTTON_OK)) {
389 rightEdge -= spaceBeforeButtons; 401 rightEdge -= spaceBeforeButtons;
390 } 402 }
391 403
392 NSRect frame = [label_.get() frame]; 404 NSRect frame = [label_.get() frame];
393 DCHECK(rightEdge > NSMinX(frame)) 405 DCHECK(rightEdge > NSMinX(frame))
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
434 LinkInfoBarController* controller = 446 LinkInfoBarController* controller =
435 [[LinkInfoBarController alloc] initWithDelegate:this owner:owner]; 447 [[LinkInfoBarController alloc] initWithDelegate:this owner:owner];
436 return new InfoBar(controller, this); 448 return new InfoBar(controller, this);
437 } 449 }
438 450
439 InfoBar* ConfirmInfoBarDelegate::CreateInfoBar(TabContentsWrapper* owner) { 451 InfoBar* ConfirmInfoBarDelegate::CreateInfoBar(TabContentsWrapper* owner) {
440 ConfirmInfoBarController* controller = 452 ConfirmInfoBarController* controller =
441 [[ConfirmInfoBarController alloc] initWithDelegate:this owner:owner]; 453 [[ConfirmInfoBarController alloc] initWithDelegate:this owner:owner];
442 return new InfoBar(controller, this); 454 return new InfoBar(controller, this);
443 } 455 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698