Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4229)

Unified Diff: content/browser/device_sensors/device_sensor_browsertest.cc

Issue 2896583005: Reland: Refactor DeviceMotionEventPump to use //device/generic_sensor instead of //device/sensors (Closed)
Patch Set: clean up #include files Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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();
« no previous file with comments | « no previous file | content/renderer/BUILD.gn » ('j') | content/renderer/device_sensors/device_motion_event_pump.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698