0

Change Button default focus behavior

Change Button, ImageButton, LabelButton, and
ColorTrackingVectorImageButton to always focusable on non-Mac platform
and accessible only for Mac. This will remove the need to override these
buttons' focus behavior for normal use cases.

This CL explicitly set some button's focus behavior when they don't want
to platform default focus behavior. This CL also removes the DCHECKs
added earlier to show the changed behavior.

Bug: 1001103
Change-Id: I97ebea9c477e6155e40b09007254a51be9ee5125
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2499166
Reviewed-by: Xiyuan Xia <xiyuan@chromium.org>
Reviewed-by: Trent Apted <tapted@chromium.org>
Reviewed-by: Sean Topping <seantopping@chromium.org>
Reviewed-by: Elly Fong-Jones <ellyjones@chromium.org>
Commit-Queue: Wei Li <weili@chromium.org>
Cr-Commit-Position: refs/heads/master@{#821275}
This commit is contained in:
Wei Li
2020-10-27 16:19:16 +00:00
committed by Commit Bot
parent fe95067c5d
commit b82690a8ab
49 changed files with 42 additions and 47 deletions

@ -64,6 +64,7 @@ void AppWindowFrameView::Init() {
close_button->SetImage(
views::Button::STATE_PRESSED,
rb.GetNativeImageNamed(IDR_APP_WINDOW_CLOSE_P).ToImageSkia());
close_button->SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY);
close_button->SetAccessibleName(
l10n_util::GetStringUTF16(IDS_APP_ACCNAME_CLOSE));
close_button_ = AddChildView(std::move(close_button));
@ -80,6 +81,7 @@ void AppWindowFrameView::Init() {
maximize_button->SetImage(
views::Button::STATE_DISABLED,
rb.GetNativeImageNamed(IDR_APP_WINDOW_MAXIMIZE_D).ToImageSkia());
maximize_button->SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY);
maximize_button->SetAccessibleName(
l10n_util::GetStringUTF16(IDS_APP_ACCNAME_MAXIMIZE));
maximize_button_ = AddChildView(std::move(maximize_button));
@ -92,6 +94,7 @@ void AppWindowFrameView::Init() {
restore_button->SetImage(
views::Button::STATE_PRESSED,
rb.GetNativeImageNamed(IDR_APP_WINDOW_RESTORE_P).ToImageSkia());
restore_button->SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY);
restore_button->SetAccessibleName(
l10n_util::GetStringUTF16(IDS_APP_ACCNAME_RESTORE));
restore_button_ = AddChildView(std::move(restore_button));
@ -104,6 +107,7 @@ void AppWindowFrameView::Init() {
minimize_button->SetImage(
views::Button::STATE_PRESSED,
rb.GetNativeImageNamed(IDR_APP_WINDOW_MINIMIZE_P).ToImageSkia());
minimize_button->SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY);
minimize_button->SetAccessibleName(
l10n_util::GetStringUTF16(IDS_APP_ACCNAME_MINIMIZE));
minimize_button_ = AddChildView(std::move(minimize_button));

@ -52,7 +52,6 @@ class PageSwitcherButton : public views::Button {
public:
explicit PageSwitcherButton(bool is_root_app_grid_page_switcher)
: is_root_app_grid_page_switcher_(is_root_app_grid_page_switcher) {
DCHECK_EQ(views::View::FocusBehavior::ACCESSIBLE_ONLY, GetFocusBehavior());
SetFocusBehavior(views::View::FocusBehavior::ACCESSIBLE_ONLY);
SetInkDropMode(InkDropMode::ON);
views::InstallFixedSizeCircleHighlightPathGenerator(

@ -13,7 +13,6 @@
namespace ash {
SearchResultBaseView::SearchResultBaseView() {
DCHECK_EQ(FocusBehavior::ACCESSIBLE_ONLY, GetFocusBehavior());
SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY);
SetInstallFocusRingOnFocus(false);
}

@ -161,6 +161,7 @@ CaptureLabelView::CaptureLabelView(CaptureModeSession* capture_mode_session)
color_provider->GetRippleAttributes(background_color);
label_button_->SetInkDropVisibleOpacity(ripple_attributes.inkdrop_opacity);
label_button_->SetInkDropBaseColor(ripple_attributes.base_color);
label_button_->SetFocusBehavior(views::View::FocusBehavior::ACCESSIBLE_ONLY);
label_ = AddChildView(std::make_unique<views::Label>(base::string16()));
label_->SetPaintToLayer();

@ -40,7 +40,6 @@ class MinMaxButton : public views::ImageButton {
/*radius=*/0));
SetProperty(kHUDClickHandler, HTCLIENT);
DCHECK_EQ(views::View::FocusBehavior::ACCESSIBLE_ONLY, GetFocusBehavior());
SetFocusBehavior(views::View::FocusBehavior::ACCESSIBLE_ONLY);
}

@ -77,7 +77,6 @@ class SettingsButton : public views::ImageButton {
SetBorder(views::CreateEmptyBorder(gfx::Insets(kSettingsIconBorder)));
SetProperty(kHUDClickHandler, HTCLIENT);
DCHECK_EQ(views::View::FocusBehavior::ACCESSIBLE_ONLY, GetFocusBehavior());
SetFocusBehavior(views::View::FocusBehavior::ACCESSIBLE_ONLY);
}

@ -89,7 +89,6 @@ HUDTabButton::HUDTabButton(Style style,
kSettingsIconBorder, kTabOverlayWidth + kTabTitleBorder,
kSettingsIconBorder, kTabOverlayWidth + kTabTitleBorder));
DCHECK_EQ(views::View::FocusBehavior::ACCESSIBLE_ONLY, GetFocusBehavior());
SetFocusBehavior(views::View::FocusBehavior::ACCESSIBLE_ONLY);
}

@ -252,7 +252,6 @@ class LoginPasswordView::EasyUnlockIcon : public views::Button {
public:
EasyUnlockIcon(const gfx::Size& size, int corner_radius)
: views::Button(PressedCallback()) {
DCHECK_EQ(views::View::FocusBehavior::ACCESSIBLE_ONLY, GetFocusBehavior());
SetFocusBehavior(views::View::FocusBehavior::ACCESSIBLE_ONLY);
SetPreferredSize(size);
SetLayoutManager(std::make_unique<views::FillLayout>());

@ -44,6 +44,7 @@ WindowPreview::WindowPreview(aura::Window* window,
kPreviewContainerBgColor, kPreviewBorderRadius));
title_ = new views::Label(window->GetTitle());
close_button_ = new views::ImageButton(this);
close_button_->SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY);
AddChildView(preview_container_view_);
AddChildView(preview_view_);

@ -39,7 +39,6 @@ SwitchAccessMenuButton::SwitchAccessMenuButton(std::string action_name,
image_view_(new views::ImageView()),
label_(new views::Label(l10n_util::GetStringUTF16(label_text_id),
views::style::CONTEXT_BUTTON)) {
DCHECK_EQ(views::View::FocusBehavior::ACCESSIBLE_ONLY, GetFocusBehavior());
SetFocusBehavior(views::View::FocusBehavior::ACCESSIBLE_ONLY);
std::unique_ptr<views::BoxLayout> layout = std::make_unique<views::BoxLayout>(
views::BoxLayout::Orientation::kVertical,

@ -147,7 +147,6 @@ UnifiedMediaControlsView::MediaActionButton::CreateInkDropRipple() const {
UnifiedMediaControlsView::UnifiedMediaControlsView(
UnifiedMediaControlsController* controller)
: views::Button(this), controller_(controller) {
DCHECK_EQ(views::View::FocusBehavior::ACCESSIBLE_ONLY, GetFocusBehavior());
SetFocusBehavior(views::View::FocusBehavior::ACCESSIBLE_ONLY);
SetBackground(views::CreateRoundedRectBackground(

@ -136,6 +136,7 @@ void NotificationSwipeControlView::ShowSettingsButton(bool show) {
IDS_MESSAGE_NOTIFICATION_SETTINGS_BUTTON_ACCESSIBLE_NAME));
settings_button_->SetBackground(
views::CreateSolidBackground(SK_ColorTRANSPARENT));
settings_button_->SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY);
AddChildView(settings_button_);
Layout();
@ -168,6 +169,7 @@ void NotificationSwipeControlView::ShowSnoozeButton(bool show) {
IDS_MESSAGE_NOTIFICATION_SETTINGS_BUTTON_ACCESSIBLE_NAME));
snooze_button_->SetBackground(
views::CreateSolidBackground(SK_ColorTRANSPARENT));
snooze_button_->SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY);
AddChildViewAt(snooze_button_, 0);
Layout();

@ -311,7 +311,6 @@ class NotifierViewCheckbox : public views::Checkbox {
NotifierSettingsView::NotifierButton::NotifierButton(
const NotifierMetadata& notifier)
: views::Button(PressedCallback()), notifier_id_(notifier.notifier_id) {
DCHECK_EQ(views::View::FocusBehavior::ACCESSIBLE_ONLY, GetFocusBehavior());
SetFocusBehavior(views::View::FocusBehavior::ACCESSIBLE_ONLY);
auto icon_view = std::make_unique<views::ImageView>();

@ -132,7 +132,6 @@ class ToastOverlayButton : public views::LabelButton {
views::InstallRoundRectHighlightPathGenerator(this, gfx::Insets(),
kToastCornerRounding);
DCHECK_EQ(views::View::FocusBehavior::ACCESSIBLE_ONLY, GetFocusBehavior());
SetFocusBehavior(views::View::FocusBehavior::ACCESSIBLE_ONLY);
}

@ -48,7 +48,6 @@ class PageIndicatorView::PageIndicatorButton : public views::Button,
public:
PageIndicatorButton(UnifiedSystemTrayController* controller, int page)
: views::Button(this), controller_(controller), page_number_(page) {
DCHECK_EQ(views::View::FocusBehavior::ACCESSIBLE_ONLY, GetFocusBehavior());
SetFocusBehavior(views::View::FocusBehavior::ACCESSIBLE_ONLY);
SetInkDropMode(InkDropMode::ON);
views::InstallFixedSizeCircleHighlightPathGenerator(this, kInkDropRadius);

@ -32,7 +32,6 @@ UnifiedManagedDeviceView::UnifiedManagedDeviceView(
icon_(new views::ImageView),
label_(new views::Label),
controller_(controller) {
DCHECK_EQ(views::View::FocusBehavior::ACCESSIBLE_ONLY, GetFocusBehavior());
SetFocusBehavior(views::View::FocusBehavior::ACCESSIBLE_ONLY);
auto* layout = SetLayoutManager(std::make_unique<views::BoxLayout>(

@ -31,7 +31,6 @@ CloseDeskButton::CloseDeskButton(views::ButtonListener* listener)
SetInkDropMode(InkDropMode::ON);
SetHasInkDropActionOnClick(true);
SetFocusPainter(nullptr);
DCHECK_EQ(views::View::FocusBehavior::ACCESSIBLE_ONLY, GetFocusBehavior());
SetFocusBehavior(views::View::FocusBehavior::ACCESSIBLE_ONLY);
SetEventTargeter(std::make_unique<views::ViewTargeter>(this));

@ -218,7 +218,6 @@ DeskPreviewView::DeskPreviewView(DeskMiniView* mini_view)
SetFocusPainter(nullptr);
SetInkDropMode(InkDropMode::OFF);
DCHECK_EQ(views::View::FocusBehavior::ACCESSIBLE_ONLY, GetFocusBehavior());
SetFocusBehavior(views::View::FocusBehavior::ACCESSIBLE_ONLY);
SetPaintToLayer(ui::LAYER_TEXTURED);

@ -46,7 +46,6 @@ NewDeskButton::NewDeskButton(views::ButtonListener* listener)
SetInkDropMode(InkDropMode::ON);
SetHasInkDropActionOnClick(true);
SetFocusPainter(nullptr);
DCHECK_EQ(views::View::FocusBehavior::ACCESSIBLE_ONLY, GetFocusBehavior());
SetFocusBehavior(views::View::FocusBehavior::ACCESSIBLE_ONLY);
auto border = std::make_unique<WmHighlightItemBorder>(kCornerRadius);

@ -110,7 +110,6 @@ class OverviewCloseButton : public views::ImageButton {
SetMinimumImageSize(gfx::Size(kHeaderHeightDp, kHeaderHeightDp));
SetAccessibleName(l10n_util::GetStringUTF16(IDS_APP_ACCNAME_CLOSE));
SetTooltipText(l10n_util::GetStringUTF16(IDS_APP_ACCNAME_CLOSE));
DCHECK_EQ(views::View::FocusBehavior::ACCESSIBLE_ONLY, GetFocusBehavior());
SetFocusBehavior(views::View::FocusBehavior::ACCESSIBLE_ONLY);
views::InstallFixedSizeCircleHighlightPathGenerator(

@ -145,7 +145,6 @@ CandidateView::CandidateView(PressedCallback callback,
infolist_icon_ = AddChildView(std::move(infolist_icon));
}
DCHECK_EQ(views::View::FocusBehavior::ACCESSIBLE_ONLY, GetFocusBehavior());
SetFocusBehavior(views::View::FocusBehavior::ACCESSIBLE_ONLY);
}

@ -103,7 +103,6 @@ SuggestionView::SuggestionView(PressedCallback callback)
annotation_label_ = AddChildView(CreateAnnotationLabel());
annotation_label_->SetVisible(false);
DCHECK_EQ(views::View::FocusBehavior::ACCESSIBLE_ONLY, GetFocusBehavior());
SetFocusBehavior(views::View::FocusBehavior::ACCESSIBLE_ONLY);
}

@ -44,6 +44,7 @@ UndoWindow::UndoWindow(gfx::NativeView parent, AssistiveDelegate* delegate)
views::LayoutProvider::Get()->GetDistanceMetric(
views::DistanceMetric::DISTANCE_RELATED_BUTTON_HORIZONTAL));
undo_button_->SetBackground(nullptr);
undo_button_->SetFocusBehavior(views::View::FocusBehavior::ACCESSIBLE_ONLY);
}
void UndoWindow::OnThemeChanged() {

@ -174,6 +174,7 @@ void SimpleWebViewDialog::Init() {
ui::EF_MIDDLE_MOUSE_BUTTON);
back->SetImageHorizontalAlignment(views::ImageButton::ALIGN_RIGHT);
back->SetTooltipText(l10n_util::GetStringUTF16(IDS_TOOLTIP_BACK));
back->SetFocusBehavior(views::View::FocusBehavior::ACCESSIBLE_ONLY);
back->SetAccessibleName(l10n_util::GetStringUTF16(IDS_ACCNAME_BACK));
back->SetID(VIEW_ID_BACK_BUTTON);
back_ = back.get();
@ -184,6 +185,7 @@ void SimpleWebViewDialog::Init() {
forward->SetTriggerableEventFlags(ui::EF_LEFT_MOUSE_BUTTON |
ui::EF_MIDDLE_MOUSE_BUTTON);
forward->SetTooltipText(l10n_util::GetStringUTF16(IDS_TOOLTIP_FORWARD));
forward->SetFocusBehavior(views::View::FocusBehavior::ACCESSIBLE_ONLY);
forward->SetAccessibleName(l10n_util::GetStringUTF16(IDS_ACCNAME_FORWARD));
forward->SetID(VIEW_ID_FORWARD_BUTTON);
forward_ = forward.get();

@ -76,7 +76,6 @@ InvertBubbleView::InvertBubbleView(Browser* browser, views::View* anchor_view)
kLearnMoreUrl),
vector_icons::kHelpOutlineIcon);
button->SetTooltipText(l10n_util::GetStringUTF16(IDS_LEARN_MORE));
DCHECK_EQ(FocusBehavior::ACCESSIBLE_ONLY, button->GetFocusBehavior());
button->SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY);
SetExtraView(std::move(button));

@ -199,8 +199,6 @@ MigratableCardView::GetMigratableCardDescriptionView(
kTrashCanIcon);
delete_card_from_local_button->SetTooltipText(l10n_util::GetStringUTF16(
IDS_AUTOFILL_LOCAL_CARD_MIGRATION_DIALOG_TRASH_CAN_BUTTON_TOOLTIP));
DCHECK_EQ(FocusBehavior::ACCESSIBLE_ONLY,
delete_card_from_local_button->GetFocusBehavior());
delete_card_from_local_button->SetFocusBehavior(
FocusBehavior::ACCESSIBLE_ONLY);
delete_card_from_local_button_ =

@ -160,7 +160,6 @@ class BookmarkButtonBase : public views::LabelButton {
SetHasInkDropActionOnClick(true);
SetInkDropVisibleOpacity(kToolbarInkDropVisibleOpacity);
DCHECK_EQ(FocusBehavior::ACCESSIBLE_ONLY, GetFocusBehavior());
SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY);
show_animation_ = std::make_unique<gfx::SlideAnimation>(this);

@ -557,6 +557,7 @@ views::Button* OpaqueBrowserFrameView::CreateImageButton(int normal_image_id,
tp->GetImageSkiaNamed(hot_image_id));
button->SetImage(views::Button::STATE_PRESSED,
tp->GetImageSkiaNamed(pushed_image_id));
button->SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY);
if (browser_view()->IsBrowserTypeNormal()) {
// Get a custom processed version of the theme's background image so
// that it appears to draw contiguously across all of the caption

@ -42,6 +42,7 @@ std::unique_ptr<views::ImageButton> CreateScrollButton(
views::ImageButton::VerticalAlignment::ALIGN_MIDDLE);
scroll_button->SetHasInkDropActionOnClick(true);
scroll_button->SetInkDropMode(views::Button::InkDropMode::ON);
scroll_button->SetFocusBehavior(views::View::FocusBehavior::ACCESSIBLE_ONLY);
return scroll_button;
}

@ -207,6 +207,7 @@ CustomTabBarView::CustomTabBarView(BrowserView* browser_view,
close_button_->SetBorder(views::CreateEmptyBorder(
gfx::Insets(GetLayoutConstant(LOCATION_BAR_CHILD_INTERIOR_PADDING))));
close_button_->SizeToPreferredSize();
close_button_->SetFocusBehavior(views::View::FocusBehavior::ACCESSIBLE_ONLY);
views::InstallCircleHighlightPathGenerator(close_button_);
location_icon_view_ =

@ -143,7 +143,6 @@ IconLabelBubbleView::IconLabelBubbleView(const gfx::FontList& font_list,
views::HighlightPathGenerator::Install(
this, std::make_unique<HighlightPathGenerator>());
DCHECK_EQ(FocusBehavior::ACCESSIBLE_ONLY, GetFocusBehavior());
SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY);
UpdateBorder();

@ -55,7 +55,6 @@ class OmniboxRemoveSuggestionButton : public views::ImageButton {
: ImageButton(std::move(callback)) {
views::ConfigureVectorImageButton(this);
DCHECK_EQ(FocusBehavior::ACCESSIBLE_ONLY, GetFocusBehavior());
SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY);
}

@ -60,8 +60,6 @@ class OmniboxRowView::HeaderView : public views::View {
&HeaderView::HeaderToggleButtonPressed, base::Unretained(this))));
mouse_enter_exit_handler_.ObserveMouseEnterExitOn(header_toggle_button_);
views::InstallCircleHighlightPathGenerator(header_toggle_button_);
DCHECK_EQ(FocusBehavior::ACCESSIBLE_ONLY,
header_toggle_button_->GetFocusBehavior());
header_toggle_button_->SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY);
header_toggle_button_focus_ring_ =

@ -73,7 +73,6 @@ NewTabButton::NewTabButton(TabStrip* tab_strip, PressedCallback callback)
views::HighlightPathGenerator::Install(
this, std::make_unique<NewTabButton::HighlightPathGenerator>());
DCHECK_EQ(FocusBehavior::ACCESSIBLE_ONLY, GetFocusBehavior());
SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY);
}

@ -239,6 +239,7 @@ std::unique_ptr<views::ImageButton> MediaControlUi::CreateImageButton(
button->SetImageHorizontalAlignment(views::ImageButton::ALIGN_CENTER);
button->SetImageVerticalAlignment(views::ImageButton::ALIGN_MIDDLE);
button->SetSize(gfx::Size(height, height));
button->SetFocusBehavior(views::View::FocusBehavior::ACCESSIBLE_ONLY);
SetButtonImage(button.get(), icon);
return button;

@ -200,7 +200,7 @@ TEST_F(ViewAXPlatformNodeDelegateTest, LabelIsChildOfButton) {
button_->SetInstallFocusRingOnFocus(false);
// |button_| is focusable, so |label_| (as its child) should be ignored.
EXPECT_EQ(View::FocusBehavior::ACCESSIBLE_ONLY, button_->GetFocusBehavior());
EXPECT_NE(View::FocusBehavior::NEVER, button_->GetFocusBehavior());
EXPECT_EQ(1, button_accessibility()->GetChildCount());
EXPECT_EQ(button_->GetNativeViewAccessible(),
label_accessibility()->GetParent());

@ -612,7 +612,7 @@ Button::Button(PressedCallback callback)
: AnimationDelegateViews(this),
callback_(std::move(callback)),
ink_drop_base_color_(gfx::kPlaceholderColor) {
SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY);
SetFocusBehavior(PlatformStyle::DefaultFocusBehavior());
SetProperty(kIsButtonProperty, true);
hover_animation_.SetSlideDuration(base::TimeDelta::FromMilliseconds(150));
SetInstallFocusRingOnFocus(PlatformStyle::kPreferFocusRings);

@ -42,9 +42,8 @@ class VIEWS_EXPORT ButtonListener {
virtual ~ButtonListener() = default;
};
// A View representing a button. A Button is not focusable by default and will
// not be part of the focus chain, unless in accessibility mode (see
// SetFocusForPlatform()).
// A View representing a button. A Button is focusable by default and will
// be part of the focus chain.
class VIEWS_EXPORT Button : public InkDropHostView,
public AnimationDelegateViews {
public:
@ -132,6 +131,8 @@ class VIEWS_EXPORT Button : public InkDropHostView,
static ButtonState GetButtonStateFrom(ui::NativeTheme::State state);
// Make the button focusable as per the platform.
// TODO(weili): remove this as it is no longer needed since the platform
// focus behavior is the default.
void SetFocusForPlatform();
void SetTooltipText(const base::string16& tooltip_text);

@ -34,8 +34,6 @@ ImageButton::ImageButton(PressedCallback callback)
// implementation is flipped horizontally so that the button's images are
// mirrored when the UI directionality is right-to-left.
SetFlipCanvasOnPaintForRTLUI(true);
// Not focusable by default, only for accessibility.
SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY);
}
ImageButton::ImageButton(ButtonListener* listener)
@ -220,7 +218,6 @@ const gfx::Point ImageButton::ComputeImagePaintPosition(
ToggleImageButton::ToggleImageButton(PressedCallback callback)
: ImageButton(std::move(callback)) {
DCHECK_EQ(FocusBehavior::ACCESSIBLE_ONLY, GetFocusBehavior());
SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY);
}

@ -16,10 +16,6 @@
namespace views {
// An image button.
// Note that this type of button is not focusable by default and will not be
// part of the focus chain, unless in accessibility mode. Call
// SetFocusForPlatform() to make it part of the focus chain.
class VIEWS_EXPORT ImageButton : public Button {
public:
METADATA_HEADER(ImageButton);

@ -7,6 +7,7 @@
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/layout.h"
#include "ui/views/border.h"
#include "ui/views/style/platform_style.h"
#include "ui/views/test/views_test_base.h"
namespace {
@ -42,7 +43,7 @@ using ImageButtonTest = ViewsTestBase;
TEST_F(ImageButtonTest, FocusBehavior) {
ImageButton button;
EXPECT_EQ(View::FocusBehavior::ACCESSIBLE_ONLY, button.GetFocusBehavior());
EXPECT_EQ(PlatformStyle::DefaultFocusBehavior(), button.GetFocusBehavior());
}
TEST_F(ImageButtonTest, Basics) {

@ -40,8 +40,6 @@ LabelButton::LabelButton(PressedCallback callback,
style::GetFont(button_context, style::STYLE_PRIMARY)),
cached_default_button_font_list_(
style::GetFont(button_context, style::STYLE_DIALOG_BUTTON_DEFAULT)) {
// Not focusable by default, only for accessibility.
SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY);
ink_drop_container_ = AddChildView(std::make_unique<InkDropContainerView>());
ink_drop_container_->SetVisible(false);

@ -30,7 +30,7 @@ namespace views {
class InkDropContainerView;
class LabelButtonBorder;
// LabelButton is a button with text and an icon, it's not focusable by default.
// LabelButton is a button with text and an icon.
class VIEWS_EXPORT LabelButton : public Button, public NativeThemeDelegate {
public:
METADATA_HEADER(LabelButton);

@ -142,9 +142,7 @@ class LabelButtonTest : public test::WidgetTest {
};
TEST_F(LabelButtonTest, FocusBehavior) {
LabelButton button;
EXPECT_EQ(View::FocusBehavior::ACCESSIBLE_ONLY, button.GetFocusBehavior());
EXPECT_EQ(PlatformStyle::DefaultFocusBehavior(), button_->GetFocusBehavior());
}
TEST_F(LabelButtonTest, Init) {

@ -26,7 +26,6 @@ MenuButton::MenuButton(PressedCallback callback,
menu_button_controller_ = menu_button_controller.get();
SetButtonController(std::move(menu_button_controller));
DCHECK_EQ(FocusBehavior::ACCESSIBLE_ONLY, GetFocusBehavior());
SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY);
}

@ -73,6 +73,11 @@ gfx::Range PlatformStyle::RangeToDeleteBackwards(const base::string16& text,
return gfx::Range(cursor_position, previous_grapheme_index);
}
// static
View::FocusBehavior PlatformStyle::DefaultFocusBehavior() {
return View::FocusBehavior::ALWAYS;
}
#endif // OS_APPLE
#if !BUILDFLAG(ENABLE_DESKTOP_AURA) || \

@ -9,6 +9,7 @@
#include "base/macros.h"
#include "ui/views/controls/button/button.h"
#include "ui/views/view.h"
#include "ui/views/views_export.h"
namespace gfx {
@ -99,6 +100,9 @@ class VIEWS_EXPORT PlatformStyle {
static gfx::Range RangeToDeleteBackwards(const base::string16& text,
size_t cursor_position);
// Returns the default focus behavior based on the platform.
static View::FocusBehavior DefaultFocusBehavior();
private:
DISALLOW_IMPLICIT_CONSTRUCTORS(PlatformStyle);
};

@ -81,4 +81,10 @@ gfx::Range PlatformStyle::RangeToDeleteBackwards(const base::string16& text,
return gfx::Range(range_to_delete.location + range_to_delete.length,
range_to_delete.location);
}
// static
View::FocusBehavior PlatformStyle::DefaultFocusBehavior() {
return View::FocusBehavior::ACCESSIBLE_ONLY;
}
} // namespace views

@ -87,6 +87,7 @@ CustomFrameView::CustomFrameView(Widget* frame)
if (frame_->widget_delegate()->ShouldShowWindowIcon()) {
window_icon_ =
AddChildView(std::make_unique<ImageButton>(Button::PressedCallback()));
window_icon_->SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY);
}
}
@ -541,6 +542,7 @@ ImageButton* CustomFrameView::InitWindowCaptionButton(
ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
ImageButton* button =
AddChildView(std::make_unique<ImageButton>(std::move(callback)));
button->SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY);
button->SetAccessibleName(l10n_util::GetStringUTF16(accessibility_string_id));
button->SetImage(Button::STATE_NORMAL,
rb.GetImageNamed(normal_image_id).ToImageSkia());