OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 "chrome/test/interactive_ui/view_event_test_base.h" | 5 #include "chrome/test/interactive_ui/view_event_test_base.h" |
6 | 6 |
7 #if defined(OS_WIN) | 7 #if defined(OS_WIN) |
8 #include <ole2.h> | 8 #include <ole2.h> |
9 #endif | 9 #endif |
10 | 10 |
| 11 #include "base/compiler_specific.h" |
11 #include "base/message_loop.h" | 12 #include "base/message_loop.h" |
| 13 #include "base/string_util.h" |
12 #include "chrome/browser/automation/ui_controls.h" | 14 #include "chrome/browser/automation/ui_controls.h" |
13 #include "views/view.h" | 15 #include "views/view.h" |
14 #include "views/window/window.h" | 16 #include "views/window/window.h" |
15 | 17 |
16 namespace { | 18 namespace { |
17 | 19 |
| 20 // Default delay for the time-out at which we stop message loop. |
| 21 const int kTimeoutInMS = 20000; |
| 22 |
18 // View subclass that allows you to specify the preferred size. | 23 // View subclass that allows you to specify the preferred size. |
19 class TestView : public views::View { | 24 class TestView : public views::View { |
20 public: | 25 public: |
21 TestView() {} | 26 TestView() {} |
22 | 27 |
23 void SetPreferredSize(const gfx::Size& size) { | 28 void SetPreferredSize(const gfx::Size& size) { |
24 preferred_size_ = size; | 29 preferred_size_ = size; |
25 PreferredSizeChanged(); | 30 PreferredSizeChanged(); |
26 } | 31 } |
27 | 32 |
(...skipping 12 matching lines...) Expand all Loading... |
40 gfx::Size preferred_size_; | 45 gfx::Size preferred_size_; |
41 | 46 |
42 DISALLOW_COPY_AND_ASSIGN(TestView); | 47 DISALLOW_COPY_AND_ASSIGN(TestView); |
43 }; | 48 }; |
44 | 49 |
45 // Delay in background thread before posting mouse move. | 50 // Delay in background thread before posting mouse move. |
46 const int kMouseMoveDelayMS = 200; | 51 const int kMouseMoveDelayMS = 200; |
47 | 52 |
48 } // namespace | 53 } // namespace |
49 | 54 |
50 ViewEventTestBase::ViewEventTestBase() : window_(NULL), content_view_(NULL) { } | 55 ViewEventTestBase::ViewEventTestBase() |
| 56 : window_(NULL), |
| 57 content_view_(NULL), |
| 58 ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) { |
| 59 } |
51 | 60 |
52 void ViewEventTestBase::Done() { | 61 void ViewEventTestBase::Done() { |
| 62 // Cancel the pending time-out. |
| 63 method_factory_.RevokeAll(); |
| 64 |
53 MessageLoop::current()->Quit(); | 65 MessageLoop::current()->Quit(); |
54 | 66 |
55 #if defined(OS_WIN) | 67 #if defined(OS_WIN) |
56 // We need to post a message to tickle the Dispatcher getting called and | 68 // We need to post a message to tickle the Dispatcher getting called and |
57 // exiting out of the nested loop. Without this the quit never runs. | 69 // exiting out of the nested loop. Without this the quit never runs. |
58 PostMessage(window_->GetNativeWindow(), WM_USER, 0, 0); | 70 PostMessage(window_->GetNativeWindow(), WM_USER, 0, 0); |
59 #endif | 71 #endif |
60 | 72 |
61 // If we're in a nested message loop, as is the case with menus, we need | 73 // If we're in a nested message loop, as is the case with menus, we need |
62 // to quit twice. The second quit does that for us. | 74 // to quit twice. The second quit does that for us. |
63 MessageLoop::current()->PostDelayedTask( | 75 MessageLoop::current()->PostTask(FROM_HERE, new MessageLoop::QuitTask()); |
64 FROM_HERE, new MessageLoop::QuitTask(), 0); | |
65 } | 76 } |
66 | 77 |
67 void ViewEventTestBase::SetUp() { | 78 void ViewEventTestBase::SetUp() { |
68 #if defined(OS_WIN) | 79 #if defined(OS_WIN) |
69 OleInitialize(NULL); | 80 OleInitialize(NULL); |
70 #endif | 81 #endif |
71 window_ = views::Window::CreateChromeWindow(NULL, gfx::Rect(), this); | 82 window_ = views::Window::CreateChromeWindow(NULL, gfx::Rect(), this); |
72 } | 83 } |
73 | 84 |
74 void ViewEventTestBase::TearDown() { | 85 void ViewEventTestBase::TearDown() { |
(...skipping 28 matching lines...) Expand all Loading... |
103 // mouse events are going to be targeted correctly. | 114 // mouse events are going to be targeted correctly. |
104 #if defined(OS_WIN) | 115 #if defined(OS_WIN) |
105 SetForegroundWindow(window_->GetNativeWindow()); | 116 SetForegroundWindow(window_->GetNativeWindow()); |
106 #endif | 117 #endif |
107 | 118 |
108 // Flush any pending events to make sure we start with a clean slate. | 119 // Flush any pending events to make sure we start with a clean slate. |
109 MessageLoop::current()->RunAllPending(); | 120 MessageLoop::current()->RunAllPending(); |
110 | 121 |
111 // Schedule a task that starts the test. Need to do this as we're going to | 122 // Schedule a task that starts the test. Need to do this as we're going to |
112 // run the message loop. | 123 // run the message loop. |
113 MessageLoop::current()->PostDelayedTask( | 124 MessageLoop::current()->PostTask( |
114 FROM_HERE, | 125 FROM_HERE, |
115 NewRunnableMethod(this, &ViewEventTestBase::DoTestOnMessageLoop), 0); | 126 NewRunnableMethod(this, &ViewEventTestBase::DoTestOnMessageLoop)); |
| 127 |
| 128 // Start the timeout timer to prevent hangs. |
| 129 MessageLoop::current()->PostDelayedTask(FROM_HERE, |
| 130 method_factory_.NewRunnableMethod(&ViewEventTestBase::TimedOut), |
| 131 kTimeoutInMS); |
116 | 132 |
117 MessageLoop::current()->Run(); | 133 MessageLoop::current()->Run(); |
118 } | 134 } |
119 | 135 |
120 gfx::Size ViewEventTestBase::GetPreferredSize() { | 136 gfx::Size ViewEventTestBase::GetPreferredSize() { |
121 return gfx::Size(); | 137 return gfx::Size(); |
122 } | 138 } |
123 | 139 |
124 void ViewEventTestBase::ScheduleMouseMoveInBackground(int x, int y) { | 140 void ViewEventTestBase::ScheduleMouseMoveInBackground(int x, int y) { |
125 if (!dnd_thread_.get()) { | 141 if (!dnd_thread_.get()) { |
(...skipping 10 matching lines...) Expand all Loading... |
136 } | 152 } |
137 | 153 |
138 void ViewEventTestBase::RunTestMethod(Task* task) { | 154 void ViewEventTestBase::RunTestMethod(Task* task) { |
139 StopBackgroundThread(); | 155 StopBackgroundThread(); |
140 | 156 |
141 scoped_ptr<Task> task_deleter(task); | 157 scoped_ptr<Task> task_deleter(task); |
142 task->Run(); | 158 task->Run(); |
143 if (HasFatalFailure()) | 159 if (HasFatalFailure()) |
144 Done(); | 160 Done(); |
145 } | 161 } |
| 162 |
| 163 void ViewEventTestBase::TimedOut() { |
| 164 std::string error_message = "Test timed out. Each test runs for a max of "; |
| 165 error_message += IntToString(kTimeoutInMS); |
| 166 error_message += " ms (kTimeoutInMS)."; |
| 167 |
| 168 GTEST_NONFATAL_FAILURE_(error_message.c_str()); |
| 169 |
| 170 Done(); |
| 171 } |
OLD | NEW |