| Index: content/browser/device_orientation/provider_unittest.cc | 
| diff --git a/content/browser/device_orientation/provider_unittest.cc b/content/browser/device_orientation/provider_unittest.cc | 
| index 471efa493e0d96e52d368876a632e2842f6310c6..47944cf655abbddd3cd109d6ef64d5a3783ee4dd 100644 | 
| --- a/content/browser/device_orientation/provider_unittest.cc | 
| +++ b/content/browser/device_orientation/provider_unittest.cc | 
| @@ -9,6 +9,7 @@ | 
| #include "base/synchronization/lock.h" | 
| #include "content/browser/device_orientation/data_fetcher.h" | 
| #include "content/browser/device_orientation/device_data.h" | 
| +#include "content/browser/device_orientation/motion.h" | 
| #include "content/browser/device_orientation/orientation.h" | 
| #include "content/browser/device_orientation/provider.h" | 
| #include "content/browser/device_orientation/provider_impl.h" | 
| @@ -70,6 +71,90 @@ class UpdateChecker : public Provider::Observer { | 
| std::queue<scoped_refptr<const DeviceData> > expectations_queue_; | 
| }; | 
|  | 
| +// Class for checking expectations on motion updates from the Provider. | 
| +class MotionUpdateChecker : public UpdateChecker { | 
| + public: | 
| +  explicit MotionUpdateChecker(int* expectations_count_ptr) | 
| +      : UpdateChecker(DeviceData::kTypeMotion, expectations_count_ptr) { | 
| +  } | 
| + | 
| +  virtual ~MotionUpdateChecker() {} | 
| + | 
| +  // From UpdateChecker. | 
| +  virtual void OnDeviceDataUpdate(const DeviceData* device_data, | 
| +      DeviceData::Type device_data_type) OVERRIDE { | 
| +    ASSERT_FALSE(expectations_queue_.empty()); | 
| +    ASSERT_EQ(DeviceData::kTypeMotion, device_data_type); | 
| + | 
| +    scoped_refptr<const Motion> motion(static_cast<const Motion*>(device_data)); | 
| +    if (motion == NULL) | 
| +      motion = new Motion(); | 
| + | 
| +    scoped_refptr<const Motion> expected(static_cast<const Motion*>( | 
| +        (expectations_queue_.front().get()))); | 
| +    expectations_queue_.pop(); | 
| + | 
| +    EXPECT_EQ(expected->can_provide_acceleration_x(), | 
| +              motion->can_provide_acceleration_x()); | 
| +    EXPECT_EQ(expected->can_provide_acceleration_y(), | 
| +              motion->can_provide_acceleration_y()); | 
| +    EXPECT_EQ(expected->can_provide_acceleration_z(), | 
| +              motion->can_provide_acceleration_z()); | 
| + | 
| +    EXPECT_EQ(expected->can_provide_acceleration_including_gravity_x(), | 
| +              motion->can_provide_acceleration_including_gravity_x()); | 
| +    EXPECT_EQ(expected->can_provide_acceleration_including_gravity_y(), | 
| +              motion->can_provide_acceleration_including_gravity_y()); | 
| +    EXPECT_EQ(expected->can_provide_acceleration_including_gravity_z(), | 
| +              motion->can_provide_acceleration_including_gravity_z()); | 
| + | 
| +    EXPECT_EQ(expected->can_provide_rotation_rate_alpha(), | 
| +              motion->can_provide_rotation_rate_alpha()); | 
| +    EXPECT_EQ(expected->can_provide_rotation_rate_beta(), | 
| +              motion->can_provide_rotation_rate_beta()); | 
| +    EXPECT_EQ(expected->can_provide_rotation_rate_gamma(), | 
| +              motion->can_provide_rotation_rate_gamma()); | 
| + | 
| +    EXPECT_EQ(expected->can_provide_interval(), motion->can_provide_interval()); | 
| + | 
| +    if (expected->can_provide_acceleration_x()) | 
| +      EXPECT_EQ(expected->acceleration_x(), motion->acceleration_x()); | 
| +    if (expected->can_provide_acceleration_y()) | 
| +      EXPECT_EQ(expected->acceleration_y(), motion->acceleration_y()); | 
| +    if (expected->can_provide_acceleration_z()) | 
| +      EXPECT_EQ(expected->acceleration_z(), motion->acceleration_z()); | 
| + | 
| +    if (expected->can_provide_acceleration_including_gravity_x()) | 
| +      EXPECT_EQ(expected->acceleration_including_gravity_x(), | 
| +                motion->acceleration_including_gravity_x()); | 
| +    if (expected->can_provide_acceleration_including_gravity_y()) | 
| +      EXPECT_EQ(expected->acceleration_including_gravity_y(), | 
| +                motion->acceleration_including_gravity_y()); | 
| +    if (expected->can_provide_acceleration_including_gravity_z()) | 
| +      EXPECT_EQ(expected->acceleration_including_gravity_z(), | 
| +                motion->acceleration_including_gravity_z()); | 
| + | 
| +    if (expected->can_provide_rotation_rate_alpha()) | 
| +      EXPECT_EQ(expected->rotation_rate_alpha(), | 
| +                motion->rotation_rate_alpha()); | 
| +    if (expected->can_provide_rotation_rate_beta()) | 
| +      EXPECT_EQ(expected->rotation_rate_beta(), | 
| +                motion->rotation_rate_beta()); | 
| +    if (expected->can_provide_rotation_rate_gamma()) | 
| +      EXPECT_EQ(expected->rotation_rate_gamma(), | 
| +                motion->rotation_rate_gamma()); | 
| + | 
| +    if (expected->can_provide_interval()) | 
| +      EXPECT_EQ(expected->interval(), motion->interval()); | 
| + | 
| +    --(*expectations_count_ptr_); | 
| + | 
| +    if (*expectations_count_ptr_ == 0) { | 
| +      MessageLoop::current()->PostTask(FROM_HERE, MessageLoop::QuitClosure()); | 
| +    } | 
| +  } | 
| +}; | 
| + | 
| // Class for checking expectations on orientation updates from the Provider. | 
| class OrientationUpdateChecker : public UpdateChecker { | 
| public: | 
| @@ -523,7 +608,43 @@ TEST_F(DeviceOrientationProviderTest, StartStopStart) { | 
| MockDeviceDataFactory::SetCurInstance(NULL); | 
| } | 
|  | 
| -// Tests that Orientation events only fire if the change is significant | 
| +// Tests that Motion events always fire, even if the motion is unchanged. | 
| +TEST_F(DeviceOrientationProviderTest, MotionAlwaysFires) { | 
| +  scoped_refptr<MockDeviceDataFactory> device_data_factory( | 
| +      new MockDeviceDataFactory()); | 
| +  MockDeviceDataFactory::SetCurInstance(device_data_factory.get()); | 
| +  Init(MockDeviceDataFactory::CreateDataFetcher); | 
| + | 
| +  scoped_refptr<Motion> test_motion(new Motion()); | 
| +  test_motion->set_acceleration_x(1); | 
| +  test_motion->set_acceleration_y(2); | 
| +  test_motion->set_acceleration_z(3); | 
| +  test_motion->set_acceleration_including_gravity_x(4); | 
| +  test_motion->set_acceleration_including_gravity_y(5); | 
| +  test_motion->set_acceleration_including_gravity_z(6); | 
| +  test_motion->set_rotation_rate_alpha(7); | 
| +  test_motion->set_rotation_rate_beta(8); | 
| +  test_motion->set_rotation_rate_gamma(9); | 
| +  test_motion->set_interval(10); | 
| + | 
| +  scoped_ptr<MotionUpdateChecker> checker(new MotionUpdateChecker( | 
| +      &pending_expectations_)); | 
| + | 
| +  device_data_factory->SetDeviceData(test_motion, DeviceData::kTypeMotion); | 
| +  checker->AddExpectation(test_motion); | 
| +  provider_->AddObserver(checker.get()); | 
| +  MessageLoop::current()->Run(); | 
| + | 
| +  // The observer should receive the same motion again. | 
| +  device_data_factory->SetDeviceData(test_motion, DeviceData::kTypeMotion); | 
| +  checker->AddExpectation(test_motion); | 
| +  MessageLoop::current()->Run(); | 
| + | 
| +  provider_->RemoveObserver(checker.get()); | 
| +  MockDeviceDataFactory::SetCurInstance(NULL); | 
| +} | 
| + | 
| +// Tests that Orientation events only fire if the change is significant. | 
| TEST_F(DeviceOrientationProviderTest, OrientationSignificantlyDifferent) { | 
| scoped_refptr<MockDeviceDataFactory> device_data_factory( | 
| new MockDeviceDataFactory()); | 
|  |