Index: device/gamepad/gamepad_provider_unittest.cc |
diff --git a/device/gamepad/gamepad_provider_unittest.cc b/device/gamepad/gamepad_provider_unittest.cc |
index 91116cda6d010a7f2ebaffaf02e4a7cff40649dc..ed64d231c96f20af1140ede0dc571ff276c35ac9 100644 |
--- a/device/gamepad/gamepad_provider_unittest.cc |
+++ b/device/gamepad/gamepad_provider_unittest.cc |
@@ -81,6 +81,7 @@ TEST_F(GamepadProviderTest, MAYBE_PollingAccess) { |
test_data.items[0].axes[1] = .5f; |
GamepadProvider* provider = CreateProvider(test_data); |
+ provider->SetSanitizationEnabled(false); |
provider->Resume(); |
base::RunLoop().RunUntilIdle(); |
@@ -125,6 +126,7 @@ TEST_F(GamepadProviderTest, UserGesture) { |
UserGestureListener listener; |
GamepadProvider* provider = CreateProvider(no_button_data); |
+ provider->SetSanitizationEnabled(false); |
provider->Resume(); |
provider->RegisterForUserGesture(listener.GetClosure()); |
@@ -143,6 +145,81 @@ TEST_F(GamepadProviderTest, UserGesture) { |
EXPECT_TRUE(listener.has_user_gesture()); |
} |
+// Tests that waiting for a user gesture works properly. |
denniskempin
2016/07/11 22:44:50
update comment
|
+TEST_F(GamepadProviderTest, Sanitization) { |
+ WebGamepads active_data; |
+ active_data.length = 1; |
+ active_data.items[0].connected = true; |
+ active_data.items[0].timestamp = 0; |
+ active_data.items[0].buttonsLength = 1; |
+ active_data.items[0].axesLength = 1; |
+ active_data.items[0].buttons[0].value = 1.f; |
+ active_data.items[0].buttons[0].pressed = true; |
+ active_data.items[0].axes[0] = -1.f; |
+ |
+ WebGamepads zero_data; |
+ zero_data.length = 1; |
+ zero_data.items[0].connected = true; |
+ zero_data.items[0].timestamp = 0; |
+ zero_data.items[0].buttonsLength = 1; |
+ zero_data.items[0].axesLength = 1; |
+ zero_data.items[0].buttons[0].value = 0.f; |
+ zero_data.items[0].buttons[0].pressed = false; |
+ zero_data.items[0].axes[0] = 0.f; |
+ |
+ UserGestureListener listener; |
+ GamepadProvider* provider = CreateProvider(active_data); |
+ provider->SetSanitizationEnabled(true); |
+ provider->Resume(); |
+ |
+ message_loop().RunUntilIdle(); |
+ |
+ mock_data_fetcher_->WaitForDataRead(); |
+ |
+ // Renderer-side, pull data out of poll buffer. |
+ base::SharedMemoryHandle handle = provider->GetSharedMemoryHandleForProcess( |
+ base::GetCurrentProcessHandle()); |
+ std::unique_ptr<base::SharedMemory> shared_memory( |
+ new base::SharedMemory(handle, true)); |
+ EXPECT_TRUE(shared_memory->Map(sizeof(WebGamepads))); |
+ void* mem = shared_memory->memory(); |
+ |
+ WebGamepads* output = static_cast<WebGamepads*>(mem); |
+ |
+ // Initial data should all be zeroed out due to sanitization, even though the |
+ // gamepad reported input |
+ EXPECT_EQ(1u, output->length); |
+ EXPECT_EQ(1u, output->items[0].buttonsLength); |
+ EXPECT_EQ(0.f, output->items[0].buttons[0].value); |
+ EXPECT_FALSE(output->items[0].buttons[0].pressed); |
+ EXPECT_EQ(1u, output->items[0].axesLength); |
+ EXPECT_EQ(0.f, output->items[0].axes[0]); |
+ |
+ // Zero out the inputs |
+ mock_data_fetcher_->SetTestData(zero_data); |
+ mock_data_fetcher_->WaitForDataReadAndCallbacksIssued(); |
+ |
+ // Should still read zero, which is now an accurate reflection of the data |
+ EXPECT_EQ(1u, output->length); |
+ EXPECT_EQ(1u, output->items[0].buttonsLength); |
+ EXPECT_EQ(0.f, output->items[0].buttons[0].value); |
+ EXPECT_FALSE(output->items[0].buttons[0].pressed); |
+ EXPECT_EQ(1u, output->items[0].axesLength); |
+ EXPECT_EQ(0.f, output->items[0].axes[0]); |
+ |
+ // Re-set the active inputs |
+ mock_data_fetcher_->SetTestData(active_data); |
+ mock_data_fetcher_->WaitForDataReadAndCallbacksIssued(); |
+ |
+ // Should now accurately reflect the reported data. |
+ EXPECT_EQ(1u, output->length); |
+ EXPECT_EQ(1u, output->items[0].buttonsLength); |
+ EXPECT_EQ(1.f, output->items[0].buttons[0].value); |
+ EXPECT_TRUE(output->items[0].buttons[0].pressed); |
+ EXPECT_EQ(1u, output->items[0].axesLength); |
+ EXPECT_EQ(-1.f, output->items[0].axes[0]); |
+} |
+ |
} // namespace |
} // namespace device |