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

Side by Side Diff: ui/views/widget/widget_unittest.cc

Issue 23533030: rAc: Enforce a 3 second grace period for generated card bubble. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: exclude test on !views Created 7 years, 3 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) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 <algorithm> 5 #include <algorithm>
6 #include <set> 6 #include <set>
7 7
8 #include "base/basictypes.h" 8 #include "base/basictypes.h"
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
11 #include "base/message_loop/message_loop.h" 11 #include "base/message_loop/message_loop.h"
12 #include "base/run_loop.h" 12 #include "base/run_loop.h"
13 #include "base/strings/utf_string_conversions.h" 13 #include "base/strings/utf_string_conversions.h"
14 #include "testing/gtest/include/gtest/gtest.h" 14 #include "testing/gtest/include/gtest/gtest.h"
15 #include "ui/base/events/event_utils.h" 15 #include "ui/base/events/event_utils.h"
16 #include "ui/gfx/native_widget_types.h" 16 #include "ui/gfx/native_widget_types.h"
17 #include "ui/gfx/point.h" 17 #include "ui/gfx/point.h"
18 #include "ui/views/bubble/bubble_delegate.h" 18 #include "ui/views/bubble/bubble_delegate.h"
19 #include "ui/views/controls/textfield/textfield.h" 19 #include "ui/views/controls/textfield/textfield.h"
20 #include "ui/views/test/test_views_delegate.h" 20 #include "ui/views/test/test_views_delegate.h"
21 #include "ui/views/test/views_test_base.h" 21 #include "ui/views/test/widget_test.h"
22 #include "ui/views/views_delegate.h" 22 #include "ui/views/views_delegate.h"
23 #include "ui/views/widget/native_widget_delegate.h" 23 #include "ui/views/widget/native_widget_delegate.h"
24 #include "ui/views/widget/root_view.h" 24 #include "ui/views/widget/root_view.h"
25 #include "ui/views/window/native_frame_view.h" 25 #include "ui/views/window/native_frame_view.h"
26 26
27 #if defined(USE_AURA) 27 #if defined(USE_AURA)
28 #include "ui/aura/client/aura_constants.h" 28 #include "ui/aura/client/aura_constants.h"
29 #include "ui/aura/env.h"
30 #include "ui/aura/root_window.h" 29 #include "ui/aura/root_window.h"
31 #include "ui/aura/test/test_cursor_client.h" 30 #include "ui/aura/test/test_cursor_client.h"
32 #include "ui/aura/test/test_window_delegate.h" 31 #include "ui/aura/test/test_window_delegate.h"
33 #include "ui/aura/window.h" 32 #include "ui/aura/window.h"
34 #include "ui/views/widget/native_widget_aura.h" 33 #include "ui/views/widget/native_widget_aura.h"
35 #if !defined(OS_CHROMEOS) 34 #if !defined(OS_CHROMEOS)
36 #include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h" 35 #include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h"
37 #endif 36 #endif
38 #elif defined(OS_WIN) 37 #elif defined(OS_WIN)
39 #include "ui/views/widget/native_widget_win.h" 38 #include "ui/views/widget/native_widget_win.h"
40 #endif 39 #endif
41 40
42 namespace views { 41 namespace views {
43 namespace test { 42 namespace test {
44 43
45 // A generic typedef to pick up relevant NativeWidget implementations.
46 #if defined(USE_AURA)
47 typedef NativeWidgetAura NativeWidgetPlatform;
48 #elif defined(OS_WIN)
49 typedef NativeWidgetWin NativeWidgetPlatform;
50 #endif
51
52 // A widget that assumes mouse capture always works. It won't on Aura in
53 // testing, so we mock it.
54 #if defined(USE_AURA)
55 class NativeWidgetCapture : public NativeWidgetPlatform {
56 public:
57 explicit NativeWidgetCapture(internal::NativeWidgetDelegate* delegate)
58 : NativeWidgetPlatform(delegate),
59 mouse_capture_(false) {}
60 virtual ~NativeWidgetCapture() {}
61
62 virtual void SetCapture() OVERRIDE {
63 mouse_capture_ = true;
64 }
65 virtual void ReleaseCapture() OVERRIDE {
66 if (mouse_capture_)
67 delegate()->OnMouseCaptureLost();
68 mouse_capture_ = false;
69 }
70 virtual bool HasCapture() const OVERRIDE {
71 return mouse_capture_;
72 }
73
74 private:
75 bool mouse_capture_;
76
77 DISALLOW_COPY_AND_ASSIGN(NativeWidgetCapture);
78 };
79 #endif
80
81 // A typedef that inserts our mock-capture NativeWidget implementation for
82 // relevant platforms.
83 #if defined(USE_AURA)
84 typedef NativeWidgetCapture NativeWidgetPlatformForTest;
85 #elif defined(OS_WIN)
86 typedef NativeWidgetWin NativeWidgetPlatformForTest;
87 #endif
88
89 // A view that always processes all mouse events.
90 class MouseView : public View {
91 public:
92 MouseView()
93 : View(),
94 entered_(0),
95 exited_(0),
96 pressed_(0) {
97 }
98 virtual ~MouseView() {}
99
100 virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE {
101 pressed_++;
102 return true;
103 }
104
105 virtual void OnMouseEntered(const ui::MouseEvent& event) OVERRIDE {
106 entered_++;
107 }
108
109 virtual void OnMouseExited(const ui::MouseEvent& event) OVERRIDE {
110 exited_++;
111 }
112
113 // Return the number of OnMouseEntered calls and reset the counter.
114 int EnteredCalls() {
115 int i = entered_;
116 entered_ = 0;
117 return i;
118 }
119
120 // Return the number of OnMouseExited calls and reset the counter.
121 int ExitedCalls() {
122 int i = exited_;
123 exited_ = 0;
124 return i;
125 }
126
127 int pressed() const { return pressed_; }
128
129 private:
130 int entered_;
131 int exited_;
132
133 int pressed_;
134
135 DISALLOW_COPY_AND_ASSIGN(MouseView);
136 };
137
138 // A view that keeps track of the events it receives, but consumes no events. 44 // A view that keeps track of the events it receives, but consumes no events.
139 class EventCountView : public View { 45 class EventCountView : public View {
140 public: 46 public:
141 EventCountView() {} 47 EventCountView() {}
142 virtual ~EventCountView() {} 48 virtual ~EventCountView() {}
143 49
144 int GetEventCount(ui::EventType type) { 50 int GetEventCount(ui::EventType type) {
145 return event_count_[type]; 51 return event_count_[type];
146 } 52 }
147 53
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
196 event->SetHandled(); 102 event->SetHandled();
197 break; 103 break;
198 default: 104 default:
199 break; 105 break;
200 } 106 }
201 } 107 }
202 108
203 DISALLOW_COPY_AND_ASSIGN(ScrollableEventCountView); 109 DISALLOW_COPY_AND_ASSIGN(ScrollableEventCountView);
204 }; 110 };
205 111
206 // A view that does a capture on gesture-begin events.
207 class GestureCaptureView : public View {
208 public:
209 GestureCaptureView() {}
210 virtual ~GestureCaptureView() {}
211
212 private:
213 // Overridden from View:
214 virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE {
215 if (event->type() == ui::ET_GESTURE_BEGIN) {
216 GetWidget()->SetCapture(this);
217 event->StopPropagation();
218 }
219 }
220
221 DISALLOW_COPY_AND_ASSIGN(GestureCaptureView);
222 };
223
224 // A view that implements GetMinimumSize. 112 // A view that implements GetMinimumSize.
225 class MinimumSizeFrameView : public NativeFrameView { 113 class MinimumSizeFrameView : public NativeFrameView {
226 public: 114 public:
227 explicit MinimumSizeFrameView(Widget* frame): NativeFrameView(frame) {} 115 explicit MinimumSizeFrameView(Widget* frame): NativeFrameView(frame) {}
228 virtual ~MinimumSizeFrameView() {} 116 virtual ~MinimumSizeFrameView() {}
229 117
230 private: 118 private:
231 // Overridden from View: 119 // Overridden from View:
232 virtual gfx::Size GetMinimumSize() OVERRIDE { 120 virtual gfx::Size GetMinimumSize() OVERRIDE {
233 return gfx::Size(300, 400); 121 return gfx::Size(300, 400);
(...skipping 27 matching lines...) Expand all
261 private: 149 private:
262 void RecordEvent(const ui::Event& event) { 150 void RecordEvent(const ui::Event& event) {
263 ++event_count_[event.type()]; 151 ++event_count_[event.type()];
264 } 152 }
265 153
266 std::map<ui::EventType, int> event_count_; 154 std::map<ui::EventType, int> event_count_;
267 155
268 DISALLOW_COPY_AND_ASSIGN(EventCountHandler); 156 DISALLOW_COPY_AND_ASSIGN(EventCountHandler);
269 }; 157 };
270 158
271 // A View that shows a different widget, sets capture on that widget, and
272 // initiates a nested message-loop when it receives a mouse-press event.
273 class NestedLoopCaptureView : public View {
274 public:
275 explicit NestedLoopCaptureView(Widget* widget) : widget_(widget) {}
276 virtual ~NestedLoopCaptureView() {}
277
278 private:
279 // Overridden from View:
280 virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE {
281 // Start a nested loop.
282 widget_->Show();
283 widget_->SetCapture(widget_->GetContentsView());
284 EXPECT_TRUE(widget_->HasCapture());
285
286 base::MessageLoopForUI* loop = base::MessageLoopForUI::current();
287 base::MessageLoop::ScopedNestableTaskAllower allow(loop);
288
289 base::RunLoop run_loop;
290 #if defined(USE_AURA)
291 run_loop.set_dispatcher(aura::Env::GetInstance()->GetDispatcher());
292 #endif
293 run_loop.Run();
294 return true;
295 }
296
297 Widget* widget_;
298
299 DISALLOW_COPY_AND_ASSIGN(NestedLoopCaptureView);
300 };
301
302 // A View that closes the Widget and exits the current message-loop when it
303 // receives a mouse-release event.
304 class ExitLoopOnRelease : public View {
305 public:
306 ExitLoopOnRelease() {}
307 virtual ~ExitLoopOnRelease() {}
308
309 private:
310 // Overridden from View:
311 virtual void OnMouseReleased(const ui::MouseEvent& event) OVERRIDE {
312 GetWidget()->Close();
313 base::MessageLoop::current()->QuitNow();
314 }
315
316 DISALLOW_COPY_AND_ASSIGN(ExitLoopOnRelease);
317 };
318
319 class WidgetTest : public ViewsTestBase {
320 public:
321 WidgetTest() {}
322 virtual ~WidgetTest() {}
323
324 NativeWidget* CreatePlatformNativeWidget(
325 internal::NativeWidgetDelegate* delegate) {
326 return new NativeWidgetPlatformForTest(delegate);
327 }
328
329 Widget* CreateTopLevelPlatformWidget() {
330 Widget* toplevel = new Widget;
331 Widget::InitParams toplevel_params =
332 CreateParams(Widget::InitParams::TYPE_WINDOW);
333 toplevel_params.native_widget = CreatePlatformNativeWidget(toplevel);
334 toplevel->Init(toplevel_params);
335 return toplevel;
336 }
337
338 Widget* CreateTopLevelFramelessPlatformWidget() {
339 Widget* toplevel = new Widget;
340 Widget::InitParams toplevel_params =
341 CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
342 toplevel_params.native_widget = CreatePlatformNativeWidget(toplevel);
343 toplevel->Init(toplevel_params);
344 return toplevel;
345 }
346
347 Widget* CreateChildPlatformWidget(gfx::NativeView parent_native_view) {
348 Widget* child = new Widget;
349 Widget::InitParams child_params =
350 CreateParams(Widget::InitParams::TYPE_CONTROL);
351 child_params.native_widget = CreatePlatformNativeWidget(child);
352 child_params.parent = parent_native_view;
353 child->Init(child_params);
354 child->SetContentsView(new View);
355 return child;
356 }
357
358 #if defined(OS_WIN) && !defined(USE_AURA)
359 // On Windows, it is possible for us to have a child window that is
360 // TYPE_POPUP.
361 Widget* CreateChildPopupPlatformWidget(gfx::NativeView parent_native_view) {
362 Widget* child = new Widget;
363 Widget::InitParams child_params =
364 CreateParams(Widget::InitParams::TYPE_POPUP);
365 child_params.child = true;
366 child_params.native_widget = CreatePlatformNativeWidget(child);
367 child_params.parent = parent_native_view;
368 child->Init(child_params);
369 child->SetContentsView(new View);
370 return child;
371 }
372 #endif
373
374 Widget* CreateTopLevelNativeWidget() {
375 Widget* toplevel = new Widget;
376 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
377 toplevel->Init(params);
378 return toplevel;
379 }
380
381 Widget* CreateChildNativeWidgetWithParent(Widget* parent) {
382 Widget* child = new Widget;
383 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_CONTROL);
384 params.parent = parent->GetNativeView();
385 child->Init(params);
386 child->SetContentsView(new View);
387 return child;
388 }
389
390 Widget* CreateChildNativeWidget() {
391 return CreateChildNativeWidgetWithParent(NULL);
392 }
393
394 View* GetMousePressedHandler(internal::RootView* root_view) {
395 return root_view->mouse_pressed_handler_;
396 }
397
398 View* GetMouseMoveHandler(internal::RootView* root_view) {
399 return root_view->mouse_move_handler_;
400 }
401
402 View* GetGestureHandler(internal::RootView* root_view) {
403 return root_view->gesture_handler_;
404 }
405 };
406
407 bool WidgetHasMouseCapture(const Widget* widget) {
408 return static_cast<const internal::NativeWidgetPrivate*>(widget->
409 native_widget())->HasCapture();
410 }
411
412 ui::WindowShowState GetWidgetShowState(const Widget* widget) { 159 ui::WindowShowState GetWidgetShowState(const Widget* widget) {
413 // Use IsMaximized/IsMinimized/IsFullScreen instead of GetWindowPlacement 160 // Use IsMaximized/IsMinimized/IsFullScreen instead of GetWindowPlacement
414 // because the former is implemented on all platforms but the latter is not. 161 // because the former is implemented on all platforms but the latter is not.
415 return widget->IsFullscreen() ? ui::SHOW_STATE_FULLSCREEN : 162 return widget->IsFullscreen() ? ui::SHOW_STATE_FULLSCREEN :
416 widget->IsMaximized() ? ui::SHOW_STATE_MAXIMIZED : 163 widget->IsMaximized() ? ui::SHOW_STATE_MAXIMIZED :
417 widget->IsMinimized() ? ui::SHOW_STATE_MINIMIZED : 164 widget->IsMinimized() ? ui::SHOW_STATE_MINIMIZED :
418 ui::SHOW_STATE_NORMAL; 165 ui::SHOW_STATE_NORMAL;
419 } 166 }
420 167
421 TEST_F(WidgetTest, WidgetInitParams) { 168 TEST_F(WidgetTest, WidgetInitParams) {
(...skipping 26 matching lines...) Expand all
448 gfx::NativeView parent = toplevel->GetNativeView(); 195 gfx::NativeView parent = toplevel->GetNativeView();
449 Widget* child = CreateChildPlatformWidget(parent); 196 Widget* child = CreateChildPlatformWidget(parent);
450 197
451 EXPECT_EQ(toplevel, toplevel->GetTopLevelWidget()); 198 EXPECT_EQ(toplevel, toplevel->GetTopLevelWidget());
452 EXPECT_EQ(toplevel, child->GetTopLevelWidget()); 199 EXPECT_EQ(toplevel, child->GetTopLevelWidget());
453 200
454 toplevel->CloseNow(); 201 toplevel->CloseNow();
455 // |child| should be automatically destroyed with |toplevel|. 202 // |child| should be automatically destroyed with |toplevel|.
456 } 203 }
457 204
458 // Tests some grab/ungrab events.
459 TEST_F(WidgetTest, DISABLED_GrabUngrab) {
460 Widget* toplevel = CreateTopLevelPlatformWidget();
461 Widget* child1 = CreateChildNativeWidgetWithParent(toplevel);
462 Widget* child2 = CreateChildNativeWidgetWithParent(toplevel);
463
464 toplevel->SetBounds(gfx::Rect(0, 0, 500, 500));
465
466 child1->SetBounds(gfx::Rect(10, 10, 300, 300));
467 View* view = new MouseView();
468 view->SetBounds(0, 0, 300, 300);
469 child1->GetRootView()->AddChildView(view);
470
471 child2->SetBounds(gfx::Rect(200, 10, 200, 200));
472 view = new MouseView();
473 view->SetBounds(0, 0, 200, 200);
474 child2->GetRootView()->AddChildView(view);
475
476 toplevel->Show();
477 RunPendingMessages();
478
479 // Click on child1
480 gfx::Point p1(45, 45);
481 ui::MouseEvent pressed(ui::ET_MOUSE_PRESSED, p1, p1,
482 ui::EF_LEFT_MOUSE_BUTTON);
483 toplevel->OnMouseEvent(&pressed);
484
485 EXPECT_TRUE(WidgetHasMouseCapture(toplevel));
486 EXPECT_TRUE(WidgetHasMouseCapture(child1));
487 EXPECT_FALSE(WidgetHasMouseCapture(child2));
488
489 ui::MouseEvent released(ui::ET_MOUSE_RELEASED, p1, p1,
490 ui::EF_LEFT_MOUSE_BUTTON);
491 toplevel->OnMouseEvent(&released);
492
493 EXPECT_FALSE(WidgetHasMouseCapture(toplevel));
494 EXPECT_FALSE(WidgetHasMouseCapture(child1));
495 EXPECT_FALSE(WidgetHasMouseCapture(child2));
496
497 RunPendingMessages();
498
499 // Click on child2
500 gfx::Point p2(315, 45);
501 ui::MouseEvent pressed2(ui::ET_MOUSE_PRESSED, p2, p2,
502 ui::EF_LEFT_MOUSE_BUTTON);
503 toplevel->OnMouseEvent(&pressed2);
504 EXPECT_TRUE(pressed2.handled());
505 EXPECT_TRUE(WidgetHasMouseCapture(toplevel));
506 EXPECT_TRUE(WidgetHasMouseCapture(child2));
507 EXPECT_FALSE(WidgetHasMouseCapture(child1));
508
509 ui::MouseEvent released2(ui::ET_MOUSE_RELEASED, p2, p2,
510 ui::EF_LEFT_MOUSE_BUTTON);
511 toplevel->OnMouseEvent(&released2);
512 EXPECT_FALSE(WidgetHasMouseCapture(toplevel));
513 EXPECT_FALSE(WidgetHasMouseCapture(child1));
514 EXPECT_FALSE(WidgetHasMouseCapture(child2));
515
516 toplevel->CloseNow();
517 }
518
519 // Tests mouse move outside of the window into the "resize controller" and back
520 // will still generate an OnMouseEntered and OnMouseExited event..
521 TEST_F(WidgetTest, CheckResizeControllerEvents) {
522 Widget* toplevel = CreateTopLevelPlatformWidget();
523
524 toplevel->SetBounds(gfx::Rect(0, 0, 100, 100));
525
526 MouseView* view = new MouseView();
527 view->SetBounds(90, 90, 10, 10);
528 toplevel->GetRootView()->AddChildView(view);
529
530 toplevel->Show();
531 RunPendingMessages();
532
533 // Move to an outside position.
534 gfx::Point p1(200, 200);
535 ui::MouseEvent moved_out(ui::ET_MOUSE_MOVED, p1, p1, ui::EF_NONE);
536 toplevel->OnMouseEvent(&moved_out);
537 EXPECT_EQ(0, view->EnteredCalls());
538 EXPECT_EQ(0, view->ExitedCalls());
539
540 // Move onto the active view.
541 gfx::Point p2(95, 95);
542 ui::MouseEvent moved_over(ui::ET_MOUSE_MOVED, p2, p2, ui::EF_NONE);
543 toplevel->OnMouseEvent(&moved_over);
544 EXPECT_EQ(1, view->EnteredCalls());
545 EXPECT_EQ(0, view->ExitedCalls());
546
547 // Move onto the outer resizing border.
548 gfx::Point p3(102, 95);
549 ui::MouseEvent moved_resizer(ui::ET_MOUSE_MOVED, p3, p3, ui::EF_NONE);
550 toplevel->OnMouseEvent(&moved_resizer);
551 EXPECT_EQ(0, view->EnteredCalls());
552 EXPECT_EQ(1, view->ExitedCalls());
553
554 // Move onto the view again.
555 toplevel->OnMouseEvent(&moved_over);
556 EXPECT_EQ(1, view->EnteredCalls());
557 EXPECT_EQ(0, view->ExitedCalls());
558
559 RunPendingMessages();
560
561 toplevel->CloseNow();
562 }
563
564 // Test if a focus manager and an inputmethod work without CHECK failure 205 // Test if a focus manager and an inputmethod work without CHECK failure
565 // when window activation changes. 206 // when window activation changes.
566 TEST_F(WidgetTest, ChangeActivation) { 207 TEST_F(WidgetTest, ChangeActivation) {
567 Widget* top1 = CreateTopLevelPlatformWidget(); 208 Widget* top1 = CreateTopLevelPlatformWidget();
568 // CreateInputMethod before activated 209 // CreateInputMethod before activated
569 top1->GetInputMethod(); 210 top1->GetInputMethod();
570 top1->Show(); 211 top1->Show();
571 RunPendingMessages(); 212 RunPendingMessages();
572 213
573 Widget* top2 = CreateTopLevelPlatformWidget(); 214 Widget* top2 = CreateTopLevelPlatformWidget();
(...skipping 693 matching lines...) Expand 10 before | Expand all | Expand 10 after
1267 RunPendingMessages(); 908 RunPendingMessages();
1268 909
1269 // And it stays maximized after getting out of full screen. 910 // And it stays maximized after getting out of full screen.
1270 EXPECT_EQ(ui::SHOW_STATE_MAXIMIZED, GetWidgetShowState(toplevel)); 911 EXPECT_EQ(ui::SHOW_STATE_MAXIMIZED, GetWidgetShowState(toplevel));
1271 912
1272 // Clean up. 913 // Clean up.
1273 toplevel->Close(); 914 toplevel->Close();
1274 RunPendingMessages(); 915 RunPendingMessages();
1275 } 916 }
1276 917
1277 // Checks that if a mouse-press triggers a capture on a different widget (which
1278 // consumes the mouse-release event), then the target of the press does not have
1279 // capture.
1280 // Fails on chromium.webkit Windows bot, see crbug.com/264872.
1281 #if defined(OS_WIN)
1282 #define MAYBE_DisableCaptureWidgetFromMousePress\
1283 DISABLED_CaptureWidgetFromMousePress
1284 #else
1285 #define MAYBE_DisableCaptureWidgetFromMousePress\
1286 CaptureWidgetFromMousePress
1287 #endif
1288 TEST_F(WidgetTest, MAYBE_DisableCaptureWidgetFromMousePress) {
1289 // The test creates two widgets: |first| and |second|.
1290 // The View in |first| makes |second| visible, sets capture on it, and starts
1291 // a nested loop (like a menu does). The View in |second| terminates the
1292 // nested loop and closes the widget.
1293 // The test sends a mouse-press event to |first|, and posts a task to send a
1294 // release event to |second|, to make sure that the release event is
1295 // dispatched after the nested loop starts.
1296
1297 Widget* first = CreateTopLevelFramelessPlatformWidget();
1298 Widget* second = CreateTopLevelFramelessPlatformWidget();
1299
1300 View* container = new NestedLoopCaptureView(second);
1301 first->SetContentsView(container);
1302
1303 second->SetContentsView(new ExitLoopOnRelease());
1304
1305 first->SetSize(gfx::Size(100, 100));
1306 first->Show();
1307
1308 gfx::Point location(20, 20);
1309 base::MessageLoop::current()->PostTask(FROM_HERE,
1310 base::Bind(&Widget::OnMouseEvent,
1311 base::Unretained(second),
1312 base::Owned(new ui::MouseEvent(ui::ET_MOUSE_RELEASED,
1313 location,
1314 location,
1315 ui::EF_LEFT_MOUSE_BUTTON))));
1316 ui::MouseEvent press(ui::ET_MOUSE_PRESSED, location, location,
1317 ui::EF_LEFT_MOUSE_BUTTON);
1318 first->OnMouseEvent(&press);
1319 EXPECT_FALSE(first->HasCapture());
1320 first->Close();
1321 RunPendingMessages();
1322 }
1323
1324 TEST_F(WidgetTest, ResetCaptureOnGestureEnd) {
1325 Widget* toplevel = CreateTopLevelFramelessPlatformWidget();
1326 View* container = new View;
1327 toplevel->SetContentsView(container);
1328
1329 View* gesture = new GestureCaptureView;
1330 gesture->SetBounds(0, 0, 30, 30);
1331 container->AddChildView(gesture);
1332
1333 MouseView* mouse = new MouseView;
1334 mouse->SetBounds(30, 0, 30, 30);
1335 container->AddChildView(mouse);
1336
1337 toplevel->SetSize(gfx::Size(100, 100));
1338 toplevel->Show();
1339
1340 // Start a gesture on |gesture|.
1341 ui::GestureEvent begin(ui::ET_GESTURE_BEGIN,
1342 15, 15, 0, base::TimeDelta(),
1343 ui::GestureEventDetails(ui::ET_GESTURE_BEGIN, 0, 0), 1);
1344 ui::GestureEvent end(ui::ET_GESTURE_END,
1345 15, 15, 0, base::TimeDelta(),
1346 ui::GestureEventDetails(ui::ET_GESTURE_END, 0, 0), 1);
1347 toplevel->OnGestureEvent(&begin);
1348
1349 // Now try to click on |mouse|. Since |gesture| will have capture, |mouse|
1350 // will not receive the event.
1351 gfx::Point click_location(45, 15);
1352
1353 ui::MouseEvent press(ui::ET_MOUSE_PRESSED, click_location, click_location,
1354 ui::EF_LEFT_MOUSE_BUTTON);
1355 ui::MouseEvent release(ui::ET_MOUSE_RELEASED, click_location, click_location,
1356 ui::EF_LEFT_MOUSE_BUTTON);
1357
1358 toplevel->OnMouseEvent(&press);
1359 toplevel->OnMouseEvent(&release);
1360 EXPECT_EQ(0, mouse->pressed());
1361
1362 // The end of the gesture should release the capture, and pressing on |mouse|
1363 // should now reach |mouse|.
1364 toplevel->OnGestureEvent(&end);
1365 toplevel->OnMouseEvent(&press);
1366 toplevel->OnMouseEvent(&release);
1367 EXPECT_EQ(1, mouse->pressed());
1368
1369 toplevel->Close();
1370 RunPendingMessages();
1371 }
1372
1373 #if defined(USE_AURA) 918 #if defined(USE_AURA)
1374 // The key-event propagation from Widget happens differently on aura and 919 // The key-event propagation from Widget happens differently on aura and
1375 // non-aura systems because of the difference in IME. So this test works only on 920 // non-aura systems because of the difference in IME. So this test works only on
1376 // aura. 921 // aura.
1377 TEST_F(WidgetTest, KeyboardInputEvent) { 922 TEST_F(WidgetTest, KeyboardInputEvent) {
1378 Widget* toplevel = CreateTopLevelPlatformWidget(); 923 Widget* toplevel = CreateTopLevelPlatformWidget();
1379 View* container = toplevel->client_view(); 924 View* container = toplevel->client_view();
1380 925
1381 Textfield* textfield = new Textfield(); 926 Textfield* textfield = new Textfield();
1382 textfield->SetText(ASCIIToUTF16("some text")); 927 textfield->SetText(ASCIIToUTF16("some text"));
(...skipping 995 matching lines...) Expand 10 before | Expand all | Expand 10 after
2378 1923
2379 std::set<Widget*> widgets; 1924 std::set<Widget*> widgets;
2380 Widget::GetAllChildWidgets(toplevel->GetNativeView(), &widgets); 1925 Widget::GetAllChildWidgets(toplevel->GetNativeView(), &widgets);
2381 1926
2382 EXPECT_EQ(expected.size(), widgets.size()); 1927 EXPECT_EQ(expected.size(), widgets.size());
2383 EXPECT_TRUE(std::equal(expected.begin(), expected.end(), widgets.begin())); 1928 EXPECT_TRUE(std::equal(expected.begin(), expected.end(), widgets.begin()));
2384 } 1929 }
2385 1930
2386 } // namespace test 1931 } // namespace test
2387 } // namespace views 1932 } // namespace views
OLDNEW
« chrome/chrome_tests.gypi ('K') | « ui/views/widget/widget_interactive_uitest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698