OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2013 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 "content/common/input/input_param_traits.h" | |
6 | |
7 #include "content/common/input/event_packet.h" | |
8 #include "content/common/input/input_event.h" | |
9 #include "content/common/input/ipc_input_event_payload.h" | |
10 #include "content/common/input/web_input_event_payload.h" | |
11 #include "content/common/input_messages.h" | |
12 #include "ipc/ipc_message.h" | |
13 #include "testing/gtest/include/gtest/gtest.h" | |
14 #include "third_party/WebKit/public/web/WebInputEvent.h" | |
15 | |
16 namespace content { | |
17 namespace { | |
18 | |
19 class InputParamTraitsTest : public testing::Test { | |
20 protected: | |
21 void Compare(const WebInputEventPayload* a, const WebInputEventPayload* b) { | |
22 EXPECT_EQ(!!a->web_event(), !!b->web_event()); | |
23 if (a->web_event() && b->web_event()) { | |
24 const unsigned a_size = a->web_event()->size; | |
aelias_OOO_until_Jul13
2013/09/03 22:31:10
nit: size_t
jdduke (slow)
2013/09/03 22:52:14
Done.
| |
25 ASSERT_EQ(a_size, b->web_event()->size); | |
26 EXPECT_EQ(0, memcmp(a->web_event(), b->web_event(), a_size)); | |
27 } | |
28 EXPECT_EQ(a->latency_info().latency_components.size(), | |
29 b->latency_info().latency_components.size()); | |
30 EXPECT_EQ(a->is_keyboard_shortcut(), b->is_keyboard_shortcut()); | |
31 } | |
32 | |
33 void Compare(const IPCInputEventPayload* a, const IPCInputEventPayload* b) { | |
34 EXPECT_EQ(!!a->message, !!b->message); | |
35 if (a->message && b->message) { | |
36 EXPECT_EQ(a->message->type(), b->message->type()); | |
37 EXPECT_EQ(a->message->routing_id(), b->message->routing_id()); | |
38 } | |
39 } | |
40 | |
41 void Compare(const InputEvent::Payload* a, const InputEvent::Payload* b) { | |
42 ASSERT_EQ(!!a, !!b); | |
43 if (!a) | |
44 return; | |
45 switch (a->GetType()) { | |
46 case InputEvent::Payload::IPC_MESSAGE: | |
47 Compare(IPCInputEventPayload::Cast(a), | |
48 IPCInputEventPayload::Cast(b)); | |
49 break; | |
50 case InputEvent::Payload::WEB_INPUT_EVENT: | |
51 Compare(WebInputEventPayload::Cast(a), | |
52 WebInputEventPayload::Cast(b)); | |
53 default: | |
54 break; | |
55 } | |
56 } | |
57 | |
58 void Compare(const InputEvent* a, const InputEvent* b) { | |
59 EXPECT_EQ(a->id(), b->id()); | |
60 EXPECT_EQ(a->valid(), b->valid()); | |
61 Compare(a->payload(), b->payload()); | |
62 } | |
63 | |
64 void Compare(const EventPacket* a, const EventPacket* b) { | |
65 EXPECT_EQ(a->id, b->id); | |
66 ASSERT_EQ(a->events.size(), b->events.size()); | |
67 for (size_t i = 0; i < a->events.size(); ++i) | |
68 Compare(a->events[i], b->events[i]); | |
69 } | |
70 | |
71 void Verify(const EventPacket& packet_in) { | |
72 IPC::Message msg; | |
73 IPC::ParamTraits<EventPacket>::Write(&msg, packet_in); | |
74 | |
75 EventPacket packet_out; | |
76 PickleIterator iter(msg); | |
77 EXPECT_TRUE(IPC::ParamTraits<EventPacket>::Read(&msg, &iter, &packet_out)); | |
78 | |
79 Compare(&packet_in, &packet_out); | |
80 | |
81 // Perform a sanity check that logging doesn't explode. | |
82 std::string packet_in_string; | |
83 IPC::ParamTraits<EventPacket>::Log(packet_in, &packet_in_string); | |
84 std::string packet_out_string; | |
85 IPC::ParamTraits<EventPacket>::Log(packet_out, &packet_out_string); | |
86 ASSERT_FALSE(packet_in_string.empty()); | |
87 EXPECT_EQ(packet_in_string, packet_out_string); | |
88 } | |
89 }; | |
90 | |
91 TEST_F(InputParamTraitsTest, EventPacketEmpty) { | |
92 EventPacket packet_in; | |
93 IPC::Message msg; | |
94 IPC::ParamTraits<EventPacket>::Write(&msg, packet_in); | |
95 | |
96 EventPacket packet_out; | |
97 PickleIterator iter(msg); | |
98 EXPECT_TRUE(IPC::ParamTraits<EventPacket>::Read(&msg, &iter, &packet_out)); | |
99 | |
100 Compare(&packet_in, &packet_out); | |
101 } | |
102 | |
103 #ifdef NDEBUG // This test triggers a DCHECK. | |
104 TEST_F(InputParamTraitsTest, EventPacketUninitializedEvents) { | |
105 EventPacket packet_in; | |
106 packet_in.id = 1; | |
107 packet_in.Add(InputEvent::Create(1, WebInputEventPayload::Create())); | |
108 packet_in.Add(InputEvent::Create(2, IPCInputEventPayload::Create())); | |
109 | |
110 IPC::Message msg; | |
111 IPC::ParamTraits<EventPacket>::Write(&msg, packet_in); | |
112 | |
113 EventPacket packet_out; | |
114 PickleIterator iter(msg); | |
115 EXPECT_FALSE(IPC::ParamTraits<EventPacket>::Read(&msg, &iter, &packet_out)); | |
116 } | |
117 #endif | |
118 | |
119 TEST_F(InputParamTraitsTest, EventPacketIPCEvents) { | |
120 EventPacket packet_in; | |
121 packet_in.id = 1; | |
122 | |
123 packet_in.Add(InputEvent::Create(1, IPCInputEventPayload::Create( | |
124 scoped_ptr<IPC::Message>(new InputMsg_Undo(1))))); | |
125 | |
126 Verify(packet_in); | |
127 } | |
128 | |
129 TEST_F(InputParamTraitsTest, EventPacketWebPlatformEvents) { | |
130 EventPacket packet_in; | |
131 packet_in.id = 1; | |
132 | |
133 ui::LatencyInfo latency; | |
134 | |
135 int64 next_event_id = 1; | |
136 WebKit::WebKeyboardEvent key_event; | |
137 key_event.type = WebKit::WebInputEvent::RawKeyDown; | |
138 key_event.nativeKeyCode = 5; | |
139 packet_in.Add(InputEvent::Create(++next_event_id, | |
140 WebInputEventPayload::Create(key_event, latency, true))); | |
141 | |
142 WebKit::WebMouseWheelEvent wheel_event; | |
143 wheel_event.type = WebKit::WebInputEvent::MouseWheel; | |
144 wheel_event.deltaX = 10; | |
145 latency.AddLatencyNumber(ui::INPUT_EVENT_LATENCY_RWH_COMPONENT, 1, 1); | |
146 packet_in.Add(InputEvent::Create(++next_event_id, | |
147 WebInputEventPayload::Create(wheel_event, latency, false))); | |
148 | |
149 WebKit::WebMouseEvent mouse_event; | |
150 mouse_event.type = WebKit::WebInputEvent::MouseDown; | |
151 mouse_event.x = 10; | |
152 latency.AddLatencyNumber(ui::INPUT_EVENT_LATENCY_UI_COMPONENT, 2, 2); | |
153 packet_in.Add(InputEvent::Create(++next_event_id, | |
154 WebInputEventPayload::Create(mouse_event, latency, false))); | |
155 | |
156 WebKit::WebGestureEvent gesture_event; | |
157 gesture_event.type = WebKit::WebInputEvent::GestureScrollBegin; | |
158 gesture_event.x = -1; | |
159 packet_in.Add(InputEvent::Create(++next_event_id, | |
160 WebInputEventPayload::Create(gesture_event, latency, false))); | |
161 | |
162 WebKit::WebTouchEvent touch_event; | |
163 touch_event.type = WebKit::WebInputEvent::TouchStart; | |
164 touch_event.touchesLength = 1; | |
165 touch_event.touches[0].radiusX = 1; | |
166 packet_in.Add(InputEvent::Create(++next_event_id, | |
167 WebInputEventPayload::Create(touch_event, latency, false))); | |
168 | |
169 Verify(packet_in); | |
170 } | |
171 | |
172 TEST_F(InputParamTraitsTest, EventPacketMixedEvents) { | |
173 EventPacket packet_in; | |
174 packet_in.id = 1; | |
175 int64 next_event_id = 1; | |
176 | |
177 // Add a mix of IPC and WebInputEvents. | |
178 packet_in.Add(InputEvent::Create(++next_event_id, | |
179 IPCInputEventPayload::Create( | |
180 scoped_ptr<IPC::Message>(new InputMsg_Undo(1))))); | |
181 | |
182 ui::LatencyInfo latency; | |
183 WebKit::WebKeyboardEvent key_event; | |
184 key_event.type = WebKit::WebInputEvent::RawKeyDown; | |
185 key_event.nativeKeyCode = 5; | |
186 packet_in.Add(InputEvent::Create(++next_event_id, | |
187 WebInputEventPayload::Create(key_event, latency, true))); | |
188 | |
189 packet_in.Add(InputEvent::Create(++next_event_id, | |
190 IPCInputEventPayload::Create( | |
191 scoped_ptr<IPC::Message>(new InputMsg_SetFocus(2, true))))); | |
192 | |
193 WebKit::WebMouseWheelEvent wheel_event; | |
194 wheel_event.type = WebKit::WebInputEvent::MouseWheel; | |
195 wheel_event.deltaX = 10; | |
196 packet_in.Add(InputEvent::Create(++next_event_id, | |
197 WebInputEventPayload::Create(wheel_event, latency, false))); | |
198 | |
199 Verify(packet_in); | |
200 } | |
201 | |
202 } // namespace | |
203 } // namespace content | |
OLD | NEW |