Commit 55663ee6 authored by Keren Zhu's avatar Keren Zhu Committed by Commit Bot

views: Make Button default constructible

This CL is part of the effort to make Views default
constructible, allowing UI to be built in a declarative fashion.

* Default button listener to nullptr
* Add button listener setter
* Add unittest for setter

Bug: 1108460
Change-Id: I694acd0422b78951b1a7d17a90dcee3f8c8195d4
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2327150Reviewed-by: default avatarScott Violet <sky@chromium.org>
Commit-Queue: Keren Zhu <kerenzhu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#792960}
parent e1244519
......@@ -106,6 +106,8 @@ class VIEWS_EXPORT Button : public InkDropHostView,
int tag() const { return tag_; }
void set_tag(int tag) { tag_ = tag; }
void set_listener(ButtonListener* listener) { listener_ = listener; }
void SetAccessibleName(const base::string16& name);
const base::string16& GetAccessibleName() const;
......@@ -233,7 +235,7 @@ class VIEWS_EXPORT Button : public InkDropHostView,
// Construct the Button with a Listener. The listener can be null. This can be
// true of buttons that don't have a listener - e.g. menubuttons where there's
// no default action and checkboxes.
explicit Button(ButtonListener* listener);
explicit Button(ButtonListener* listener = nullptr);
// Called when the button has been clicked or tapped and should request focus
// if necessary.
......
......@@ -105,6 +105,7 @@ class TestButton : public Button, public ButtonListener {
bool canceled() { return canceled_; }
int ink_drop_layer_add_count() { return ink_drop_layer_add_count_; }
int ink_drop_layer_remove_count() { return ink_drop_layer_remove_count_; }
ButtonListener* listener() const { return listener_; }
void set_custom_key_click_action(KeyClickAction custom_key_click_action) {
custom_key_click_action_ = custom_key_click_action;
......@@ -179,6 +180,21 @@ class TestButtonObserver : public ButtonObserver {
DISALLOW_COPY_AND_ASSIGN(TestButtonObserver);
};
class TestButtonListener : public ButtonListener {
public:
void ButtonPressed(Button* sender, const ui::Event& event) override {
pressed_ = true;
sender_ = sender;
}
bool pressed() const { return pressed_; }
Button* sender() const { return sender_; }
private:
bool pressed_ = false;
Button* sender_ = nullptr;
};
TestInkDrop* AddTestInkDrop(TestButton* button) {
auto owned_ink_drop = std::make_unique<TestInkDrop>();
TestInkDrop* ink_drop = owned_ink_drop.get();
......@@ -747,6 +763,28 @@ TEST_F(ButtonTest, InkDropStaysHiddenWhileDragging) {
SetDraggedView(nullptr);
}
// Ensure ButtonListener is dynamically settable.
TEST_F(ButtonTest, SetListener) {
gfx::Point center(10, 10);
ButtonListener* old_listener = button()->listener();
auto listener = std::make_unique<TestButtonListener>();
button()->set_listener(listener.get());
EXPECT_EQ(listener.get(), button()->listener());
button()->OnMousePressed(ui::MouseEvent(
ui::ET_MOUSE_PRESSED, center, center, ui::EventTimeForNow(),
ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON));
// Default button controller notifies listener at mouse release.
button()->OnMouseReleased(ui::MouseEvent(
ui::ET_MOUSE_RELEASED, center, center, ui::EventTimeForNow(),
ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON));
EXPECT_TRUE(listener->pressed());
EXPECT_EQ(button(), listener->sender());
button()->set_listener(old_listener);
}
// VisibilityTestButton tests to see if an ink drop or a layer has been added to
// the button at any point during the visibility state changes of its Widget.
class VisibilityTestButton : public TestButton {
......
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