| 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..98045bf2931894259eec69aab062a1bbf2f85239 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,195 @@ TEST_F(GamepadProviderTest, UserGesture) {
|
| EXPECT_TRUE(listener.has_user_gesture());
|
| }
|
|
|
| +// Tests that waiting for a user gesture works properly.
|
| +// Crashes on android. Seems to be same issue as the PollingAccess test
|
| +// crbug.com/147549
|
| +#if defined(OS_ANDROID)
|
| +#define MAYBE_Sanitization DISABLED_Sanitization
|
| +#else
|
| +#define MAYBE_Sanitization Sanitization
|
| +#endif
|
| +TEST_F(GamepadProviderTest, MAYBE_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.
|
| + 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();
|
| +
|
| + 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_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_TRUE(output.items[0].buttons[0].pressed);
|
| + EXPECT_EQ(1u, output.items[0].axesLength);
|
| + EXPECT_EQ(-1.f, output.items[0].axes[0]);
|
| +}
|
| +
|
| +// Tests that waiting for a user gesture works properly.
|
| +// Crashes on android. Seems to be same issue as the PollingAccess test
|
| +// crbug.com/147549
|
| +#if defined(OS_ANDROID)
|
| +#define MAYBE_DynamicallyAddedDataFetcher DISABLED_DynamicallyAddedDataFetcher
|
| +#else
|
| +#define MAYBE_DynamicallyAddedDataFetcher DynamicallyAddedDataFetcher
|
| +#endif
|
| +TEST_F(GamepadProviderTest, MAYBE_DynamicallyAddedDataFetcher) {
|
| + 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;
|
| +
|
| + UserGestureListener listener;
|
| + GamepadProvider* provider = CreateProvider(active_data);
|
| + provider->SetSanitizationEnabled(false);
|
| + 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));
|
| +
|
| + // Should still accurately report the test 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]);
|
| +
|
| + WebGamepads active_data_2;
|
| + active_data_2.length = 1;
|
| + active_data_2.items[1].connected = true;
|
| + active_data_2.items[1].timestamp = 0;
|
| + active_data_2.items[1].buttonsLength = 1;
|
| + active_data_2.items[1].axesLength = 1;
|
| + active_data_2.items[1].buttons[0].value = 0.5f;
|
| + active_data_2.items[1].buttons[0].pressed = true;
|
| + active_data_2.items[1].axes[0] = 0.5f;
|
| +
|
| + // Add a new data fetcher.
|
| + provider->AddGamepadDataFetcher(scoped_ptr<GamepadDataFetcher>(
|
| + new MockGamepadDataFetcher(active_data_2)));
|
| + mock_data_fetcher_->WaitForDataReadAndCallbacksIssued();
|
| +
|
| + do {
|
| + version = hwbuf->sequence.ReadBegin();
|
| + memcpy(&output, &hwbuf->buffer, sizeof(output));
|
| + } while (hwbuf->sequence.ReadRetry(version));
|
| +
|
| + // Should now report test data from both data fetchers.
|
| + EXPECT_EQ(2u, 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]);
|
| +
|
| + EXPECT_EQ(1u, output.items[1].buttonsLength);
|
| + EXPECT_EQ(0.5f, output.items[1].buttons[0].value);
|
| + EXPECT_TRUE(output.items[1].buttons[0].pressed);
|
| + EXPECT_EQ(1u, output.items[1].axesLength);
|
| + EXPECT_EQ(0.5f, output.items[1].axes[0]);
|
| +}
|
| +
|
| } // namespace
|
|
|
| } // namespace content
|
|
|