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

Side by Side Diff: chrome/browser/ui/cocoa/translate/translate_infobar_base.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 #import "chrome/browser/ui/cocoa/translate/translate_infobar_base.h" 6 #import "chrome/browser/ui/cocoa/translate/translate_infobar_base.h"
7 7
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/metrics/histogram.h" 9 #include "base/metrics/histogram.h"
10 #include "base/sys_string_conversions.h" 10 #include "base/sys_string_conversions.h"
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
101 [item setTarget:target]; 101 [item setTarget:target];
102 if (checked) 102 if (checked)
103 [item setState:NSOnState]; 103 [item setState:NSOnState];
104 if (!enabled) 104 if (!enabled)
105 [item setEnabled:NO]; 105 [item setEnabled:NO];
106 } 106 }
107 } 107 }
108 108
109 } // namespace TranslateInfoBarUtilities 109 } // namespace TranslateInfoBarUtilities
110 110
111 namespace {
112
113 // Helper to close and disable popup menus when the infobar closes.
114 // Disabling the popup button would cause a distracting visual change.
115 void DisablePopUpMenu(NSMenu *menu) {
116 // Remove the menu if visible.
117 [menu cancelTracking];
118
119 // If the menu is re-opened, prevent queries to update items.
120 [menu setDelegate:nil];
121
122 // Prevent target/action messages to the controller.
123 for (NSMenuItem* item in [menu itemArray]) {
124 [item setEnabled:NO];
125 [item setTarget:nil];
126 }
127 }
128
129 } // namespace
130
111 // TranslateInfoBarDelegate views specific method: 131 // TranslateInfoBarDelegate views specific method:
112 InfoBar* TranslateInfoBarDelegate::CreateInfoBar(TabContentsWrapper* owner) { 132 InfoBar* TranslateInfoBarDelegate::CreateInfoBar(TabContentsWrapper* owner) {
113 TranslateInfoBarControllerBase* infobar_controller = NULL; 133 TranslateInfoBarControllerBase* infobar_controller = NULL;
114 switch (type_) { 134 switch (type_) {
115 case BEFORE_TRANSLATE: 135 case BEFORE_TRANSLATE:
116 infobar_controller = 136 infobar_controller =
117 [[BeforeTranslateInfobarController alloc] initWithDelegate:this 137 [[BeforeTranslateInfobarController alloc] initWithDelegate:this
118 owner:owner]; 138 owner:owner];
119 break; 139 break;
120 case AFTER_TRANSLATE: 140 case AFTER_TRANSLATE:
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
302 - (NSArray*)visibleControls { 322 - (NSArray*)visibleControls {
303 return [NSArray array]; 323 return [NSArray array];
304 } 324 }
305 325
306 - (void)rebuildOptionsMenu:(BOOL)hideTitle { 326 - (void)rebuildOptionsMenu:(BOOL)hideTitle {
307 if (![self shouldShowOptionsPopUp]) 327 if (![self shouldShowOptionsPopUp])
308 return; 328 return;
309 329
310 // The options model doesn't know how to handle state transitions, so rebuild 330 // The options model doesn't know how to handle state transitions, so rebuild
311 // it each time through here. 331 // it each time through here.
312 optionsMenuModel_.reset( 332 optionsMenuModel_.reset(new OptionsMenuModel([self delegate]));
313 new OptionsMenuModel([self delegate]));
314 333
315 [optionsPopUp_ removeAllItems]; 334 [optionsPopUp_ removeAllItems];
316 // Set title. 335 // Set title.
317 NSString* optionsLabel = hideTitle ? @"" : 336 NSString* optionsLabel = hideTitle ? @"" :
318 l10n_util::GetNSString(IDS_TRANSLATE_INFOBAR_OPTIONS); 337 l10n_util::GetNSString(IDS_TRANSLATE_INFOBAR_OPTIONS);
319 [optionsPopUp_ addItemWithTitle:optionsLabel]; 338 [optionsPopUp_ addItemWithTitle:optionsLabel];
320 339
321 // Populate options menu. 340 // Populate options menu.
322 NSMenu* optionsMenu = [optionsPopUp_ menu]; 341 NSMenu* optionsMenu = [optionsPopUp_ menu];
323 [optionsMenu setAutoenablesItems:NO]; 342 [optionsMenu setAutoenablesItems:NO];
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
466 [[NSNotificationCenter defaultCenter] 485 [[NSNotificationCenter defaultCenter]
467 addObserver:self 486 addObserver:self
468 selector:@selector(didChangeFrame:) 487 selector:@selector(didChangeFrame:)
469 name:NSViewFrameDidChangeNotification 488 name:NSViewFrameDidChangeNotification
470 object:infoBarView_]; 489 object:infoBarView_];
471 // Show and place GUI elements. 490 // Show and place GUI elements.
472 [self updateState]; 491 [self updateState];
473 } 492 }
474 493
475 - (void)infobarWillClose { 494 - (void)infobarWillClose {
476 [[optionsPopUp_ menu] cancelTracking]; 495 DisablePopUpMenu([fromLanguagePopUp_ menu]);
496 DisablePopUpMenu([toLanguagePopUp_ menu]);
497 DisablePopUpMenu([optionsPopUp_ menu]);
477 [super infobarWillClose]; 498 [super infobarWillClose];
478 } 499 }
479 500
480 - (void)adjustOptionsButtonSizeAndVisibilityForView:(NSView*)lastView { 501 - (void)adjustOptionsButtonSizeAndVisibilityForView:(NSView*)lastView {
481 [optionsPopUp_ setHidden:NO]; 502 [optionsPopUp_ setHidden:NO];
482 [self rebuildOptionsMenu:NO]; 503 [self rebuildOptionsMenu:NO];
483 [[optionsPopUp_ cell] setArrowPosition:NSPopUpArrowAtBottom]; 504 [[optionsPopUp_ cell] setArrowPosition:NSPopUpArrowAtBottom];
484 [optionsPopUp_ sizeToFit]; 505 [optionsPopUp_ sizeToFit];
485 506
486 MoveControl(closeButton_, optionsPopUp_, spaceBetweenControls_, false); 507 MoveControl(closeButton_, optionsPopUp_, spaceBetweenControls_, false);
487 if (!VerifyControlOrderAndSpacing(lastView, optionsPopUp_)) { 508 if (!VerifyControlOrderAndSpacing(lastView, optionsPopUp_)) {
488 [self rebuildOptionsMenu:YES]; 509 [self rebuildOptionsMenu:YES];
489 NSRect oldFrame = [optionsPopUp_ frame]; 510 NSRect oldFrame = [optionsPopUp_ frame];
490 oldFrame.size.width = NSHeight(oldFrame); 511 oldFrame.size.width = NSHeight(oldFrame);
491 [optionsPopUp_ setFrame:oldFrame]; 512 [optionsPopUp_ setFrame:oldFrame];
492 [[optionsPopUp_ cell] setArrowPosition:NSPopUpArrowAtCenter]; 513 [[optionsPopUp_ cell] setArrowPosition:NSPopUpArrowAtCenter];
493 MoveControl(closeButton_, optionsPopUp_, spaceBetweenControls_, false); 514 MoveControl(closeButton_, optionsPopUp_, spaceBetweenControls_, false);
494 if (!VerifyControlOrderAndSpacing(lastView, optionsPopUp_)) { 515 if (!VerifyControlOrderAndSpacing(lastView, optionsPopUp_)) {
495 [optionsPopUp_ setHidden:YES]; 516 [optionsPopUp_ setHidden:YES];
496 } 517 }
497 } 518 }
498 } 519 }
499 520
500 // Called when "Translate" button is clicked. 521 // Called when "Translate" button is clicked.
501 - (IBAction)ok:(id)sender { 522 - (IBAction)ok:(id)sender {
523 // The delegate may be NULL if the infobar was closed.
502 TranslateInfoBarDelegate* delegate = [self delegate]; 524 TranslateInfoBarDelegate* delegate = [self delegate];
503 TranslateInfoBarDelegate::Type state = delegate->type(); 525 if (delegate) {
504 DCHECK(state == TranslateInfoBarDelegate::BEFORE_TRANSLATE || 526 TranslateInfoBarDelegate::Type state = delegate->type();
505 state == TranslateInfoBarDelegate::TRANSLATION_ERROR); 527 DCHECK(state == TranslateInfoBarDelegate::BEFORE_TRANSLATE ||
506 delegate->Translate(); 528 state == TranslateInfoBarDelegate::TRANSLATION_ERROR);
529 delegate->Translate();
530 }
507 UMA_HISTOGRAM_COUNTS("Translate.Translate", 1); 531 UMA_HISTOGRAM_COUNTS("Translate.Translate", 1);
508 } 532 }
509 533
510 // Called when someone clicks on the "Nope" button. 534 // Called when someone clicks on the "Nope" button.
511 - (IBAction)cancel:(id)sender { 535 - (IBAction)cancel:(id)sender {
512 DCHECK( 536 // The delegate may be NULL if the infobar was closed.
513 [self delegate]->type() == TranslateInfoBarDelegate::BEFORE_TRANSLATE); 537 TranslateInfoBarDelegate* delegate = [self delegate];
514 [self delegate]->TranslationDeclined(); 538 if (delegate) {
515 UMA_HISTOGRAM_COUNTS("Translate.DeclineTranslate", 1); 539 DCHECK(delegate->type() == TranslateInfoBarDelegate::BEFORE_TRANSLATE);
540 delegate->TranslationDeclined();
541 UMA_HISTOGRAM_COUNTS("Translate.DeclineTranslate", 1);
542 }
516 [super dismiss:nil]; 543 [super dismiss:nil];
517 } 544 }
518 545
519 - (void)messageButtonPressed:(id)sender { 546 - (void)messageButtonPressed:(id)sender {
520 [self delegate]->MessageInfoBarButtonPressed(); 547 // The delegate may be NULL if the infobar was closed.
548 TranslateInfoBarDelegate* delegate = [self delegate];
549 if (delegate)
550 delegate->MessageInfoBarButtonPressed();
521 } 551 }
522 552
523 - (IBAction)showOriginal:(id)sender { 553 - (IBAction)showOriginal:(id)sender {
524 [self delegate]->RevertTranslation(); 554 // The delegate may be NULL if the infobar was closed.
555 TranslateInfoBarDelegate* delegate = [self delegate];
556 if (delegate)
557 delegate->RevertTranslation();
525 } 558 }
526 559
527 // Called when any of the language drop down menus are changed. 560 // Called when any of the language drop down menus are changed.
528 - (void)languageMenuChanged:(id)item { 561 - (void)languageMenuChanged:(id)item {
562 // The delegate may be NULL if the infobar was closed.
563 if (![self delegate])
564 return;
529 if ([item respondsToSelector:@selector(tag)]) { 565 if ([item respondsToSelector:@selector(tag)]) {
530 int cmd = [item tag]; 566 int cmd = [item tag];
531 if (cmd >= IDC_TRANSLATE_TARGET_LANGUAGE_BASE) { 567 if (cmd >= IDC_TRANSLATE_TARGET_LANGUAGE_BASE) {
532 cmd -= IDC_TRANSLATE_TARGET_LANGUAGE_BASE; 568 cmd -= IDC_TRANSLATE_TARGET_LANGUAGE_BASE;
533 [self targetLanguageModified:cmd]; 569 [self targetLanguageModified:cmd];
534 return; 570 return;
535 } else if (cmd >= IDC_TRANSLATE_ORIGINAL_LANGUAGE_BASE) { 571 } else if (cmd >= IDC_TRANSLATE_ORIGINAL_LANGUAGE_BASE) {
536 cmd -= IDC_TRANSLATE_ORIGINAL_LANGUAGE_BASE; 572 cmd -= IDC_TRANSLATE_ORIGINAL_LANGUAGE_BASE;
537 [self sourceLanguageModified:cmd]; 573 [self sourceLanguageModified:cmd];
538 return; 574 return;
(...skipping 10 matching lines...) Expand all
549 // "About Translate" can open a new tab). 585 // "About Translate" can open a new tab).
550 // Do not access member variables after this line! 586 // Do not access member variables after this line!
551 optionsMenuModel_->ExecuteCommand(cmd); 587 optionsMenuModel_->ExecuteCommand(cmd);
552 } else { 588 } else {
553 NOTREACHED(); 589 NOTREACHED();
554 } 590 }
555 } 591 }
556 592
557 - (void)dealloc { 593 - (void)dealloc {
558 [[NSNotificationCenter defaultCenter] removeObserver:self]; 594 [[NSNotificationCenter defaultCenter] removeObserver:self];
595 [showOriginalButton_ setTarget:nil];
596 [translateMessageButton_ setTarget:nil];
559 [super dealloc]; 597 [super dealloc];
560 } 598 }
561 599
562 #pragma mark NSMenuDelegate 600 #pragma mark NSMenuDelegate
563 601
564 // Invoked by virtue of us being set as the delegate for the options menu. 602 // Invoked by virtue of us being set as the delegate for the options menu.
565 - (void)menuNeedsUpdate:(NSMenu *)menu { 603 - (void)menuNeedsUpdate:(NSMenu *)menu {
566 [self adjustOptionsButtonSizeAndVisibilityForView: 604 [self adjustOptionsButtonSizeAndVisibilityForView:
567 [[self visibleControls] lastObject]]; 605 [[self visibleControls] lastObject]];
568 } 606 }
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
636 return false; 674 return false;
637 } 675 }
638 previousControl = control; 676 previousControl = control;
639 } 677 }
640 678
641 return true; 679 return true;
642 } 680 }
643 681
644 @end // TranslateInfoBarControllerBase (TestingAPI) 682 @end // TranslateInfoBarControllerBase (TestingAPI)
645 683
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698