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

Side by Side Diff: ui/views/controls/button/menu_button_unittest.cc

Issue 639893003: Unify MenuButton Pushed state logic (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Drag Drop Unittest Created 6 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
« no previous file with comments | « ui/views/controls/button/menu_button.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 #include "ui/views/controls/button/menu_button.h" 5 #include "ui/views/controls/button/menu_button.h"
6 6
7 #include "base/memory/scoped_ptr.h" 7 #include "base/memory/scoped_ptr.h"
8 #include "base/strings/utf_string_conversions.h" 8 #include "base/strings/utf_string_conversions.h"
9 #include "ui/base/dragdrop/drag_drop_types.h"
9 #include "ui/events/test/event_generator.h" 10 #include "ui/events/test/event_generator.h"
10 #include "ui/views/controls/button/menu_button_listener.h" 11 #include "ui/views/controls/button/menu_button_listener.h"
12 #include "ui/views/drag_controller.h"
11 #include "ui/views/test/views_test_base.h" 13 #include "ui/views/test/views_test_base.h"
12 14
15 #if defined(USE_AURA)
16 #include "ui/events/event.h"
17 #include "ui/events/event_handler.h"
18 #include "ui/wm/public/drag_drop_client.h"
19 #endif
20
13 using base::ASCIIToUTF16; 21 using base::ASCIIToUTF16;
14 22
15 namespace views { 23 namespace views {
16 24
17 class MenuButtonTest : public ViewsTestBase { 25 class MenuButtonTest : public ViewsTestBase {
18 public: 26 public:
19 MenuButtonTest() : widget_(NULL), button_(NULL) {} 27 MenuButtonTest() : widget_(NULL), button_(NULL) {}
20 virtual ~MenuButtonTest() {} 28 virtual ~MenuButtonTest() {}
21 29
22 virtual void TearDown() override { 30 virtual void TearDown() override {
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
100 private: 108 private:
101 Button* last_sender_; 109 Button* last_sender_;
102 Button::ButtonState last_sender_state_; 110 Button::ButtonState last_sender_state_;
103 ui::EventType last_event_type_; 111 ui::EventType last_event_type_;
104 112
105 DISALLOW_COPY_AND_ASSIGN(TestButtonListener); 113 DISALLOW_COPY_AND_ASSIGN(TestButtonListener);
106 }; 114 };
107 115
108 class TestMenuButtonListener : public MenuButtonListener { 116 class TestMenuButtonListener : public MenuButtonListener {
109 public: 117 public:
110 TestMenuButtonListener() {} 118 TestMenuButtonListener()
119 : last_source_(NULL),
sky 2014/10/23 17:25:31 NULL->nullptr
jonross 2014/10/23 22:18:00 Done.
120 last_source_state_(Button::STATE_NORMAL) {}
111 virtual ~TestMenuButtonListener() {} 121 virtual ~TestMenuButtonListener() {}
112 122
113 virtual void OnMenuButtonClicked(View* source, 123 virtual void OnMenuButtonClicked(View* source,
114 const gfx::Point& /*point*/) override { 124 const gfx::Point& /*point*/) override {
115 last_source_ = source; 125 last_source_ = source;
116 CustomButton* custom_button = CustomButton::AsCustomButton(source); 126 CustomButton* custom_button = CustomButton::AsCustomButton(source);
117 DCHECK(custom_button); 127 DCHECK(custom_button);
118 last_source_state_ = custom_button->state(); 128 last_source_state_ = custom_button->state();
119 } 129 }
120 130
121 View* last_source() { return last_source_; } 131 View* last_source() { return last_source_; }
122 Button::ButtonState last_source_state() { return last_source_state_; } 132 Button::ButtonState last_source_state() { return last_source_state_; }
123 133
124 private: 134 private:
125 View* last_source_; 135 View* last_source_;
126 Button::ButtonState last_source_state_; 136 Button::ButtonState last_source_state_;
127 }; 137 };
128 138
139 // Basic implementation of a DragController, to test input behaviour for
140 // MenuButtons that can be dragged.
141 class TestDragController : public DragController {
142 public:
143 TestDragController() {}
144 virtual ~TestDragController() {}
sky 2014/10/23 17:25:31 no virtual, just override.
jonross 2014/10/23 22:18:00 Done.
145
146 virtual void WriteDragDataForView(View* sender,
sky 2014/10/23 17:25:31 No virtual, just override (ya, style changed).
jonross 2014/10/23 22:18:01 Done.
147 const gfx::Point& press_pt,
148 ui::OSExchangeData* data) override {}
149
150 virtual int GetDragOperationsForView(View* sender,
151 const gfx::Point& p) override {
152 return ui::DragDropTypes::DRAG_MOVE;
153 }
154
155 virtual bool CanStartDragForView(View* sender,
156 const gfx::Point& press_pt,
157 const gfx::Point& p) override {
158 return true;
159 }
160
161 private:
162 DISALLOW_COPY_AND_ASSIGN(TestDragController);
163 };
164
165 #if defined(USE_AURA)
166 // Basic implementation of a DragDropClient, tracking the state of the drag
167 // operation. While dragging addition mouse events are consumed, preventing the
168 // target view from receiving them.
169 class TestDragDropClient : public aura::client::DragDropClient,
170 public ui::EventHandler {
171 public:
172 TestDragDropClient();
173 virtual ~TestDragDropClient();
174
175 // aura::client::DragDropClient:
176 virtual int StartDragAndDrop(const ui::OSExchangeData& data,
177 aura::Window* root_window,
178 aura::Window* source_window,
179 const gfx::Point& root_location,
180 int operation,
181 ui::DragDropTypes::DragEventSource source) override;
182 virtual void DragUpdate(aura::Window* target,
183 const ui::LocatedEvent& event) override;
184 virtual void Drop(aura::Window* target,
185 const ui::LocatedEvent& event) override;
186 virtual void DragCancel() override;
187 virtual bool IsDragDropInProgress() override;
188
189 // ui::EventHandler:
190 virtual void OnMouseEvent(ui::MouseEvent* event) override;
191
192 private:
193 // True while receiving ui::LocatedEvents for drag operations.
194 bool drag_in_progress_;
195
196 // Target window where drag operations are occuring.
197 aura::Window* target_;
198
199 DISALLOW_COPY_AND_ASSIGN(TestDragDropClient);
200 };
201
202 TestDragDropClient::TestDragDropClient() : drag_in_progress_(false),
sky 2014/10/23 17:25:31 run git cl format.
jonross 2014/10/23 22:18:00 Done.
203 target_(NULL) {
sky 2014/10/23 17:25:31 nullptr
jonross 2014/10/23 22:18:01 Done.
204 }
205
206 TestDragDropClient::~TestDragDropClient() {
207 }
208
209 int TestDragDropClient::StartDragAndDrop(const ui::OSExchangeData& data,
210 aura::Window* root_window,
211 aura::Window* source_window,
212 const gfx::Point& root_location,
213 int operation,
214 ui::DragDropTypes::DragEventSource source) {
215 if (IsDragDropInProgress())
216 return 0;
sky 2014/10/23 17:25:31 DRAG_NONE
jonross 2014/10/23 22:18:01 Done.
217 drag_in_progress_ = true;
218 target_ = root_window;
219 return operation;
220 }
221
222 void TestDragDropClient::DragUpdate(aura::Window* target,
223 const ui::LocatedEvent& event) {
224 }
225
226 void TestDragDropClient::Drop(aura::Window* target,
227 const ui::LocatedEvent& event) {
228 drag_in_progress_ = false;
229 }
230
231 void TestDragDropClient::DragCancel() {
232 drag_in_progress_ = false;
233 }
234
235 bool TestDragDropClient::IsDragDropInProgress() {
236 return drag_in_progress_;
237 }
238
239 void TestDragDropClient::OnMouseEvent(ui::MouseEvent* event) {
240 if (!IsDragDropInProgress())
241 return;
242 switch (event->type()) {
243 case ui::ET_MOUSE_DRAGGED:
244 DragUpdate(target_, *event);
245 event->StopPropagation();
246 break;
247 case ui::ET_MOUSE_RELEASED:
248 Drop(target_, *event);
249 event->StopPropagation();
250 break;
251 default:
252 break;
253 }
254 }
255 #endif // defined(USE_AURA)
256
129 // Tests if the listener is notified correctly, when a mouse click happens on a 257 // Tests if the listener is notified correctly, when a mouse click happens on a
130 // MenuButton that has a regular ButtonListener. 258 // MenuButton that has a regular ButtonListener.
131 TEST_F(MenuButtonTest, ActivateNonDropDownOnMouseClick) { 259 TEST_F(MenuButtonTest, ActivateNonDropDownOnMouseClick) {
132 scoped_ptr<TestButtonListener> button_listener(new TestButtonListener); 260 scoped_ptr<TestButtonListener> button_listener(new TestButtonListener);
133 CreateMenuButtonWithButtonListener(button_listener.get()); 261 CreateMenuButtonWithButtonListener(button_listener.get());
134 262
135 ui::test::EventGenerator generator(GetContext(), widget()->GetNativeWindow()); 263 ui::test::EventGenerator generator(GetContext(), widget()->GetNativeWindow());
136 264
137 generator.set_current_location(gfx::Point(10, 10)); 265 generator.set_current_location(gfx::Point(10, 10));
138 generator.ClickLeftButton(); 266 generator.ClickLeftButton();
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
223 351
224 // Reseting the final lock should return the button's state to normal... 352 // Reseting the final lock should return the button's state to normal...
225 pressed_lock2.reset(); 353 pressed_lock2.reset();
226 EXPECT_EQ(Button::STATE_NORMAL, button()->state()); 354 EXPECT_EQ(Button::STATE_NORMAL, button()->state());
227 355
228 // ...And it should respond to mouse movement again. 356 // ...And it should respond to mouse movement again.
229 generator.MoveMouseTo(gfx::Point(10, 10)); 357 generator.MoveMouseTo(gfx::Point(10, 10));
230 EXPECT_EQ(Button::STATE_HOVERED, button()->state()); 358 EXPECT_EQ(Button::STATE_HOVERED, button()->state());
231 } 359 }
232 360
361 // Test that the MenuButton does not become pressed if it can be dragged, until
362 // a release occurs.
363 TEST_F(MenuButtonTest, DraggableMenuButtonActivatesOnRelease) {
364 scoped_ptr<TestMenuButtonListener> menu_button_listener(
sky 2014/10/23 17:25:31 No need to put in scoped_ptr, create on the stack.
jonross 2014/10/23 22:18:01 Done.
365 new TestMenuButtonListener);
366 CreateMenuButtonWithMenuButtonListener(menu_button_listener.get());
367 TestDragController drag_controller;
368 button()->set_drag_controller(&drag_controller);
369
370 ui::test::EventGenerator generator(GetContext(), widget()->GetNativeWindow());
371
372 generator.set_current_location(gfx::Point(10, 10));
373 generator.PressLeftButton();
374 EXPECT_EQ(NULL, menu_button_listener->last_source());
sky 2014/10/23 17:25:31 nullptr
jonross 2014/10/23 22:18:01 Done.
375
376
sky 2014/10/23 17:25:31 only one newline is needed here.
jonross 2014/10/23 22:18:01 Done.
377 generator.ReleaseLeftButton();
378 EXPECT_EQ(button(), menu_button_listener->last_source());
379 EXPECT_EQ(Button::STATE_PRESSED, menu_button_listener->last_source_state());
sky 2014/10/23 17:25:31 Why does the button stay pressed when the mouse is
jonross 2014/10/23 22:18:01 When a menu button activates to show the list of a
380 }
381
382 #if defined(USE_AURA)
383 // Tests that the MenuButton does not become pressed if it can be dragged, and a
384 // DragDropClient is processing the events.
385 TEST_F(MenuButtonTest, DraggableMenuButtonDoesNotActivateOnDrag) {
386 scoped_ptr<TestMenuButtonListener> menu_button_listener(
sky 2014/10/23 17:25:31 same comment about creating on the stack.
jonross 2014/10/23 22:18:01 Done.
387 new TestMenuButtonListener);
388 CreateMenuButtonWithMenuButtonListener(menu_button_listener.get());
389 TestDragController drag_controller;
390 button()->set_drag_controller(&drag_controller);
391
392 TestDragDropClient drag_client;
393 SetDragDropClient(GetContext(), &drag_client);
394 button()->PrependPreTargetHandler(&drag_client);
395
396 ui::test::EventGenerator generator(GetContext(), widget()->GetNativeWindow());
397 generator.set_current_location(gfx::Point(10, 10));
398 generator.DragMouseBy(10,0);
399 EXPECT_EQ(NULL, menu_button_listener->last_source());
400 EXPECT_EQ(Button::STATE_NORMAL, menu_button_listener->last_source_state());
401 }
402 #endif
403
233 } // namespace views 404 } // namespace views
OLDNEW
« no previous file with comments | « ui/views/controls/button/menu_button.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698