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

Side by Side Diff: chrome/browser/ui/cocoa/translate/translate_infobar_base.mm

Issue 7981045: Make infobars ignore button clicks when closing. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 2 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
131 // TranslateInfoBarDelegate views specific method: 111 // TranslateInfoBarDelegate views specific method:
132 InfoBar* TranslateInfoBarDelegate::CreateInfoBar(TabContentsWrapper* owner) { 112 InfoBar* TranslateInfoBarDelegate::CreateInfoBar(TabContentsWrapper* owner) {
133 TranslateInfoBarControllerBase* infobar_controller = NULL; 113 TranslateInfoBarControllerBase* infobar_controller = NULL;
134 switch (type_) { 114 switch (type_) {
135 case BEFORE_TRANSLATE: 115 case BEFORE_TRANSLATE:
136 infobar_controller = 116 infobar_controller =
137 [[BeforeTranslateInfobarController alloc] initWithDelegate:this 117 [[BeforeTranslateInfobarController alloc] initWithDelegate:this
138 owner:owner]; 118 owner:owner];
139 break; 119 break;
140 case AFTER_TRANSLATE: 120 case AFTER_TRANSLATE:
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after
485 [[NSNotificationCenter defaultCenter] 465 [[NSNotificationCenter defaultCenter]
486 addObserver:self 466 addObserver:self
487 selector:@selector(didChangeFrame:) 467 selector:@selector(didChangeFrame:)
488 name:NSViewFrameDidChangeNotification 468 name:NSViewFrameDidChangeNotification
489 object:infoBarView_]; 469 object:infoBarView_];
490 // Show and place GUI elements. 470 // Show and place GUI elements.
491 [self updateState]; 471 [self updateState];
492 } 472 }
493 473
494 - (void)infobarWillClose { 474 - (void)infobarWillClose {
495 DisablePopUpMenu([fromLanguagePopUp_ menu]); 475 [self disablePopUpMenu:[fromLanguagePopUp_ menu]];
496 DisablePopUpMenu([toLanguagePopUp_ menu]); 476 [self disablePopUpMenu:[toLanguagePopUp_ menu]];
497 DisablePopUpMenu([optionsPopUp_ menu]); 477 [self disablePopUpMenu:[optionsPopUp_ menu]];
498 [super infobarWillClose]; 478 [super infobarWillClose];
499 } 479 }
500 480
501 - (void)adjustOptionsButtonSizeAndVisibilityForView:(NSView*)lastView { 481 - (void)adjustOptionsButtonSizeAndVisibilityForView:(NSView*)lastView {
502 [optionsPopUp_ setHidden:NO]; 482 [optionsPopUp_ setHidden:NO];
503 [self rebuildOptionsMenu:NO]; 483 [self rebuildOptionsMenu:NO];
504 [[optionsPopUp_ cell] setArrowPosition:NSPopUpArrowAtBottom]; 484 [[optionsPopUp_ cell] setArrowPosition:NSPopUpArrowAtBottom];
505 [optionsPopUp_ sizeToFit]; 485 [optionsPopUp_ sizeToFit];
506 486
507 MoveControl(closeButton_, optionsPopUp_, spaceBetweenControls_, false); 487 MoveControl(closeButton_, optionsPopUp_, spaceBetweenControls_, false);
508 if (!VerifyControlOrderAndSpacing(lastView, optionsPopUp_)) { 488 if (!VerifyControlOrderAndSpacing(lastView, optionsPopUp_)) {
509 [self rebuildOptionsMenu:YES]; 489 [self rebuildOptionsMenu:YES];
510 NSRect oldFrame = [optionsPopUp_ frame]; 490 NSRect oldFrame = [optionsPopUp_ frame];
511 oldFrame.size.width = NSHeight(oldFrame); 491 oldFrame.size.width = NSHeight(oldFrame);
512 [optionsPopUp_ setFrame:oldFrame]; 492 [optionsPopUp_ setFrame:oldFrame];
513 [[optionsPopUp_ cell] setArrowPosition:NSPopUpArrowAtCenter]; 493 [[optionsPopUp_ cell] setArrowPosition:NSPopUpArrowAtCenter];
514 MoveControl(closeButton_, optionsPopUp_, spaceBetweenControls_, false); 494 MoveControl(closeButton_, optionsPopUp_, spaceBetweenControls_, false);
515 if (!VerifyControlOrderAndSpacing(lastView, optionsPopUp_)) { 495 if (!VerifyControlOrderAndSpacing(lastView, optionsPopUp_)) {
516 [optionsPopUp_ setHidden:YES]; 496 [optionsPopUp_ setHidden:YES];
517 } 497 }
518 } 498 }
519 } 499 }
520 500
521 // Called when "Translate" button is clicked. 501 // Called when "Translate" button is clicked.
522 - (IBAction)ok:(id)sender { 502 - (IBAction)ok:(id)sender {
523 // The delegate may be NULL if the infobar was closed. 503 if (![self isOwned])
504 return;
524 TranslateInfoBarDelegate* delegate = [self delegate]; 505 TranslateInfoBarDelegate* delegate = [self delegate];
525 if (delegate) { 506 TranslateInfoBarDelegate::Type state = delegate->type();
526 TranslateInfoBarDelegate::Type state = delegate->type(); 507 DCHECK(state == TranslateInfoBarDelegate::BEFORE_TRANSLATE ||
527 DCHECK(state == TranslateInfoBarDelegate::BEFORE_TRANSLATE || 508 state == TranslateInfoBarDelegate::TRANSLATION_ERROR);
528 state == TranslateInfoBarDelegate::TRANSLATION_ERROR); 509 delegate->Translate();
529 delegate->Translate();
530 }
531 UMA_HISTOGRAM_COUNTS("Translate.Translate", 1); 510 UMA_HISTOGRAM_COUNTS("Translate.Translate", 1);
532 } 511 }
533 512
534 // Called when someone clicks on the "Nope" button. 513 // Called when someone clicks on the "Nope" button.
535 - (IBAction)cancel:(id)sender { 514 - (IBAction)cancel:(id)sender {
536 // The delegate may be NULL if the infobar was closed. 515 if (![self isOwned])
516 return;
537 TranslateInfoBarDelegate* delegate = [self delegate]; 517 TranslateInfoBarDelegate* delegate = [self delegate];
538 if (delegate) { 518 DCHECK(delegate->type() == TranslateInfoBarDelegate::BEFORE_TRANSLATE);
539 DCHECK(delegate->type() == TranslateInfoBarDelegate::BEFORE_TRANSLATE); 519 delegate->TranslationDeclined();
540 delegate->TranslationDeclined(); 520 UMA_HISTOGRAM_COUNTS("Translate.DeclineTranslate", 1);
541 UMA_HISTOGRAM_COUNTS("Translate.DeclineTranslate", 1); 521 [super removeSelf];
542 }
543 [super dismiss:nil];
544 } 522 }
545 523
546 - (void)messageButtonPressed:(id)sender { 524 - (void)messageButtonPressed:(id)sender {
547 // The delegate may be NULL if the infobar was closed. 525 if (![self isOwned])
548 TranslateInfoBarDelegate* delegate = [self delegate]; 526 return;
549 if (delegate) 527 [self delegate]->MessageInfoBarButtonPressed();
550 delegate->MessageInfoBarButtonPressed();
551 } 528 }
552 529
553 - (IBAction)showOriginal:(id)sender { 530 - (IBAction)showOriginal:(id)sender {
554 // The delegate may be NULL if the infobar was closed. 531 if (![self isOwned])
555 TranslateInfoBarDelegate* delegate = [self delegate]; 532 return;
556 if (delegate) 533 [self delegate]->RevertTranslation();
557 delegate->RevertTranslation();
558 } 534 }
559 535
560 // Called when any of the language drop down menus are changed. 536 // Called when any of the language drop down menus are changed.
561 - (void)languageMenuChanged:(id)item { 537 - (void)languageMenuChanged:(id)item {
562 // The delegate may be NULL if the infobar was closed. 538 if (![self isOwned])
563 if (![self delegate])
564 return; 539 return;
565 if ([item respondsToSelector:@selector(tag)]) { 540 if ([item respondsToSelector:@selector(tag)]) {
566 int cmd = [item tag]; 541 int cmd = [item tag];
567 if (cmd >= IDC_TRANSLATE_TARGET_LANGUAGE_BASE) { 542 if (cmd >= IDC_TRANSLATE_TARGET_LANGUAGE_BASE) {
568 cmd -= IDC_TRANSLATE_TARGET_LANGUAGE_BASE; 543 cmd -= IDC_TRANSLATE_TARGET_LANGUAGE_BASE;
569 [self targetLanguageModified:cmd]; 544 [self targetLanguageModified:cmd];
570 return; 545 return;
571 } else if (cmd >= IDC_TRANSLATE_ORIGINAL_LANGUAGE_BASE) { 546 } else if (cmd >= IDC_TRANSLATE_ORIGINAL_LANGUAGE_BASE) {
572 cmd -= IDC_TRANSLATE_ORIGINAL_LANGUAGE_BASE; 547 cmd -= IDC_TRANSLATE_ORIGINAL_LANGUAGE_BASE;
573 [self sourceLanguageModified:cmd]; 548 [self sourceLanguageModified:cmd];
574 return; 549 return;
575 } 550 }
576 } 551 }
577 NOTREACHED() << "Language menu was changed with a bad language ID"; 552 NOTREACHED() << "Language menu was changed with a bad language ID";
578 } 553 }
579 554
580 // Called when the options menu is changed. 555 // Called when the options menu is changed.
581 - (void)optionsMenuChanged:(id)item { 556 - (void)optionsMenuChanged:(id)item {
557 if (![self isOwned])
558 return;
582 if ([item respondsToSelector:@selector(tag)]) { 559 if ([item respondsToSelector:@selector(tag)]) {
583 int cmd = [item tag]; 560 int cmd = [item tag];
584 // Danger Will Robinson! : This call can release the infobar (e.g. invoking 561 // Danger Will Robinson! : This call can release the infobar (e.g. invoking
585 // "About Translate" can open a new tab). 562 // "About Translate" can open a new tab).
586 // Do not access member variables after this line! 563 // Do not access member variables after this line!
587 optionsMenuModel_->ExecuteCommand(cmd); 564 optionsMenuModel_->ExecuteCommand(cmd);
588 } else { 565 } else {
589 NOTREACHED(); 566 NOTREACHED();
590 } 567 }
591 } 568 }
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
674 return false; 651 return false;
675 } 652 }
676 previousControl = control; 653 previousControl = control;
677 } 654 }
678 655
679 return true; 656 return true;
680 } 657 }
681 658
682 @end // TranslateInfoBarControllerBase (TestingAPI) 659 @end // TranslateInfoBarControllerBase (TestingAPI)
683 660
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698