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

Side by Side Diff: ppapi/tests/test_input_event.cc

Issue 8413021: Add functions to generate input events to PPB_Testing_Dev. These make (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 1 month 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
(Empty)
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "ppapi/tests/test_input_event.h"
6
7 #include "ppapi/c/dev/ppb_testing_dev.h"
8 #include "ppapi/c/pp_errors.h"
9 #include "ppapi/c/ppb_input_event.h"
10 #include "ppapi/cpp/input_event.h"
11 #include "ppapi/cpp/module.h"
12 #include "ppapi/tests/test_utils.h"
13 #include "ppapi/tests/testing_instance.h"
14
15 REGISTER_TEST_CASE(InputEvent);
16
17 namespace {
18 pp::Point GetCenter(const pp::Rect& rect) {
19 return pp::Point(
20 rect.x() + rect.width() / 2,
21 rect.y() + rect.height() / 2);
22 }
23 }
24
25 void TestInputEvent::RunTests(const std::string& filter) {
26 RUN_TEST(Events, filter);
27 }
28
29 TestInputEvent::TestInputEvent(TestingInstance* instance)
30 : TestCase(instance),
31 input_event_interface_(NULL),
32 mouse_input_event_interface_(NULL),
33 wheel_input_event_interface_(NULL),
34 keyboard_input_event_interface_(NULL),
35 testing_interface_(NULL),
36 view_rect_(),
37 expected_input_event_(0),
38 unexpected_input_event_(0),
39 received_expected_event_(false),
40 received_unexpected_event_(false),
41 running_message_loop_(false) {
42 }
43
44 bool TestInputEvent::Init() {
45 input_event_interface_ = static_cast<PPB_InputEvent const*>(
46 pp::Module::Get()->GetBrowserInterface(PPB_INPUT_EVENT_INTERFACE));
47 mouse_input_event_interface_ = static_cast<PPB_MouseInputEvent const*>(
48 pp::Module::Get()->GetBrowserInterface(
49 PPB_MOUSE_INPUT_EVENT_INTERFACE));
50 wheel_input_event_interface_ = static_cast<PPB_WheelInputEvent const*>(
51 pp::Module::Get()->GetBrowserInterface(
52 PPB_WHEEL_INPUT_EVENT_INTERFACE));
53 keyboard_input_event_interface_ = static_cast<PPB_KeyboardInputEvent const*>(
54 pp::Module::Get()->GetBrowserInterface(
55 PPB_KEYBOARD_INPUT_EVENT_INTERFACE));
56
57 testing_interface_ = GetTestingInterface();
58 if (!testing_interface_) {
59 instance_->AppendError("Testing interface not available");
60 }
61
62 return
63 !!input_event_interface_ &&
piman 2011/11/19 22:31:00 nit: no need for !!, pointers implicitly cast to b
bbudge 2011/11/20 02:53:57 Done.
64 !!mouse_input_event_interface_ &&
65 !!wheel_input_event_interface_ &&
66 !!keyboard_input_event_interface_ &&
67 !!testing_interface_;
68 }
69
70 pp::InputEvent TestInputEvent::CreateMouseEvent() {
71 return CreateMouseEvent(PP_INPUTEVENT_TYPE_MOUSEDOWN,
72 PP_INPUTEVENT_MOUSEBUTTON_LEFT);
73 }
74
75 pp::InputEvent TestInputEvent::CreateMouseEvent(
76 PP_InputEvent_Type type,
77 PP_InputEvent_MouseButton buttons) {
78 return pp::MouseInputEvent(
79 instance_,
80 type,
81 100, // time_stamp
82 0, // modifiers
83 buttons,
84 GetCenter(view_rect_),
85 1, // click count
86 pp::Point()); // movement
87 }
88
89 pp::InputEvent TestInputEvent::CreateWheelEvent() {
90 return pp::WheelInputEvent(
91 instance_,
92 100, // time_stamp
93 0, // modifiers
94 pp::FloatPoint(1, 2),
95 pp::FloatPoint(3, 4),
96 PP_TRUE); // scroll_by_page
97 }
98
99 pp::InputEvent TestInputEvent::CreateKeyEvent() {
100 return CreateKeyEvent(PP_INPUTEVENT_TYPE_KEYDOWN,
101 0x20); // space
102 }
103
104 pp::InputEvent TestInputEvent::CreateKeyEvent(PP_InputEvent_Type type,
105 uint32_t key_code) {
106 return pp::KeyboardInputEvent(
107 instance_,
108 type,
109 100, // time_stamp
110 0, // modifiers
111 key_code,
112 pp::Var());
113 }
114
115 pp::InputEvent TestInputEvent::CreateCharEvent() {
116 return CreateCharEvent(" "); // space
117 }
118
119 pp::InputEvent TestInputEvent::CreateCharEvent(const std::string& text) {
120 return pp::KeyboardInputEvent(
121 instance_,
122 PP_INPUTEVENT_TYPE_CHAR,
123 100, // time_stamp
124 0, // modifiers
125 0, // keycode
126 pp::Var(text));
127 }
128
129 // Simulates the input event and make sure it is received by HandleInputEvent.
130 bool TestInputEvent::TestRequestedInputEvent(
131 const pp::InputEvent& input_event) {
132 expected_input_event_ = pp::InputEvent(input_event.pp_resource());
133 received_expected_event_ = false;
134 testing_interface_->SimulateInputEvent(instance_->pp_instance(),
135 input_event.pp_resource());
136 while (!received_expected_event_) {
piman 2011/11/19 22:31:00 So, the problem with this, is that you only have 2
bbudge 2011/11/20 02:53:57 Redid this using PostMessage. An excellent suggest
137 running_message_loop_ = true;
138 testing_interface_->RunMessageLoop(instance_->pp_instance());
139 }
140 return received_expected_event_;
141 }
142
143 // Simulates the unrequested and requested input events and makes sure only
144 // the requested one is received by HandleInputEvent. We can't (reliably test
piman 2011/11/19 22:31:00 typo: remove (.
bbudge 2011/11/20 02:53:57 Done.
145 // a case where no event is received in out-of-process plugins.
146 bool TestInputEvent::TestUnrequestedInputEvent(
147 const pp::InputEvent& unrequested_input_event,
148 const pp::InputEvent& requested_input_event) {
149 unexpected_input_event_ = pp::InputEvent(
150 unrequested_input_event.pp_resource());
151 received_unexpected_event_ = false;
152 testing_interface_->SimulateInputEvent(
153 instance_->pp_instance(), unrequested_input_event.pp_resource());
154 return
155 TestRequestedInputEvent(requested_input_event) &&
156 !received_unexpected_event_;
157 }
158
159 bool TestInputEvent::AreEquivalentEvents(PP_Resource received,
160 PP_Resource expected) {
161 if (!input_event_interface_->IsInputEvent(received) ||
162 !input_event_interface_->IsInputEvent(expected)) {
163 return false;
164 }
165
166 // Test common fields, except modifiers and time stamp, which may be changed
167 // by the renderer.
168 int32_t received_type = input_event_interface_->GetType(received);
169 int32_t expected_type = input_event_interface_->GetType(expected);
170 if (received_type != expected_type) {
171 // Allow key down events to match "raw" key down events.
172 if (expected_type != PP_INPUTEVENT_TYPE_KEYDOWN &&
173 received_type != PP_INPUTEVENT_TYPE_RAWKEYDOWN) {
174 return false;
175 }
176 }
177
178 // Test event type-specific fields.
179 switch (input_event_interface_->GetType(received)) {
180 case PP_INPUTEVENT_TYPE_MOUSEDOWN:
181 case PP_INPUTEVENT_TYPE_MOUSEUP:
182 case PP_INPUTEVENT_TYPE_MOUSEMOVE:
183 case PP_INPUTEVENT_TYPE_MOUSEENTER:
184 case PP_INPUTEVENT_TYPE_MOUSELEAVE:
185 // Check mouse fields, except position and movement, which may be
186 // modified by the renderer.
187 return
188 mouse_input_event_interface_->GetButton(received) ==
189 mouse_input_event_interface_->GetButton(expected) &&
190 mouse_input_event_interface_->GetClickCount(received) ==
191 mouse_input_event_interface_->GetClickCount(expected);
192
193 case PP_INPUTEVENT_TYPE_WHEEL:
194 return
195 pp::FloatPoint(wheel_input_event_interface_->GetDelta(received)) ==
196 pp::FloatPoint(wheel_input_event_interface_->GetDelta(expected)) &&
197 pp::FloatPoint(wheel_input_event_interface_->GetTicks(received)) ==
198 pp::FloatPoint(wheel_input_event_interface_->GetTicks(expected)) &&
199 wheel_input_event_interface_->GetScrollByPage(received) ==
200 wheel_input_event_interface_->GetScrollByPage(expected);
201
202 case PP_INPUTEVENT_TYPE_RAWKEYDOWN:
203 case PP_INPUTEVENT_TYPE_KEYDOWN:
204 case PP_INPUTEVENT_TYPE_KEYUP:
205 return
206 keyboard_input_event_interface_->GetKeyCode(received) ==
207 keyboard_input_event_interface_->GetKeyCode(expected);
208
209 case PP_INPUTEVENT_TYPE_CHAR:
210 return
211 keyboard_input_event_interface_->GetKeyCode(received) ==
212 keyboard_input_event_interface_->GetKeyCode(expected) &&
213 pp::Var(pp::Var::PassRef(),
214 keyboard_input_event_interface_->GetCharacterText(received)) ==
215 pp::Var(pp::Var::PassRef(),
216 keyboard_input_event_interface_->GetCharacterText(expected));
217
218 default:
219 break;
220 }
221
222 return false;
223 }
224
225 bool TestInputEvent::HandleInputEvent(const pp::InputEvent& input_event) {
226 // Some events may cause extra events to be generated, so record the first
227 // event that matches.
228 if (!received_expected_event_) {
229 received_expected_event_ = AreEquivalentEvents(
230 input_event.pp_resource(),
231 expected_input_event_.pp_resource());
232 if (received_expected_event_ && running_message_loop_) {
233 testing_interface_->QuitMessageLoop(instance_->pp_instance());
234 running_message_loop_ = false;
235 }
236 }
237 if (!received_unexpected_event_) {
238 received_unexpected_event_ = AreEquivalentEvents(
239 input_event.pp_resource(),
240 unexpected_input_event_.pp_resource());
241 }
242 // Handle all input events.
243 return true;
244 }
245
246 void TestInputEvent::DidChangeView(const pp::Rect& position,
247 const pp::Rect& clip) {
248 view_rect_ = position;
249 }
250
251 std::string TestInputEvent::TestEvents() {
252 // Request all input event classes.
253 input_event_interface_->RequestInputEvents(instance_->pp_instance(),
254 PP_INPUTEVENT_CLASS_MOUSE |
255 PP_INPUTEVENT_CLASS_WHEEL |
256 PP_INPUTEVENT_CLASS_KEYBOARD);
257 // Send the events and check that we received them.
258 ASSERT_TRUE(TestRequestedInputEvent(CreateMouseEvent()));
259 ASSERT_TRUE(TestRequestedInputEvent(CreateWheelEvent()));
260 ASSERT_TRUE(TestRequestedInputEvent(CreateKeyEvent()));
261 ASSERT_TRUE(TestRequestedInputEvent(CreateCharEvent()));
262
263 // Request only mouse events.
264 input_event_interface_->ClearInputEventRequest(instance_->pp_instance(),
265 PP_INPUTEVENT_CLASS_WHEEL |
266 PP_INPUTEVENT_CLASS_KEYBOARD);
267 // Check that we only receive mouse events.
268 ASSERT_TRUE(TestRequestedInputEvent(CreateMouseEvent()));
269 ASSERT_TRUE(TestUnrequestedInputEvent(CreateWheelEvent(),
270 CreateMouseEvent()));
271 ASSERT_TRUE(TestUnrequestedInputEvent(CreateKeyEvent(),
272 CreateMouseEvent()));
273 ASSERT_TRUE(TestUnrequestedInputEvent(CreateCharEvent(),
274 CreateMouseEvent()));
275
276 PASS();
277 }
278
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698