Commit fe01fb1d authored by Peter Boström's avatar Peter Boström Committed by Commit Bot

Make UX-requested updates to Translate bubble.

* Rename "More Options" back to "Options" (distinguisher no longer
  necessary).
* Update in-progress title to "Translating...".
* Update done title to "Translated".
* Show "Options" menu from done panel.
* Move "Always translate" checkbox inside advanced panel.
* Remove "Language settings" link from advanced panel (not slated for
  updated UI either).
* Update "never" options to state "Don't translate X" instead of "Never
  translate X".

Also replaces the views::MenuButton with a Harmony-compliant bubble and
updates the option menu on every click so any language changes done
inside the advanced panel are reflected in the menu outside.

TBR=tapted@chromium.org

Bug: chromium:730521
Change-Id: I2e05bdacfb7c9e487e4f7f32e7934ba521ef54bd
Reviewed-on: https://chromium-review.googlesource.com/832850
Commit-Queue: Peter Boström <pbos@chromium.org>
Reviewed-by: default avatarBret Sepulveda <bsep@chromium.org>
Cr-Commit-Position: refs/heads/master@{#526085}
parent f0cc25a4
......@@ -8509,7 +8509,7 @@ Please help our engineers fix this problem. Tell us what happened right before y
Options
</message>
<message name="IDS_TRANSLATE_BUBBLE_ADVANCED_BUTTON" desc="Text to show for the translate bubble button to jump to the advanced panel.">
More options
Options
</message>
<message name="IDS_TRANSLATE_BUBBLE_ADVANCED_MENU_BUTTON" desc="Text to show for the translate bubble menu button to jump to the advanced panel, specifically to change which languages are translated between.">
Change languages
......@@ -8533,13 +8533,13 @@ Please help our engineers fix this problem. Tell us what happened right before y
Never translate this site
</message>
<message name="IDS_TRANSLATE_BUBBLE_TRANSLATING" desc="Text to show for the translate bubble label when page is currently being translated by servers">
This page is being translated...
Translating...
</message>
<message name="IDS_TRANSLATE_BUBBLE_TRANSLATED" desc="Text to show for the translate bubble label when the page has been translated from one language to another">
This page has been translated.
</message>
<message name="IDS_TRANSLATE_BUBBLE_TRANSLATED_TITLE" desc="Title text for the translate bubble label when the page has been translated from one language to another">
This page has been translated
Translated
</message>
<message name="IDS_TRANSLATE_BUBBLE_REVERT" desc="Text to show for the translate bubble button to revert translation of translated page">
Show original
......@@ -8583,7 +8583,7 @@ Please help our engineers fix this problem. Tell us what happened right before y
Options
</message>
<message name="IDS_TRANSLATE_BUBBLE_ADVANCED_BUTTON" desc="In Title Case: Text to show for the translate bubble button to jump to the advanced panel.">
More Options
Options
</message>
<message name="IDS_TRANSLATE_BUBBLE_ADVANCED_MENU_BUTTON" desc="In Title Case: Text to show for the translate bubble menu button to jump to the advanced panel, specifically to change which languages are translated between.">
Change Languages
......@@ -8607,13 +8607,13 @@ Please help our engineers fix this problem. Tell us what happened right before y
Never Translate This Site
</message>
<message name="IDS_TRANSLATE_BUBBLE_TRANSLATING" desc="In Title Case: Text to show for the translate bubble label when page is currently being translated by servers">
This Page Is Being Translated...
Translating...
</message>
<message name="IDS_TRANSLATE_BUBBLE_TRANSLATED" desc="In Title Case: Text to show for the translate bubble label when the page has been translated from one language to another">
This Page Has Been Translated.
</message>
<message name="IDS_TRANSLATE_BUBBLE_TRANSLATED_TITLE" desc="In Title Case: Title text for the translate bubble label when the page has been translated from one language to another">
This Page Has Been Translated
Translated
</message>
<message name="IDS_TRANSLATE_BUBBLE_REVERT" desc="In Title Case: Text to show for the translate bubble button to revert translation of translated page">
Show Original
......
......@@ -11,6 +11,8 @@
#include "chrome/browser/ui/cocoa/translate/translate_bubble_controller.h"
#include "chrome/browser/ui/translate/translate_bubble_model.h"
#include "chrome/browser/ui/views/translate/translate_bubble_view.h"
#include "ui/events/keycodes/dom/dom_code.h"
#include "ui/views/controls/button/label_button.h"
// TODO(groby): Share with translate_bubble_controller_unittest.mm
@implementation BrowserWindowController (ForTesting)
......@@ -44,7 +46,13 @@ void PressTranslate(Browser* browser) {
if (chrome::ShowAllDialogsWithViewsToolkit()) {
TranslateBubbleView* bubble = TranslateBubbleView::GetCurrentBubble();
DCHECK(bubble);
bubble->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_TRANSLATE);
views::LabelButton button(nullptr, base::string16());
button.set_id(TranslateBubbleView::BUTTON_ID_TRANSLATE);
bubble->ButtonPressed(&button,
ui::KeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_RETURN,
ui::DomCode::ENTER, ui::EF_NONE));
return;
}
......
......@@ -7,6 +7,8 @@
#include "base/logging.h"
#include "chrome/browser/ui/translate/translate_bubble_model.h"
#include "chrome/browser/ui/views/translate/translate_bubble_view.h"
#include "ui/events/keycodes/dom/dom_code.h"
#include "ui/views/controls/button/label_button.h"
#include "ui/views/controls/combobox/combobox.h"
namespace translate {
......@@ -23,14 +25,26 @@ void PressTranslate(Browser* browser) {
DCHECK(browser);
TranslateBubbleView* bubble = TranslateBubbleView::GetCurrentBubble();
DCHECK(bubble);
bubble->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_TRANSLATE);
views::LabelButton button(nullptr, base::string16());
button.set_id(TranslateBubbleView::BUTTON_ID_TRANSLATE);
bubble->ButtonPressed(&button,
ui::KeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_RETURN,
ui::DomCode::ENTER, ui::EF_NONE));
}
void PressRevert(Browser* browser) {
DCHECK(browser);
TranslateBubbleView* bubble = TranslateBubbleView::GetCurrentBubble();
DCHECK(bubble);
bubble->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_SHOW_ORIGINAL);
views::LabelButton button(nullptr, base::string16());
button.set_id(TranslateBubbleView::BUTTON_ID_SHOW_ORIGINAL);
bubble->ButtonPressed(&button,
ui::KeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_RETURN,
ui::DomCode::ENTER, ui::EF_NONE));
}
void SelectTargetLanguageByDisplayName(Browser* browser,
......
......@@ -245,7 +245,50 @@ void TranslateBubbleView::Init() {
void TranslateBubbleView::ButtonPressed(views::Button* sender,
const ui::Event& event) {
HandleButtonPressed(static_cast<ButtonID>(sender->id()));
switch (static_cast<ButtonID>(sender->id())) {
case BUTTON_ID_TRANSLATE: {
Translate();
break;
}
case BUTTON_ID_DONE: {
ConfirmAdvancedOptions();
break;
}
case BUTTON_ID_CANCEL: {
model_->GoBackFromAdvanced();
UpdateChildVisibilities();
SizeToContents();
translate::ReportUiAction(translate::CANCEL_BUTTON_CLICKED);
break;
}
case BUTTON_ID_TRY_AGAIN: {
model_->Translate();
translate::ReportUiAction(translate::TRY_AGAIN_BUTTON_CLICKED);
break;
}
case BUTTON_ID_SHOW_ORIGINAL: {
ShowOriginal();
break;
}
case BUTTON_ID_ALWAYS_TRANSLATE: {
views::Checkbox* always_checkbox = GetAlwaysTranslateCheckbox();
DCHECK(always_checkbox);
should_always_translate_ = always_checkbox->checked();
translate::ReportUiAction(should_always_translate_
? translate::ALWAYS_TRANSLATE_CHECKED
: translate::ALWAYS_TRANSLATE_UNCHECKED);
break;
}
case BUTTON_ID_ADVANCED: {
SwitchView(TranslateBubbleModel::VIEW_STATE_ADVANCED);
translate::ReportUiAction(translate::ADVANCED_BUTTON_CLICKED);
break;
}
case BUTTON_ID_OPTIONS_MENU: {
ShowOptionsMenu(sender);
break;
}
}
}
views::View* TranslateBubbleView::GetInitiallyFocusedView() {
......@@ -278,7 +321,7 @@ bool TranslateBubbleView::AcceleratorPressed(
switch (model_->GetViewState()) {
case TranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE: {
if (accelerator.key_code() == ui::VKEY_RETURN) {
HandleButtonPressed(BUTTON_ID_TRANSLATE);
Translate();
return true;
}
break;
......@@ -287,7 +330,7 @@ bool TranslateBubbleView::AcceleratorPressed(
break;
case TranslateBubbleModel::VIEW_STATE_AFTER_TRANSLATE: {
if (accelerator.key_code() == ui::VKEY_RETURN) {
HandleButtonPressed(BUTTON_ID_SHOW_ORIGINAL);
ShowOriginal();
return true;
}
break;
......@@ -296,7 +339,7 @@ bool TranslateBubbleView::AcceleratorPressed(
break;
case TranslateBubbleModel::VIEW_STATE_ADVANCED: {
if (accelerator.key_code() == ui::VKEY_RETURN) {
HandleButtonPressed(BUTTON_ID_DONE);
ConfirmAdvancedOptions();
return true;
}
break;
......@@ -323,53 +366,50 @@ void TranslateBubbleView::LinkClicked(views::Link* source, int event_flags) {
HandleLinkClicked(static_cast<LinkID>(source->id()));
}
void TranslateBubbleView::OnMenuButtonClicked(views::MenuButton* source,
const gfx::Point& point,
const ui::Event* event) {
if (!options_menu_runner_) {
options_menu_model_.reset(new ui::SimpleMenuModel(this));
options_menu_model_->AddCheckItem(
DenialMenuItem::ALWAYS_TRANSLATE_LANGUAGE,
l10n_util::GetStringFUTF16(
IDS_TRANSLATE_BUBBLE_ALWAYS_TRANSLATE_LANG,
model_->GetLanguageNameAt(model_->GetOriginalLanguageIndex())));
options_menu_model_->AddItem(
DenialMenuItem::NEVER_TRANSLATE_LANGUAGE,
l10n_util::GetStringFUTF16(
IDS_TRANSLATE_BUBBLE_NEVER_TRANSLATE_LANG,
model_->GetLanguageNameAt(model_->GetOriginalLanguageIndex())));
// TODO(crbug.com/793925): Blacklisting should probably not be possible in
// incognito mode as it leaves a trace of the user.
if (model_->CanBlacklistSite()) {
if (Use2016Q2UI()) {
options_menu_model_->AddSeparator(ui::NORMAL_SEPARATOR);
}
options_menu_model_->AddItemWithStringId(
DenialMenuItem::NEVER_TRANSLATE_SITE,
IDS_TRANSLATE_BUBBLE_NEVER_TRANSLATE_SITE);
void TranslateBubbleView::ShowOptionsMenu(views::Button* source) {
// Recreate the menu model as translated languages can change while the menu
// is not showing, which invalidates these text strings.
options_menu_model_.reset(new ui::SimpleMenuModel(this));
options_menu_model_->AddCheckItem(
OptionsMenuItem::ALWAYS_TRANSLATE_LANGUAGE,
l10n_util::GetStringFUTF16(
IDS_TRANSLATE_BUBBLE_ALWAYS_TRANSLATE_LANG,
model_->GetLanguageNameAt(model_->GetOriginalLanguageIndex())));
options_menu_model_->AddItem(
OptionsMenuItem::NEVER_TRANSLATE_LANGUAGE,
l10n_util::GetStringFUTF16(
IDS_TRANSLATE_BUBBLE_NEVER_TRANSLATE_LANG,
model_->GetLanguageNameAt(model_->GetOriginalLanguageIndex())));
// TODO(https://crbug.com/793925): Blacklisting should probably not be
// possible in incognito mode as it leaves a trace of the user.
if (model_->CanBlacklistSite()) {
if (Use2016Q2UI()) {
options_menu_model_->AddSeparator(ui::NORMAL_SEPARATOR);
}
if (!Use2016Q2UI()) {
options_menu_model_->AddItemWithStringId(
DenialMenuItem::MORE_OPTIONS,
IDS_TRANSLATE_BUBBLE_ADVANCED_MENU_BUTTON);
}
options_menu_model_->AddItemWithStringId(
OptionsMenuItem::NEVER_TRANSLATE_SITE,
IDS_TRANSLATE_BUBBLE_NEVER_TRANSLATE_SITE);
}
options_menu_runner_.reset(
new views::MenuRunner(options_menu_model_.get(), 0));
if (!Use2016Q2UI()) {
options_menu_model_->AddItemWithStringId(
OptionsMenuItem::MORE_OPTIONS,
IDS_TRANSLATE_BUBBLE_ADVANCED_MENU_BUTTON);
}
options_menu_runner_.reset(
new views::MenuRunner(options_menu_model_.get(), 0));
gfx::Rect screen_bounds = source->GetBoundsInScreen();
options_menu_runner_->RunMenuAt(source->GetWidget(), source, screen_bounds,
options_menu_runner_->RunMenuAt(source->GetWidget(), nullptr, screen_bounds,
views::MENU_ANCHOR_TOPRIGHT,
ui::MENU_SOURCE_MOUSE);
}
bool TranslateBubbleView::IsCommandIdChecked(int command_id) const {
DCHECK_EQ(DenialMenuItem::ALWAYS_TRANSLATE_LANGUAGE, command_id);
DCHECK_EQ(OptionsMenuItem::ALWAYS_TRANSLATE_LANGUAGE, command_id);
return should_always_translate_;
}
......@@ -379,30 +419,32 @@ bool TranslateBubbleView::IsCommandIdEnabled(int command_id) const {
void TranslateBubbleView::ExecuteCommand(int command_id, int event_flags) {
switch (command_id) {
case DenialMenuItem::ALWAYS_TRANSLATE_LANGUAGE:
case OptionsMenuItem::ALWAYS_TRANSLATE_LANGUAGE:
should_always_translate_ = !should_always_translate_;
model_->SetAlwaysTranslate(should_always_translate_);
if (should_always_translate_) {
if (should_always_translate_ &&
model_->GetViewState() ==
TranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE) {
model_->Translate();
SwitchView(TranslateBubbleModel::VIEW_STATE_TRANSLATING);
}
break;
case DenialMenuItem::NEVER_TRANSLATE_LANGUAGE:
case OptionsMenuItem::NEVER_TRANSLATE_LANGUAGE:
translate::ReportUiAction(
translate::NEVER_TRANSLATE_LANGUAGE_MENU_CLICKED);
model_->SetNeverTranslateLanguage(true);
model_->DeclineTranslation();
GetWidget()->Close();
break;
case DenialMenuItem::NEVER_TRANSLATE_SITE:
case OptionsMenuItem::NEVER_TRANSLATE_SITE:
translate::ReportUiAction(translate::NEVER_TRANSLATE_SITE_MENU_CLICKED);
model_->SetNeverTranslateSite(true);
model_->DeclineTranslation();
GetWidget()->Close();
break;
case DenialMenuItem::MORE_OPTIONS:
case OptionsMenuItem::MORE_OPTIONS:
translate::ReportUiAction(translate::ADVANCED_MENU_CLICKED);
SwitchView(TranslateBubbleModel::VIEW_STATE_ADVANCED);
break;
......@@ -452,7 +494,7 @@ TranslateBubbleView::TranslateBubbleView(
advanced_always_translate_checkbox_(NULL),
advanced_cancel_button_(NULL),
advanced_done_button_(NULL),
options_menu_button_(NULL),
before_translate_options_button_(NULL),
model_(std::move(model)),
error_type_(error_type),
is_in_incognito_window_(
......@@ -481,61 +523,29 @@ views::View* TranslateBubbleView::GetCurrentView() const {
return NULL;
}
void TranslateBubbleView::HandleButtonPressed(
TranslateBubbleView::ButtonID sender_id) {
switch (sender_id) {
case BUTTON_ID_TRANSLATE: {
model_->SetAlwaysTranslate(should_always_translate_);
model_->Translate();
translate::ReportUiAction(translate::TRANSLATE_BUTTON_CLICKED);
break;
}
case BUTTON_ID_DONE: {
model_->SetAlwaysTranslate(should_always_translate_);
if (model_->IsPageTranslatedInCurrentLanguages()) {
model_->GoBackFromAdvanced();
UpdateChildVisibilities();
SizeToContents();
} else {
model_->Translate();
SwitchView(TranslateBubbleModel::VIEW_STATE_TRANSLATING);
}
translate::ReportUiAction(translate::DONE_BUTTON_CLICKED);
break;
}
case BUTTON_ID_CANCEL: {
model_->GoBackFromAdvanced();
UpdateChildVisibilities();
SizeToContents();
translate::ReportUiAction(translate::CANCEL_BUTTON_CLICKED);
break;
}
case BUTTON_ID_TRY_AGAIN: {
model_->Translate();
translate::ReportUiAction(translate::TRY_AGAIN_BUTTON_CLICKED);
break;
}
case BUTTON_ID_SHOW_ORIGINAL: {
model_->RevertTranslation();
GetWidget()->Close();
translate::ReportUiAction(translate::SHOW_ORIGINAL_BUTTON_CLICKED);
break;
}
case BUTTON_ID_ALWAYS_TRANSLATE: {
views::Checkbox* always_checkbox = GetAlwaysTranslateCheckbox();
DCHECK(always_checkbox);
should_always_translate_ = always_checkbox->checked();
translate::ReportUiAction(should_always_translate_
? translate::ALWAYS_TRANSLATE_CHECKED
: translate::ALWAYS_TRANSLATE_UNCHECKED);
break;
}
case BUTTON_ID_ADVANCED: {
SwitchView(TranslateBubbleModel::VIEW_STATE_ADVANCED);
translate::ReportUiAction(translate::ADVANCED_BUTTON_CLICKED);
break;
}
void TranslateBubbleView::Translate() {
model_->SetAlwaysTranslate(should_always_translate_);
model_->Translate();
translate::ReportUiAction(translate::TRANSLATE_BUTTON_CLICKED);
}
void TranslateBubbleView::ShowOriginal() {
model_->RevertTranslation();
GetWidget()->Close();
translate::ReportUiAction(translate::SHOW_ORIGINAL_BUTTON_CLICKED);
}
void TranslateBubbleView::ConfirmAdvancedOptions() {
model_->SetAlwaysTranslate(should_always_translate_);
if (model_->IsPageTranslatedInCurrentLanguages()) {
model_->GoBackFromAdvanced();
UpdateChildVisibilities();
SizeToContents();
} else {
model_->Translate();
SwitchView(TranslateBubbleModel::VIEW_STATE_TRANSLATING);
}
translate::ReportUiAction(translate::DONE_BUTTON_CLICKED);
}
void TranslateBubbleView::HandleLinkClicked(
......@@ -546,14 +556,6 @@ void TranslateBubbleView::HandleLinkClicked(
translate::ReportUiAction(translate::ADVANCED_LINK_CLICKED);
break;
}
case LINK_ID_LANGUAGE_SETTINGS: {
GURL url = chrome::GetSettingsUrl(chrome::kLanguageOptionsSubPage);
web_contents()->OpenURL(content::OpenURLParams(
url, content::Referrer(), WindowOpenDisposition::NEW_FOREGROUND_TAB,
ui::PAGE_TRANSITION_LINK, false));
translate::ReportUiAction(translate::SETTINGS_LINK_CLICKED);
break;
}
}
}
......@@ -704,12 +706,12 @@ views::View* TranslateBubbleView::CreateViewBeforeTranslate() {
accept_button->set_id(BUTTON_ID_TRANSLATE);
layout->AddView(accept_button);
accept_button->SetIsDefault(true);
const bool show_dropdown_arrow = Use2016Q2UI();
options_menu_button_ = new views::MenuButton(
l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_OPTIONS_MENU_BUTTON), this,
show_dropdown_arrow);
options_menu_button_->SetStyleDeprecated(views::Button::STYLE_BUTTON);
layout->AddView(options_menu_button_);
before_translate_options_button_ =
views::MdTextButton::CreateSecondaryUiButton(
this,
l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_OPTIONS_MENU_BUTTON));
before_translate_options_button_->set_id(BUTTON_ID_OPTIONS_MENU);
layout->AddView(before_translate_options_button_);
return view;
}
......@@ -770,13 +772,6 @@ views::View* TranslateBubbleView::CreateViewTranslating() {
revert_button->set_id(BUTTON_ID_SHOW_ORIGINAL);
revert_button->SetEnabled(false);
layout->AddView(revert_button);
if (!Use2016Q2UI()) {
views::LabelButton* button = views::MdTextButton::CreateSecondaryUiButton(
this, l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_ADVANCED_BUTTON));
button->set_id(BUTTON_ID_ADVANCED);
button->SetEnabled(false);
layout->AddView(button);
}
return view;
}
......@@ -834,10 +829,12 @@ views::View* TranslateBubbleView::CreateViewAfterTranslate() {
button->set_id(BUTTON_ID_SHOW_ORIGINAL);
layout->AddView(button);
if (!Use2016Q2UI()) {
views::LabelButton* button = views::MdTextButton::CreateSecondaryUiButton(
this, l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_ADVANCED_BUTTON));
button->set_id(BUTTON_ID_ADVANCED);
layout->AddView(button);
views::Button* options_menu_button =
views::MdTextButton::CreateSecondaryUiButton(
this, l10n_util::GetStringUTF16(
IDS_TRANSLATE_BUBBLE_OPTIONS_MENU_BUTTON));
options_menu_button->set_id(BUTTON_ID_OPTIONS_MENU);
layout->AddView(options_menu_button);
}
return view;
......@@ -949,6 +946,7 @@ views::View* TranslateBubbleView::CreateViewAdvanced() {
enum {
COLUMN_SET_ID_LANGUAGES,
COLUMN_SET_ID_BUTTONS,
COLUMN_SET_ID_ALWAYS_CHECKBOX,
};
ChromeLayoutProvider* provider = ChromeLayoutProvider::Get();
......@@ -974,6 +972,10 @@ views::View* TranslateBubbleView::CreateViewAdvanced() {
cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0,
GridLayout::USE_PREF, 0, 0);
cs = layout->AddColumnSet(COLUMN_SET_ID_ALWAYS_CHECKBOX);
cs->AddColumn(GridLayout::TRAILING, GridLayout::CENTER, 0,
GridLayout::USE_PREF, 0, 0);
layout->StartRow(0, COLUMN_SET_ID_LANGUAGES);
layout->AddView(source_language_label);
layout->AddView(source_language_combobox_);
......@@ -988,17 +990,15 @@ views::View* TranslateBubbleView::CreateViewAdvanced() {
if (!is_in_incognito_window_) {
layout->AddPaddingRow(0, vertical_spacing);
layout->StartRow(0, COLUMN_SET_ID_LANGUAGES);
layout->SkipColumns(1);
layout->StartRow(0, COLUMN_SET_ID_ALWAYS_CHECKBOX);
layout->AddView(advanced_always_translate_checkbox_);
}
layout->AddPaddingRow(0, vertical_spacing);
layout->StartRow(0, COLUMN_SET_ID_BUTTONS);
// TODO(estade): this should use CreateExtraView().
layout->AddView(CreateLink(this, IDS_TRANSLATE_BUBBLE_LANGUAGE_SETTINGS,
LINK_ID_LANGUAGE_SETTINGS));
layout->SkipColumns(1);
advanced_done_button_ =
Use2016Q2UI() ? views::MdTextButton::CreateSecondaryUiBlueButton(
this, l10n_util::GetStringUTF16(IDS_DONE))
......
......@@ -40,13 +40,12 @@ class TranslateBubbleView : public LocationBarBubbleDelegateView,
public views::ButtonListener,
public views::ComboboxListener,
public views::LinkListener,
public views::MenuButtonListener,
public ui::SimpleMenuModel::Delegate,
public views::StyledLabelListener,
public content::WebContentsObserver {
public:
// Item IDs for the denial button's menu.
enum DenialMenuItem {
// Item IDs for the option button's menu.
enum OptionsMenuItem {
ALWAYS_TRANSLATE_LANGUAGE,
NEVER_TRANSLATE_LANGUAGE,
NEVER_TRANSLATE_SITE,
......@@ -97,11 +96,6 @@ class TranslateBubbleView : public LocationBarBubbleDelegateView,
// views::LinkListener method.
void LinkClicked(views::Link* source, int event_flags) override;
// views::MenuButtonListener method.
void OnMenuButtonClicked(views::MenuButton* source,
const gfx::Point& point,
const ui::Event* event) override;
// ui::SimpleMenuModel::Delegate methods.
bool IsCommandIdChecked(int command_id) const override;
bool IsCommandIdEnabled(int command_id) const override;
......@@ -128,7 +122,6 @@ class TranslateBubbleView : public LocationBarBubbleDelegateView,
private:
enum LinkID {
LINK_ID_ADVANCED,
LINK_ID_LANGUAGE_SETTINGS,
};
enum ButtonID {
......@@ -139,6 +132,7 @@ class TranslateBubbleView : public LocationBarBubbleDelegateView,
BUTTON_ID_TRY_AGAIN,
BUTTON_ID_ALWAYS_TRANSLATE,
BUTTON_ID_ADVANCED,
BUTTON_ID_OPTIONS_MENU,
};
enum ComboboxID {
......@@ -173,11 +167,11 @@ class TranslateBubbleView : public LocationBarBubbleDelegateView,
CancelButtonReturningAfterTranslate);
FRIEND_TEST_ALL_PREFIXES(TranslateBubbleViewTest, CancelButtonReturningError);
FRIEND_TEST_ALL_PREFIXES(TranslateBubbleViewTest,
DenialMenuNeverTranslateLanguage);
OptionsMenuNeverTranslateLanguage);
FRIEND_TEST_ALL_PREFIXES(TranslateBubbleViewTest,
DenialMenuRespectsBlacklistSite);
OptionsMenuRespectsBlacklistSite);
FRIEND_TEST_ALL_PREFIXES(TranslateBubbleViewTest,
DenialMenuNeverTranslateSite);
OptionsMenuNeverTranslateSite);
FRIEND_TEST_ALL_PREFIXES(TranslateBubbleViewTest,
AlwaysTranslateLanguageMenuItem);
FRIEND_TEST_ALL_PREFIXES(TranslateLanguageBrowserTest, TranslateAndRevert);
......@@ -193,8 +187,8 @@ class TranslateBubbleView : public LocationBarBubbleDelegateView,
// Returns the current child view.
views::View* GetCurrentView() const;
// Handles the event when the user presses a button.
void HandleButtonPressed(ButtonID sender_id);
// Triggers options menu.
void ShowOptionsMenu(views::Button* source);
// Handles the event when the user clicks a link.
void HandleLinkClicked(LinkID sender_id);
......@@ -235,6 +229,11 @@ class TranslateBubbleView : public LocationBarBubbleDelegateView,
// Updates the advanced view.
void UpdateAdvancedView();
// Actions for button presses shared with accelerators.
void Translate();
void ShowOriginal();
void ConfirmAdvancedOptions();
static TranslateBubbleView* translate_bubble_view_;
views::View* before_translate_view_;
......@@ -255,7 +254,8 @@ class TranslateBubbleView : public LocationBarBubbleDelegateView,
views::LabelButton* advanced_cancel_button_;
views::LabelButton* advanced_done_button_;
views::MenuButton* options_menu_button_;
// Used to trigger the options menu in tests.
views::Button* before_translate_options_button_;
std::unique_ptr<ui::SimpleMenuModel> options_menu_model_;
std::unique_ptr<views::MenuRunner> options_menu_runner_;
......
......@@ -183,6 +183,15 @@ class TranslateBubbleViewTest : public views::ViewsTestBase {
views::BubbleDialogDelegateView::CreateBubble(bubble_)->Show();
}
void PressButton(TranslateBubbleView::ButtonID id) {
views::LabelButton button(nullptr, base::ASCIIToUTF16("hello"));
button.set_id(id);
bubble_->ButtonPressed(&button,
ui::KeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_RETURN,
ui::DomCode::ENTER, ui::EF_NONE));
}
void TearDown() override {
bubble_->GetWidget()->CloseNow();
anchor_widget_.reset();
......@@ -192,8 +201,9 @@ class TranslateBubbleViewTest : public views::ViewsTestBase {
bool denial_button_clicked() { return mock_model_->translation_declined_; }
void TriggerOptionsMenu() {
bubble_->options_menu_button_->OnKeyPressed(ui::KeyEvent(
ui::ET_KEY_PRESSED, ui::VKEY_RETURN, ui::DomCode::ENTER, ui::EF_NONE));
bubble_->ButtonPressed(bubble_->before_translate_options_button_,
ui::KeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_RETURN,
ui::DomCode::ENTER, ui::EF_NONE));
}
ui::SimpleMenuModel* options_menu_model() {
......@@ -211,7 +221,7 @@ TEST_F(TranslateBubbleViewTest, TranslateButton) {
EXPECT_FALSE(mock_model_->translate_called_);
// Press the "Translate" button.
bubble_->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_TRANSLATE);
PressButton(TranslateBubbleView::BUTTON_ID_TRANSLATE);
EXPECT_TRUE(mock_model_->translate_called_);
}
......@@ -221,7 +231,7 @@ TEST_F(TranslateBubbleViewTest, TranslateButtonIn2016Q2UI) {
EXPECT_FALSE(mock_model_->translate_called_);
// Press the "Translate" button.
bubble_->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_TRANSLATE);
PressButton(TranslateBubbleView::BUTTON_ID_TRANSLATE);
EXPECT_TRUE(mock_model_->translate_called_);
}
......@@ -259,7 +269,7 @@ TEST_F(TranslateBubbleViewTest, CloseButton) {
EXPECT_TRUE(mock_model_->translation_declined_);
}
TEST_F(TranslateBubbleViewTest, DenialMenuNeverTranslateLanguage) {
TEST_F(TranslateBubbleViewTest, OptionsMenuNeverTranslateLanguage) {
CreateAndShowBubble();
EXPECT_FALSE(bubble_->GetWidget()->IsClosed());
......@@ -276,7 +286,7 @@ TEST_F(TranslateBubbleViewTest, DenialMenuNeverTranslateLanguage) {
EXPECT_TRUE(bubble_->GetWidget()->IsClosed());
}
TEST_F(TranslateBubbleViewTest, DenialMenuNeverTranslateSite) {
TEST_F(TranslateBubbleViewTest, OptionsMenuNeverTranslateSite) {
// NEVER_TRANSLATE_SITE should only show up for sites that can be blacklisted.
mock_model_->SetCanBlacklistSite(true);
CreateAndShowBubble();
......@@ -303,7 +313,7 @@ TEST_F(TranslateBubbleViewTest, MenuButtonNeverTranslateLanguage) {
EXPECT_FALSE(denial_button_clicked());
bubble_->ExecuteCommand(
TranslateBubbleView::DenialMenuItem::NEVER_TRANSLATE_LANGUAGE, 0);
TranslateBubbleView::OptionsMenuItem::NEVER_TRANSLATE_LANGUAGE, 0);
EXPECT_TRUE(denial_button_clicked());
EXPECT_TRUE(mock_model_->never_translate_language_);
......@@ -318,7 +328,7 @@ TEST_F(TranslateBubbleViewTest, MenuButtonNeverTranslateSite) {
EXPECT_FALSE(bubble_->GetWidget()->IsClosed());
bubble_->ExecuteCommand(
TranslateBubbleView::DenialMenuItem::NEVER_TRANSLATE_SITE, 0);
TranslateBubbleView::OptionsMenuItem::NEVER_TRANSLATE_SITE, 0);
EXPECT_TRUE(denial_button_clicked());
EXPECT_TRUE(mock_model_->never_translate_site_);
......@@ -353,7 +363,7 @@ TEST_F(TranslateBubbleViewTest, ShowOriginalButton) {
// Click the "Show original" button to revert translation.
EXPECT_FALSE(mock_model_->revert_translation_called_);
bubble_->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_SHOW_ORIGINAL);
PressButton(TranslateBubbleView::BUTTON_ID_SHOW_ORIGINAL);
EXPECT_TRUE(mock_model_->revert_translation_called_);
}
......@@ -365,7 +375,7 @@ TEST_F(TranslateBubbleViewTest, TryAgainButton) {
// Click the "Try again" button to translate.
EXPECT_FALSE(mock_model_->translate_called_);
bubble_->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_TRY_AGAIN);
PressButton(TranslateBubbleView::BUTTON_ID_TRY_AGAIN);
EXPECT_TRUE(mock_model_->translate_called_);
}
......@@ -383,12 +393,12 @@ TEST_F(TranslateBubbleViewTest, AlwaysTranslateCheckboxAndCancelButton) {
// Click the checkbox. The state is not saved yet.
bubble_->advanced_always_translate_checkbox_->SetChecked(true);
bubble_->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_ALWAYS_TRANSLATE);
PressButton(TranslateBubbleView::BUTTON_ID_ALWAYS_TRANSLATE);
EXPECT_FALSE(mock_model_->should_always_translate_);
EXPECT_EQ(0, mock_model_->set_always_translate_called_count_);
// Click the cancel button. The state is not saved.
bubble_->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_CANCEL);
PressButton(TranslateBubbleView::BUTTON_ID_CANCEL);
EXPECT_FALSE(mock_model_->should_always_translate_);
EXPECT_EQ(0, mock_model_->set_always_translate_called_count_);
}
......@@ -407,12 +417,12 @@ TEST_F(TranslateBubbleViewTest, AlwaysTranslateCheckboxAndDoneButton) {
// Click the checkbox. The state is not saved yet.
bubble_->advanced_always_translate_checkbox_->SetChecked(true);
bubble_->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_ALWAYS_TRANSLATE);
PressButton(TranslateBubbleView::BUTTON_ID_ALWAYS_TRANSLATE);
EXPECT_FALSE(mock_model_->should_always_translate_);
EXPECT_EQ(0, mock_model_->set_always_translate_called_count_);
// Click the done button. The state is saved.
bubble_->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_DONE);
PressButton(TranslateBubbleView::BUTTON_ID_DONE);
EXPECT_TRUE(mock_model_->should_always_translate_);
EXPECT_EQ(1, mock_model_->set_always_translate_called_count_);
}
......@@ -430,7 +440,7 @@ TEST_F(TranslateBubbleViewTest, DoneButton) {
bubble_->target_language_combobox_->SetSelectedIndex(20);
bubble_->HandleComboboxPerformAction(
TranslateBubbleView::COMBOBOX_ID_TARGET_LANGUAGE);
bubble_->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_DONE);
PressButton(TranslateBubbleView::BUTTON_ID_DONE);
EXPECT_TRUE(mock_model_->translate_called_);
EXPECT_EQ(10, mock_model_->original_language_index_);
EXPECT_EQ(20, mock_model_->target_language_index_);
......@@ -457,7 +467,7 @@ TEST_F(TranslateBubbleViewTest, DoneButtonWithoutTranslating) {
// Click the "Done" button with the current language pair. This time,
// translation is not performed and the view state will be back to the
// previous view.
bubble_->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_DONE);
PressButton(TranslateBubbleView::BUTTON_ID_DONE);
EXPECT_FALSE(mock_model_->translate_called_);
EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE,
......@@ -471,7 +481,7 @@ TEST_F(TranslateBubbleViewTest, CancelButtonReturningBeforeTranslate) {
// Click the "Cancel" button to go back.
EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_ADVANCED, bubble_->GetViewState());
bubble_->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_CANCEL);
PressButton(TranslateBubbleView::BUTTON_ID_CANCEL);
EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE,
bubble_->GetViewState());
}
......@@ -483,7 +493,7 @@ TEST_F(TranslateBubbleViewTest, CancelButtonReturningAfterTranslate) {
// Click the "Cancel" button to go back.
EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_ADVANCED, bubble_->GetViewState());
bubble_->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_CANCEL);
PressButton(TranslateBubbleView::BUTTON_ID_CANCEL);
EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_AFTER_TRANSLATE,
bubble_->GetViewState());
}
......@@ -495,11 +505,11 @@ TEST_F(TranslateBubbleViewTest, CancelButtonReturningError) {
// Click the "Cancel" button to go back.
EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_ADVANCED, bubble_->GetViewState());
bubble_->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_CANCEL);
PressButton(TranslateBubbleView::BUTTON_ID_CANCEL);
EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_ERROR, bubble_->GetViewState());
}
TEST_F(TranslateBubbleViewTest, DenialMenuRespectsBlacklistSite) {
TEST_F(TranslateBubbleViewTest, OptionsMenuRespectsBlacklistSite) {
mock_model_->SetCanBlacklistSite(false);
CreateAndShowBubble();
......@@ -530,7 +540,7 @@ TEST_F(TranslateBubbleViewTest, AlwaysTranslateLanguageMenuItem) {
// Go back to untranslated page, since the *language* should still always
// be translated (and this "untranslate" is temporary) the option should now
// be checked and it should be possible to disable it from the menu.
bubble_->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_SHOW_ORIGINAL);
PressButton(TranslateBubbleView::BUTTON_ID_SHOW_ORIGINAL);
EXPECT_TRUE(mock_model_->revert_translation_called_);
TriggerOptionsMenu();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment