OLD | NEW |
---|---|
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 "device_motion_event_pump.h" | 5 #include "device_motion_event_pump.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
10 #include "content/common/device_sensors/device_motion_hardware_buffer.h" | 10 #include "content/common/device_sensors/device_motion_hardware_buffer.h" |
11 #include "content/public/test/test_utils.h" | 11 #include "content/public/test/test_utils.h" |
12 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
13 #include "third_party/WebKit/public/platform/WebDeviceMotionListener.h" | 13 #include "third_party/WebKit/public/platform/WebDeviceMotionListener.h" |
14 | 14 |
15 namespace content { | 15 namespace content { |
16 | 16 |
17 class MockDeviceMotionListener : public blink::WebDeviceMotionListener { | 17 class MockDeviceMotionListener : public blink::WebDeviceMotionListener { |
18 public: | 18 public: |
19 MockDeviceMotionListener() : did_change_device_motion_(false) { | 19 MockDeviceMotionListener() |
20 : did_change_device_motion_(false), number_of_events_(0) { | |
20 memset(&data_, 0, sizeof(data_)); | 21 memset(&data_, 0, sizeof(data_)); |
21 } | 22 } |
22 virtual ~MockDeviceMotionListener() { } | 23 virtual ~MockDeviceMotionListener() { } |
23 | 24 |
24 virtual void didChangeDeviceMotion( | 25 virtual void didChangeDeviceMotion( |
25 const blink::WebDeviceMotionData& data) override { | 26 const blink::WebDeviceMotionData& data) override { |
26 memcpy(&data_, &data, sizeof(data)); | 27 memcpy(&data_, &data, sizeof(data)); |
27 did_change_device_motion_ = true; | 28 did_change_device_motion_ = true; |
29 ++number_of_events_; | |
28 } | 30 } |
29 | 31 |
30 bool did_change_device_motion() const { | 32 bool did_change_device_motion() const { |
31 return did_change_device_motion_; | 33 return did_change_device_motion_; |
32 } | 34 } |
35 | |
36 int number_of_events() const { return number_of_events_; } | |
37 | |
33 const blink::WebDeviceMotionData& data() const { | 38 const blink::WebDeviceMotionData& data() const { |
34 return data_; | 39 return data_; |
35 } | 40 } |
36 | 41 |
37 private: | 42 private: |
38 bool did_change_device_motion_; | 43 bool did_change_device_motion_; |
44 int number_of_events_; | |
39 blink::WebDeviceMotionData data_; | 45 blink::WebDeviceMotionData data_; |
40 | 46 |
41 DISALLOW_COPY_AND_ASSIGN(MockDeviceMotionListener); | 47 DISALLOW_COPY_AND_ASSIGN(MockDeviceMotionListener); |
42 }; | 48 }; |
43 | 49 |
44 class DeviceMotionEventPumpForTesting : public DeviceMotionEventPump { | 50 class DeviceMotionEventPumpForTesting : public DeviceMotionEventPump { |
45 public: | 51 public: |
46 DeviceMotionEventPumpForTesting() | 52 DeviceMotionEventPumpForTesting() |
47 : DeviceMotionEventPump(0) { } | 53 : DeviceMotionEventPump(0), stop_on_fire_event_(true) {} |
48 ~DeviceMotionEventPumpForTesting() override {} | 54 ~DeviceMotionEventPumpForTesting() override {} |
49 | 55 |
56 void set_stop_on_fire_event(bool stop_on_fire_event) { | |
57 stop_on_fire_event_ = stop_on_fire_event; | |
58 } | |
59 | |
60 bool stop_on_fire_event() { return stop_on_fire_event_; } | |
61 | |
62 int pump_delay_microseconds() const { return pump_delay_microseconds_; } | |
63 | |
50 void OnDidStart(base::SharedMemoryHandle renderer_handle) { | 64 void OnDidStart(base::SharedMemoryHandle renderer_handle) { |
51 DeviceMotionEventPump::OnDidStart(renderer_handle); | 65 DeviceMotionEventPump::OnDidStart(renderer_handle); |
52 } | 66 } |
53 void SendStartMessage() override {} | 67 void SendStartMessage() override {} |
54 void SendStopMessage() override {} | 68 void SendStopMessage() override {} |
55 void FireEvent() override { | 69 void FireEvent() override { |
56 DeviceMotionEventPump::FireEvent(); | 70 DeviceMotionEventPump::FireEvent(); |
57 Stop(); | 71 if (stop_on_fire_event_) { |
58 base::MessageLoop::current()->QuitWhenIdle(); | 72 Stop(); |
73 base::MessageLoop::current()->QuitWhenIdle(); | |
74 } | |
59 } | 75 } |
60 | 76 |
61 private: | 77 private: |
78 bool stop_on_fire_event_; | |
79 | |
62 DISALLOW_COPY_AND_ASSIGN(DeviceMotionEventPumpForTesting); | 80 DISALLOW_COPY_AND_ASSIGN(DeviceMotionEventPumpForTesting); |
63 }; | 81 }; |
64 | 82 |
65 class DeviceMotionEventPumpTest : public testing::Test { | 83 class DeviceMotionEventPumpTest : public testing::Test { |
66 public: | 84 public: |
67 DeviceMotionEventPumpTest() { | 85 DeviceMotionEventPumpTest() { |
68 EXPECT_TRUE(shared_memory_.CreateAndMapAnonymous( | 86 EXPECT_TRUE(shared_memory_.CreateAndMapAnonymous( |
69 sizeof(DeviceMotionHardwareBuffer))); | 87 sizeof(DeviceMotionHardwareBuffer))); |
70 } | 88 } |
71 | 89 |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
151 EXPECT_FALSE(received_data.hasAccelerationY); | 169 EXPECT_FALSE(received_data.hasAccelerationY); |
152 EXPECT_FALSE(received_data.hasAccelerationZ); | 170 EXPECT_FALSE(received_data.hasAccelerationZ); |
153 EXPECT_FALSE(received_data.hasAccelerationIncludingGravityX); | 171 EXPECT_FALSE(received_data.hasAccelerationIncludingGravityX); |
154 EXPECT_FALSE(received_data.hasAccelerationIncludingGravityY); | 172 EXPECT_FALSE(received_data.hasAccelerationIncludingGravityY); |
155 EXPECT_FALSE(received_data.hasAccelerationIncludingGravityZ); | 173 EXPECT_FALSE(received_data.hasAccelerationIncludingGravityZ); |
156 EXPECT_FALSE(received_data.hasRotationRateAlpha); | 174 EXPECT_FALSE(received_data.hasRotationRateAlpha); |
157 EXPECT_FALSE(received_data.hasRotationRateBeta); | 175 EXPECT_FALSE(received_data.hasRotationRateBeta); |
158 EXPECT_FALSE(received_data.hasRotationRateGamma); | 176 EXPECT_FALSE(received_data.hasRotationRateGamma); |
159 } | 177 } |
160 | 178 |
179 // Tests that the pump is not firing events at a rate faster than 60Hz. A rate | |
180 // above 60Hz would allow for the detection of keystrokes (crbug.com/421691) | |
181 TEST_F(DeviceMotionEventPumpTest, PumpThrottlesEventRate) { | |
182 // Confirm that the delay for pumping events is 60 Hz. | |
timvolodine
2015/02/04 15:11:53
nit: -> confirm that the frequency for pumping eve
jonross
2015/02/04 16:57:51
Done.
| |
183 EXPECT_GE(60, base::Time::kMicrosecondsPerSecond / | |
184 motion_pump()->pump_delay_microseconds()); | |
timvolodine
2015/02/04 15:11:53
nit: this looks a bit confusing (as if it's an ext
jonross
2015/02/04 16:57:51
Yeah, auto-indent/cl format, are both giving weird
| |
185 | |
186 base::MessageLoopForUI loop; | |
187 | |
188 InitBuffer(true); | |
189 | |
190 motion_pump()->set_stop_on_fire_event(false); | |
191 motion_pump()->Start(listener()); | |
192 motion_pump()->OnDidStart(handle()); | |
193 | |
194 base::MessageLoop::current()->PostDelayedTask( | |
195 FROM_HERE, base::MessageLoop::QuitClosure(), | |
196 base::TimeDelta::FromMilliseconds(100)); | |
197 base::MessageLoop::current()->Run(); | |
198 motion_pump()->Stop(); | |
199 | |
200 // Check that the blink::WebDeviceMotionListener does not receive excess | |
201 // events. | |
202 EXPECT_TRUE(listener()->did_change_device_motion()); | |
203 EXPECT_GE(6, listener()->number_of_events()); | |
204 } | |
205 | |
161 } // namespace content | 206 } // namespace content |
OLD | NEW |