 Chromium Code Reviews
 Chromium Code Reviews Issue 2896583005:
  Reland: Refactor DeviceMotionEventPump to use //device/generic_sensor instead of //device/sensors  (Closed)
    
  
    Issue 2896583005:
  Reland: Refactor DeviceMotionEventPump to use //device/generic_sensor instead of //device/sensors  (Closed) 
  | Index: content/browser/device_sensors/device_sensor_browsertest.cc | 
| diff --git a/content/browser/device_sensors/device_sensor_browsertest.cc b/content/browser/device_sensors/device_sensor_browsertest.cc | 
| index ef16d3810c34451a599a2cac2b32b964eb30b8e7..c5142f8ed183df6680b1ed08171ff1865d03c3e4 100644 | 
| --- a/content/browser/device_sensors/device_sensor_browsertest.cc | 
| +++ b/content/browser/device_sensors/device_sensor_browsertest.cc | 
| @@ -17,6 +17,8 @@ | 
| #include "content/public/test/test_utils.h" | 
| #include "content/shell/browser/shell.h" | 
| #include "content/shell/browser/shell_javascript_dialog_manager.h" | 
| +#include "device/generic_sensor/platform_sensor.h" | 
| +#include "device/generic_sensor/platform_sensor_provider.h" | 
| #include "device/sensors/data_fetcher_shared_memory.h" | 
| #include "device/sensors/device_sensor_service.h" | 
| #include "device/sensors/public/cpp/device_motion_hardware_buffer.h" | 
| @@ -31,14 +33,6 @@ class FakeDataFetcher : public device::DataFetcherSharedMemory { | 
| FakeDataFetcher() : sensor_data_available_(true) {} | 
| ~FakeDataFetcher() override {} | 
| - void SetMotionStartedCallback(base::Closure motion_started_callback) { | 
| - motion_started_callback_ = motion_started_callback; | 
| - } | 
| - | 
| - void SetMotionStoppedCallback(base::Closure motion_stopped_callback) { | 
| - motion_stopped_callback_ = motion_stopped_callback; | 
| - } | 
| - | 
| void SetOrientationStartedCallback( | 
| base::Closure orientation_started_callback) { | 
| orientation_started_callback_ = orientation_started_callback; | 
| @@ -65,15 +59,6 @@ class FakeDataFetcher : public device::DataFetcherSharedMemory { | 
| EXPECT_TRUE(buffer); | 
| switch (consumer_type) { | 
| - case device::CONSUMER_TYPE_MOTION: { | 
| - device::DeviceMotionHardwareBuffer* motion_buffer = | 
| - static_cast<device::DeviceMotionHardwareBuffer*>(buffer); | 
| - if (sensor_data_available_) | 
| - UpdateMotion(motion_buffer); | 
| - SetMotionBufferReady(motion_buffer); | 
| - BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 
| - motion_started_callback_); | 
| - } break; | 
| case device::CONSUMER_TYPE_ORIENTATION: { | 
| device::DeviceOrientationHardwareBuffer* orientation_buffer = | 
| static_cast<device::DeviceOrientationHardwareBuffer*>(buffer); | 
| @@ -100,10 +85,6 @@ class FakeDataFetcher : public device::DataFetcherSharedMemory { | 
| bool Stop(device::ConsumerType consumer_type) override { | 
| switch (consumer_type) { | 
| - case device::CONSUMER_TYPE_MOTION: | 
| - BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 
| - motion_stopped_callback_); | 
| - break; | 
| case device::CONSUMER_TYPE_ORIENTATION: | 
| BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 
| orientation_stopped_callback_); | 
| @@ -128,12 +109,6 @@ class FakeDataFetcher : public device::DataFetcherSharedMemory { | 
| sensor_data_available_ = available; | 
| } | 
| - void SetMotionBufferReady(device::DeviceMotionHardwareBuffer* buffer) { | 
| - buffer->seqlock.WriteBegin(); | 
| - buffer->data.all_available_sensors_are_active = true; | 
| - buffer->seqlock.WriteEnd(); | 
| - } | 
| - | 
| void SetOrientationBufferReady( | 
| device::DeviceOrientationHardwareBuffer* buffer) { | 
| buffer->seqlock.WriteBegin(); | 
| @@ -141,34 +116,6 @@ class FakeDataFetcher : public device::DataFetcherSharedMemory { | 
| buffer->seqlock.WriteEnd(); | 
| } | 
| - void UpdateMotion(device::DeviceMotionHardwareBuffer* buffer) { | 
| - buffer->seqlock.WriteBegin(); | 
| - buffer->data.acceleration_x = 1; | 
| - buffer->data.has_acceleration_x = true; | 
| - buffer->data.acceleration_y = 2; | 
| - buffer->data.has_acceleration_y = true; | 
| - buffer->data.acceleration_z = 3; | 
| - buffer->data.has_acceleration_z = true; | 
| - | 
| - buffer->data.acceleration_including_gravity_x = 4; | 
| - buffer->data.has_acceleration_including_gravity_x = true; | 
| - buffer->data.acceleration_including_gravity_y = 5; | 
| - buffer->data.has_acceleration_including_gravity_y = true; | 
| - buffer->data.acceleration_including_gravity_z = 6; | 
| - buffer->data.has_acceleration_including_gravity_z = true; | 
| - | 
| - buffer->data.rotation_rate_alpha = 7; | 
| - buffer->data.has_rotation_rate_alpha = true; | 
| - buffer->data.rotation_rate_beta = 8; | 
| - buffer->data.has_rotation_rate_beta = true; | 
| - buffer->data.rotation_rate_gamma = 9; | 
| - buffer->data.has_rotation_rate_gamma = true; | 
| - | 
| - buffer->data.interval = 100; | 
| - buffer->data.all_available_sensors_are_active = true; | 
| - buffer->seqlock.WriteEnd(); | 
| - } | 
| - | 
| void UpdateOrientation(device::DeviceOrientationHardwareBuffer* buffer) { | 
| buffer->seqlock.WriteBegin(); | 
| buffer->data.alpha = 1; | 
| @@ -196,10 +143,8 @@ class FakeDataFetcher : public device::DataFetcherSharedMemory { | 
| } | 
| // The below callbacks should be run on the UI thread. | 
| - base::Closure motion_started_callback_; | 
| base::Closure orientation_started_callback_; | 
| base::Closure orientation_absolute_started_callback_; | 
| - base::Closure motion_stopped_callback_; | 
| base::Closure orientation_stopped_callback_; | 
| base::Closure orientation_absolute_stopped_callback_; | 
| bool sensor_data_available_; | 
| @@ -208,6 +153,190 @@ class FakeDataFetcher : public device::DataFetcherSharedMemory { | 
| DISALLOW_COPY_AND_ASSIGN(FakeDataFetcher); | 
| }; | 
| +class FakeAccelerometer : public device::PlatformSensor { | 
| + public: | 
| + FakeAccelerometer(mojo::ScopedSharedBufferMapping mapping, | 
| + device::PlatformSensorProvider* provider) | 
| + : PlatformSensor(device::mojom::SensorType::ACCELEROMETER, | 
| + std::move(mapping), | 
| + provider) {} | 
| + | 
| + device::mojom::ReportingMode GetReportingMode() override { | 
| + return device::mojom::ReportingMode::ON_CHANGE; | 
| + } | 
| + | 
| + bool StartSensor( | 
| + const device::PlatformSensorConfiguration& configuration) override { | 
| + device::SensorReading reading; | 
| + reading.timestamp = | 
| + (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF(); | 
| + reading.values[0] = 4; | 
| + reading.values[1] = 5; | 
| + reading.values[2] = 6; | 
| + UpdateSensorReading(reading, true); | 
| + return true; | 
| + } | 
| + | 
| + void StopSensor() override {}; | 
| + | 
| + protected: | 
| + ~FakeAccelerometer() override = default; | 
| + | 
| + bool CheckSensorConfiguration( | 
| + const device::PlatformSensorConfiguration& configuration) override { | 
| + return true; | 
| + } | 
| + | 
| + device::PlatformSensorConfiguration GetDefaultConfiguration() override { | 
| + return device::PlatformSensorConfiguration(60 /* frequency */); | 
| + } | 
| + | 
| + private: | 
| + DISALLOW_COPY_AND_ASSIGN(FakeAccelerometer); | 
| +}; | 
| + | 
| +class FakeLinearAccelerationSensor : public device::PlatformSensor { | 
| + public: | 
| + FakeLinearAccelerationSensor(mojo::ScopedSharedBufferMapping mapping, | 
| + device::PlatformSensorProvider* provider) | 
| + : PlatformSensor(device::mojom::SensorType::LINEAR_ACCELERATION, | 
| + std::move(mapping), | 
| + provider) {} | 
| + | 
| + device::mojom::ReportingMode GetReportingMode() override { | 
| + return device::mojom::ReportingMode::CONTINUOUS; | 
| + } | 
| + | 
| + bool StartSensor( | 
| + const device::PlatformSensorConfiguration& configuration) override { | 
| + device::SensorReading reading; | 
| + reading.timestamp = | 
| + (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF(); | 
| + reading.values[0] = 1; | 
| + reading.values[1] = 2; | 
| + reading.values[2] = 3; | 
| + UpdateSensorReading(reading, true); | 
| + return true; | 
| + } | 
| + | 
| + void StopSensor() override {}; | 
| + | 
| + protected: | 
| + ~FakeLinearAccelerationSensor() override = default; | 
| + | 
| + bool CheckSensorConfiguration( | 
| + const device::PlatformSensorConfiguration& configuration) override { | 
| + return true; | 
| + } | 
| + | 
| + device::PlatformSensorConfiguration GetDefaultConfiguration() override { | 
| + return device::PlatformSensorConfiguration(60 /* frequency */); | 
| + } | 
| + | 
| + private: | 
| + DISALLOW_COPY_AND_ASSIGN(FakeLinearAccelerationSensor); | 
| +}; | 
| + | 
| +class FakeGyroscope : public device::PlatformSensor { | 
| + public: | 
| + FakeGyroscope(mojo::ScopedSharedBufferMapping mapping, | 
| + device::PlatformSensorProvider* provider) | 
| + : PlatformSensor(device::mojom::SensorType::GYROSCOPE, | 
| + std::move(mapping), | 
| + provider) {} | 
| + | 
| + device::mojom::ReportingMode GetReportingMode() override { | 
| + return device::mojom::ReportingMode::ON_CHANGE; | 
| + } | 
| + | 
| + bool StartSensor( | 
| + const device::PlatformSensorConfiguration& configuration) override { | 
| + device::SensorReading reading; | 
| + reading.timestamp = | 
| + (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF(); | 
| + reading.values[0] = 7; | 
| + reading.values[1] = 8; | 
| + reading.values[2] = 9; | 
| + UpdateSensorReading(reading, true); | 
| + return true; | 
| + } | 
| + | 
| + void StopSensor() override {}; | 
| + | 
| + protected: | 
| + ~FakeGyroscope() override = default; | 
| + | 
| + bool CheckSensorConfiguration( | 
| + const device::PlatformSensorConfiguration& configuration) override { | 
| + return true; | 
| + } | 
| + | 
| + device::PlatformSensorConfiguration GetDefaultConfiguration() override { | 
| + return device::PlatformSensorConfiguration(60 /* frequency */); | 
| + } | 
| + | 
| + private: | 
| + DISALLOW_COPY_AND_ASSIGN(FakeGyroscope); | 
| +}; | 
| + | 
| +class FakeSensorProvider : public device::PlatformSensorProvider { | 
| + public: | 
| + static FakeSensorProvider* GetInstance() { | 
| + return base::Singleton<FakeSensorProvider, base::LeakySingletonTraits< | 
| + FakeSensorProvider>>::get(); | 
| + } | 
| + FakeSensorProvider() | 
| + : accelerometer_is_available_(true), | 
| + linear_acceleration_sensor_is_available_(true), | 
| + gyroscope_is_available_(true) {} | 
| 
Reilly Grant (use Gerrit)
2017/06/06 20:58:55
nit: It's cleaner to do these default initializati
 
juncai
2017/06/06 23:36:25
Done.
 | 
| + ~FakeSensorProvider() override = default; | 
| + | 
| + void set_accelerometer_is_available(bool accelerometer_is_available) { | 
| + accelerometer_is_available_ = accelerometer_is_available; | 
| + } | 
| + | 
| + void set_linear_acceleration_sensor_is_available( | 
| + bool linear_acceleration_sensor_is_available) { | 
| + linear_acceleration_sensor_is_available_ = | 
| + linear_acceleration_sensor_is_available; | 
| + } | 
| + | 
| + void set_gyroscope_is_available(bool gyroscope_is_available) { | 
| + gyroscope_is_available_ = gyroscope_is_available; | 
| + } | 
| + | 
| + protected: | 
| + void CreateSensorInternal(device::mojom::SensorType type, | 
| + mojo::ScopedSharedBufferMapping mapping, | 
| + const CreateSensorCallback& callback) override { | 
| + // Create Sensors here. | 
| + scoped_refptr<device::PlatformSensor> sensor; | 
| + | 
| + switch (type) { | 
| + case device::mojom::SensorType::ACCELEROMETER: | 
| + if (accelerometer_is_available_) | 
| + sensor = new FakeAccelerometer(std::move(mapping), this); | 
| + break; | 
| + case device::mojom::SensorType::LINEAR_ACCELERATION: | 
| + if (linear_acceleration_sensor_is_available_) | 
| + sensor = new FakeLinearAccelerationSensor(std::move(mapping), this); | 
| + break; | 
| + case device::mojom::SensorType::GYROSCOPE: | 
| + if (gyroscope_is_available_) | 
| + sensor = new FakeGyroscope(std::move(mapping), this); | 
| + break; | 
| + default: | 
| + NOTIMPLEMENTED(); | 
| + } | 
| + | 
| + callback.Run(std::move(sensor)); | 
| + } | 
| + | 
| + bool accelerometer_is_available_; | 
| + bool linear_acceleration_sensor_is_available_; | 
| + bool gyroscope_is_available_; | 
| +}; | 
| + | 
| class DeviceSensorBrowserTest : public ContentBrowserTest { | 
| public: | 
| DeviceSensorBrowserTest() | 
| @@ -218,8 +347,6 @@ class DeviceSensorBrowserTest : public ContentBrowserTest { | 
| void SetUpOnMainThread() override { | 
| // Initialize the RunLoops now that the main thread has been created. | 
| - motion_started_runloop_.reset(new base::RunLoop()); | 
| - motion_stopped_runloop_.reset(new base::RunLoop()); | 
| orientation_started_runloop_.reset(new base::RunLoop()); | 
| orientation_stopped_runloop_.reset(new base::RunLoop()); | 
| orientation_absolute_started_runloop_.reset(new base::RunLoop()); | 
| @@ -227,6 +354,11 @@ class DeviceSensorBrowserTest : public ContentBrowserTest { | 
| #if defined(OS_ANDROID) | 
| // On Android, the DeviceSensorService lives on the UI thread. | 
| SetUpFetcher(); | 
| + BrowserThread::PostTask( | 
| + BrowserThread::IO, FROM_HERE, | 
| + base::Bind(&DeviceSensorBrowserTest::SetUpOnIOThreadForAndroid, | 
| + base::Unretained(this))); | 
| + io_loop_finished_event_.Wait(); | 
| #else | 
| // On all other platforms, the DeviceSensorService lives on the IO thread. | 
| BrowserThread::PostTask( | 
| @@ -239,8 +371,6 @@ class DeviceSensorBrowserTest : public ContentBrowserTest { | 
| void SetUpFetcher() { | 
| fetcher_ = new FakeDataFetcher(); | 
| - fetcher_->SetMotionStartedCallback(motion_started_runloop_->QuitClosure()); | 
| - fetcher_->SetMotionStoppedCallback(motion_stopped_runloop_->QuitClosure()); | 
| fetcher_->SetOrientationStartedCallback( | 
| orientation_started_runloop_->QuitClosure()); | 
| fetcher_->SetOrientationStoppedCallback( | 
| @@ -253,11 +383,23 @@ class DeviceSensorBrowserTest : public ContentBrowserTest { | 
| fetcher_); | 
| } | 
| + void SetUpOnIOThreadForAndroid() { | 
| + sensor_provider_ = FakeSensorProvider::GetInstance(); | 
| + device::PlatformSensorProvider::SetProviderForTesting(sensor_provider_); | 
| + io_loop_finished_event_.Signal(); | 
| + } | 
| + | 
| void SetUpOnIOThread() { | 
| SetUpFetcher(); | 
| + sensor_provider_ = FakeSensorProvider::GetInstance(); | 
| + device::PlatformSensorProvider::SetProviderForTesting(sensor_provider_); | 
| io_loop_finished_event_.Signal(); | 
| } | 
| + void TearDown() override { | 
| + device::PlatformSensorProvider::SetProviderForTesting(nullptr); | 
| + } | 
| + | 
| void DelayAndQuit(base::TimeDelta delay) { | 
| base::PlatformThread::Sleep(delay); | 
| base::MessageLoop::current()->QuitWhenIdle(); | 
| @@ -276,11 +418,10 @@ class DeviceSensorBrowserTest : public ContentBrowserTest { | 
| } | 
| FakeDataFetcher* fetcher_; | 
| + FakeSensorProvider* sensor_provider_; | 
| // NOTE: These can only be initialized once the main thread has been created | 
| // and so must be pointers instead of plain objects. | 
| - std::unique_ptr<base::RunLoop> motion_started_runloop_; | 
| - std::unique_ptr<base::RunLoop> motion_stopped_runloop_; | 
| std::unique_ptr<base::RunLoop> orientation_started_runloop_; | 
| std::unique_ptr<base::RunLoop> orientation_stopped_runloop_; | 
| std::unique_ptr<base::RunLoop> orientation_absolute_started_runloop_; | 
| @@ -323,8 +464,6 @@ IN_PROC_BROWSER_TEST_F(DeviceSensorBrowserTest, MotionTest) { | 
| NavigateToURLBlockUntilNavigationsComplete(shell(), test_url, 2); | 
| EXPECT_EQ("pass", shell()->web_contents()->GetLastCommittedURL().ref()); | 
| - motion_started_runloop_->Run(); | 
| - motion_stopped_runloop_->Run(); | 
| } | 
| IN_PROC_BROWSER_TEST_F(DeviceSensorBrowserTest, OrientationNullTest) { | 
| @@ -359,13 +498,27 @@ IN_PROC_BROWSER_TEST_F(DeviceSensorBrowserTest, MotionNullTest) { | 
| // The test page registers an event handler for motion events and | 
| // expects to get an event with null values, because no sensor data can be | 
| // provided. | 
| - fetcher_->SetSensorDataAvailable(false); | 
| + sensor_provider_->set_accelerometer_is_available(false); | 
| + sensor_provider_->set_linear_acceleration_sensor_is_available(false); | 
| + sensor_provider_->set_gyroscope_is_available(false); | 
| GURL test_url = GetTestUrl("device_sensors", "device_motion_null_test.html"); | 
| NavigateToURLBlockUntilNavigationsComplete(shell(), test_url, 2); | 
| EXPECT_EQ("pass", shell()->web_contents()->GetLastCommittedURL().ref()); | 
| - motion_started_runloop_->Run(); | 
| - motion_stopped_runloop_->Run(); | 
| +} | 
| + | 
| +IN_PROC_BROWSER_TEST_F(DeviceSensorBrowserTest, | 
| + MotionOnlySomeSensorsAreAvailableTest) { | 
| + // The test page registers an event handler for motion events and | 
| + // expects to get an event with only some fake values, because only | 
| + // some sensor data can be provided. | 
| + sensor_provider_->set_accelerometer_is_available(false); | 
| + GURL test_url = | 
| + GetTestUrl("device_sensors", | 
| + "device_motion_only_some_sensors_are_available_test.html"); | 
| + NavigateToURLBlockUntilNavigationsComplete(shell(), test_url, 2); | 
| + | 
| + EXPECT_EQ("pass", shell()->web_contents()->GetLastCommittedURL().ref()); | 
| } | 
| IN_PROC_BROWSER_TEST_F(DeviceSensorBrowserTest, NullTestWithAlert) { | 
| @@ -375,6 +528,9 @@ IN_PROC_BROWSER_TEST_F(DeviceSensorBrowserTest, NullTestWithAlert) { | 
| // window after the alert is dismissed and the callbacks are invoked which | 
| // eventually navigate to #pass. | 
| fetcher_->SetSensorDataAvailable(false); | 
| + sensor_provider_->set_accelerometer_is_available(false); | 
| + sensor_provider_->set_linear_acceleration_sensor_is_available(false); | 
| + sensor_provider_->set_gyroscope_is_available(false); | 
| TestNavigationObserver same_tab_observer(shell()->web_contents(), 2); | 
| GURL test_url = | 
| @@ -385,8 +541,6 @@ IN_PROC_BROWSER_TEST_F(DeviceSensorBrowserTest, NullTestWithAlert) { | 
| // delay, crbug.com/360044. | 
| WaitForAlertDialogAndQuitAfterDelay(base::TimeDelta::FromMilliseconds(500)); | 
| - motion_started_runloop_->Run(); | 
| - motion_stopped_runloop_->Run(); | 
| orientation_started_runloop_->Run(); | 
| orientation_stopped_runloop_->Run(); | 
| same_tab_observer.Wait(); |