Chromium Code Reviews| Index: content/browser/gamepad/gamepad_provider_unittest.cc |
| diff --git a/content/browser/gamepad/gamepad_provider_unittest.cc b/content/browser/gamepad/gamepad_provider_unittest.cc |
| index 7e3a29c88b8d6ac1bec7bfaf4a7cdb11fd8eb9d5..2ebc6a6ad021cae95bafeca617d84fe6d3233e7d 100644 |
| --- a/content/browser/gamepad/gamepad_provider_unittest.cc |
| +++ b/content/browser/gamepad/gamepad_provider_unittest.cc |
| @@ -85,6 +85,7 @@ TEST_F(GamepadProviderTest, MAYBE_PollingAccess) { |
| test_data.items[0].axes[1] = .5f; |
| GamepadProvider* provider = CreateProvider(test_data); |
| + provider->SetSanitizationEnabled(false); |
| provider->Resume(); |
| message_loop().RunUntilIdle(); |
| @@ -137,6 +138,7 @@ TEST_F(GamepadProviderTest, UserGesture) { |
| UserGestureListener listener; |
| GamepadProvider* provider = CreateProvider(no_button_data); |
| + provider->SetSanitizationEnabled(false); |
| provider->Resume(); |
| provider->RegisterForUserGesture(listener.GetClosure()); |
| @@ -155,6 +157,99 @@ TEST_F(GamepadProviderTest, UserGesture) { |
| EXPECT_TRUE(listener.has_user_gesture()); |
| } |
| +// Tests that waiting for a user gesture works properly. |
| +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()); |
| + scoped_ptr<base::SharedMemory> shared_memory( |
| + new base::SharedMemory(handle, true)); |
| + EXPECT_TRUE(shared_memory->Map(sizeof(GamepadHardwareBuffer))); |
| + void* mem = shared_memory->memory(); |
| + |
| + GamepadHardwareBuffer* hwbuf = static_cast<GamepadHardwareBuffer*>(mem); |
| + // See gamepad_hardware_buffer.h for details on the read discipline. |
| + WebGamepads output; |
| + |
| + base::subtle::Atomic32 version; |
| + do { |
| + version = hwbuf->sequence.ReadBegin(); |
| + memcpy(&output, &hwbuf->buffer, sizeof(output)); |
| + } while (hwbuf->sequence.ReadRetry(version)); |
| + |
| + // Initial data should all be zeroed out due to sanitization, even though the |
| + // gamepad reported input |
|
scottmg
2016/01/18 22:54:51
'.'s to end comments in this file.
|
| + EXPECT_EQ(1u, output.length); |
| + EXPECT_EQ(1u, output.items[0].buttonsLength); |
| + EXPECT_EQ(0.f, output.items[0].buttons[0].value); |
| + EXPECT_EQ(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(); |
| + |
| + do { |
| + version = hwbuf->sequence.ReadBegin(); |
| + memcpy(&output, &hwbuf->buffer, sizeof(output)); |
| + } while (hwbuf->sequence.ReadRetry(version)); |
| + |
| + // 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_EQ(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(); |
| + |
| + do { |
| + version = hwbuf->sequence.ReadBegin(); |
| + memcpy(&output, &hwbuf->buffer, sizeof(output)); |
| + } while (hwbuf->sequence.ReadRetry(version)); |
| + |
| + // 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_EQ(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 content |