| Index: chrome/browser/ui/cocoa/translate/translate_infobar_base.mm
|
| diff --git a/chrome/browser/ui/cocoa/translate/translate_infobar_base.mm b/chrome/browser/ui/cocoa/translate/translate_infobar_base.mm
|
| index 63b6799d28cb9b6958f8f4a75148a6b6a4d1e307..08655e7fbf8f7c1fe92b47b8ee5def3b2de662a8 100644
|
| --- a/chrome/browser/ui/cocoa/translate/translate_infobar_base.mm
|
| +++ b/chrome/browser/ui/cocoa/translate/translate_infobar_base.mm
|
| @@ -108,6 +108,26 @@ void AddMenuItem(NSMenu *menu, id target, SEL selector, NSString* title,
|
|
|
| } // namespace TranslateInfoBarUtilities
|
|
|
| +namespace {
|
| +
|
| +// Helper to close and disable popup menus when the infobar closes.
|
| +// Disabling the popup button would cause a distracting visual change.
|
| +void DisablePopUpMenu(NSMenu *menu) {
|
| + // Remove the menu if visible.
|
| + [menu cancelTracking];
|
| +
|
| + // If the menu is re-opened, prevent queries to update items.
|
| + [menu setDelegate:nil];
|
| +
|
| + // Prevent target/action messages to the controller.
|
| + for (NSMenuItem* item in [menu itemArray]) {
|
| + [item setEnabled:NO];
|
| + [item setTarget:nil];
|
| + }
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| // TranslateInfoBarDelegate views specific method:
|
| InfoBar* TranslateInfoBarDelegate::CreateInfoBar(TabContentsWrapper* owner) {
|
| TranslateInfoBarControllerBase* infobar_controller = NULL;
|
| @@ -309,8 +329,7 @@ InfoBar* TranslateInfoBarDelegate::CreateInfoBar(TabContentsWrapper* owner) {
|
|
|
| // The options model doesn't know how to handle state transitions, so rebuild
|
| // it each time through here.
|
| - optionsMenuModel_.reset(
|
| - new OptionsMenuModel([self delegate]));
|
| + optionsMenuModel_.reset(new OptionsMenuModel([self delegate]));
|
|
|
| [optionsPopUp_ removeAllItems];
|
| // Set title.
|
| @@ -473,7 +492,9 @@ InfoBar* TranslateInfoBarDelegate::CreateInfoBar(TabContentsWrapper* owner) {
|
| }
|
|
|
| - (void)infobarWillClose {
|
| - [[optionsPopUp_ menu] cancelTracking];
|
| + DisablePopUpMenu([fromLanguagePopUp_ menu]);
|
| + DisablePopUpMenu([toLanguagePopUp_ menu]);
|
| + DisablePopUpMenu([optionsPopUp_ menu]);
|
| [super infobarWillClose];
|
| }
|
|
|
| @@ -499,33 +520,48 @@ InfoBar* TranslateInfoBarDelegate::CreateInfoBar(TabContentsWrapper* owner) {
|
|
|
| // Called when "Translate" button is clicked.
|
| - (IBAction)ok:(id)sender {
|
| + // The delegate may be NULL if the infobar was closed.
|
| TranslateInfoBarDelegate* delegate = [self delegate];
|
| - TranslateInfoBarDelegate::Type state = delegate->type();
|
| - DCHECK(state == TranslateInfoBarDelegate::BEFORE_TRANSLATE ||
|
| - state == TranslateInfoBarDelegate::TRANSLATION_ERROR);
|
| - delegate->Translate();
|
| + if (delegate) {
|
| + TranslateInfoBarDelegate::Type state = delegate->type();
|
| + DCHECK(state == TranslateInfoBarDelegate::BEFORE_TRANSLATE ||
|
| + state == TranslateInfoBarDelegate::TRANSLATION_ERROR);
|
| + delegate->Translate();
|
| + }
|
| UMA_HISTOGRAM_COUNTS("Translate.Translate", 1);
|
| }
|
|
|
| // Called when someone clicks on the "Nope" button.
|
| - (IBAction)cancel:(id)sender {
|
| - DCHECK(
|
| - [self delegate]->type() == TranslateInfoBarDelegate::BEFORE_TRANSLATE);
|
| - [self delegate]->TranslationDeclined();
|
| - UMA_HISTOGRAM_COUNTS("Translate.DeclineTranslate", 1);
|
| + // The delegate may be NULL if the infobar was closed.
|
| + TranslateInfoBarDelegate* delegate = [self delegate];
|
| + if (delegate) {
|
| + DCHECK(delegate->type() == TranslateInfoBarDelegate::BEFORE_TRANSLATE);
|
| + delegate->TranslationDeclined();
|
| + UMA_HISTOGRAM_COUNTS("Translate.DeclineTranslate", 1);
|
| + }
|
| [super dismiss:nil];
|
| }
|
|
|
| - (void)messageButtonPressed:(id)sender {
|
| - [self delegate]->MessageInfoBarButtonPressed();
|
| + // The delegate may be NULL if the infobar was closed.
|
| + TranslateInfoBarDelegate* delegate = [self delegate];
|
| + if (delegate)
|
| + delegate->MessageInfoBarButtonPressed();
|
| }
|
|
|
| - (IBAction)showOriginal:(id)sender {
|
| - [self delegate]->RevertTranslation();
|
| + // The delegate may be NULL if the infobar was closed.
|
| + TranslateInfoBarDelegate* delegate = [self delegate];
|
| + if (delegate)
|
| + delegate->RevertTranslation();
|
| }
|
|
|
| // Called when any of the language drop down menus are changed.
|
| - (void)languageMenuChanged:(id)item {
|
| + // The delegate may be NULL if the infobar was closed.
|
| + if (![self delegate])
|
| + return;
|
| if ([item respondsToSelector:@selector(tag)]) {
|
| int cmd = [item tag];
|
| if (cmd >= IDC_TRANSLATE_TARGET_LANGUAGE_BASE) {
|
| @@ -556,6 +592,8 @@ InfoBar* TranslateInfoBarDelegate::CreateInfoBar(TabContentsWrapper* owner) {
|
|
|
| - (void)dealloc {
|
| [[NSNotificationCenter defaultCenter] removeObserver:self];
|
| + [showOriginalButton_ setTarget:nil];
|
| + [translateMessageButton_ setTarget:nil];
|
| [super dealloc];
|
| }
|
|
|
|
|