summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoraousterh@chromium.org <aousterh@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-08-16 17:07:32 +0000
committeraousterh@chromium.org <aousterh@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-08-16 17:07:32 +0000
commit539f1300ee42b8c6d70c41cd46f64e440e293112 (patch)
treeaefce408131c959897c52c985095f45cc369599e
parent63a31af0210d558cd210bd4dfcf3807f68806900 (diff)
downloadchromium_src-539f1300ee42b8c6d70c41cd46f64e440e293112.zip
chromium_src-539f1300ee42b8c6d70c41cd46f64e440e293112.tar.gz
chromium_src-539f1300ee42b8c6d70c41cd46f64e440e293112.tar.bz2
Implements part of DeviceMotion in the browser
This adds the motion message filter, motion ipc messages, and related motion files. This was originally part of a larger patch (http://codereview.chromium.org/10698046/). BUG=59201 Review URL: https://chromiumcodereview.appspot.com/10823310 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@151908 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--content/browser/device_orientation/device_data.h1
-rw-r--r--content/browser/device_orientation/motion.cc66
-rw-r--r--content/browser/device_orientation/motion.h165
-rw-r--r--content/browser/device_orientation/motion_message_filter.cc32
-rw-r--r--content/browser/device_orientation/motion_message_filter.h30
-rw-r--r--content/browser/device_orientation/observer_delegate.cc13
-rw-r--r--content/browser/device_orientation/orientation_message_filter.h2
-rw-r--r--content/browser/device_orientation/provider_unittest.cc123
-rw-r--r--content/common/content_message_generator.h1
-rw-r--r--content/common/device_motion_messages.h50
-rw-r--r--content/content_browser.gypi8
-rw-r--r--content/content_common.gypi1
-rw-r--r--ipc/ipc_message_utils.h1
13 files changed, 487 insertions, 6 deletions
diff --git a/content/browser/device_orientation/device_data.h b/content/browser/device_orientation/device_data.h
index 84d28c7..ae65618 100644
--- a/content/browser/device_orientation/device_data.h
+++ b/content/browser/device_orientation/device_data.h
@@ -18,6 +18,7 @@ class CONTENT_EXPORT DeviceData :
public base::RefCountedThreadSafe<DeviceData> {
public:
enum Type {
+ kTypeMotion,
kTypeOrientation,
kTypeTest
};
diff --git a/content/browser/device_orientation/motion.cc b/content/browser/device_orientation/motion.cc
new file mode 100644
index 0000000..d5985e6
--- /dev/null
+++ b/content/browser/device_orientation/motion.cc
@@ -0,0 +1,66 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/device_orientation/motion.h"
+
+#include "content/common/device_motion_messages.h"
+
+namespace content {
+
+Motion::Motion()
+ : can_provide_acceleration_x_(false),
+ can_provide_acceleration_y_(false),
+ can_provide_acceleration_z_(false),
+ can_provide_acceleration_including_gravity_x_(false),
+ can_provide_acceleration_including_gravity_y_(false),
+ can_provide_acceleration_including_gravity_z_(false),
+ can_provide_rotation_rate_alpha_(false),
+ can_provide_rotation_rate_beta_(false),
+ can_provide_rotation_rate_gamma_(false),
+ can_provide_interval_(false) {
+}
+
+Motion::~Motion() {
+}
+
+IPC::Message* Motion::CreateIPCMessage(int render_view_id) const {
+ DeviceMotionMsg_Updated_Params params;
+
+ params.can_provide_acceleration_x = can_provide_acceleration_x_;
+ params.acceleration_x = acceleration_x_;
+ params.can_provide_acceleration_y = can_provide_acceleration_y_;
+ params.acceleration_y = acceleration_y_;
+ params.can_provide_acceleration_z = can_provide_acceleration_z_;
+ params.acceleration_z = acceleration_z_;
+
+ params.can_provide_acceleration_including_gravity_x =
+ can_provide_acceleration_including_gravity_x_;
+ params.acceleration_including_gravity_x = acceleration_including_gravity_x_;
+ params.can_provide_acceleration_including_gravity_y =
+ can_provide_acceleration_including_gravity_y_;
+ params.acceleration_including_gravity_y = acceleration_including_gravity_y_;
+ params.can_provide_acceleration_including_gravity_z =
+ can_provide_acceleration_including_gravity_z_;
+ params.acceleration_including_gravity_z = acceleration_including_gravity_z_;
+
+ params.can_provide_rotation_rate_alpha = can_provide_rotation_rate_alpha_;
+ params.rotation_rate_alpha = rotation_rate_alpha_;
+ params.can_provide_rotation_rate_beta = can_provide_rotation_rate_beta_;
+ params.rotation_rate_beta = rotation_rate_beta_;
+ params.can_provide_rotation_rate_gamma = can_provide_rotation_rate_gamma_;
+ params.rotation_rate_gamma = rotation_rate_gamma_;
+
+ params.can_provide_interval = can_provide_interval_;
+ params.interval = interval_;
+
+ return new DeviceMotionMsg_Updated(render_view_id, params);
+}
+
+// Should always fire new motion events so that they occur at regular intervals.
+// The firing frequency is determined by the polling frequency in ProviderImpl.
+bool Motion::ShouldFireEvent(const DeviceData* old_data) const {
+ return true;
+}
+
+}; // namespace content
diff --git a/content/browser/device_orientation/motion.h b/content/browser/device_orientation/motion.h
new file mode 100644
index 0000000..8027254
--- /dev/null
+++ b/content/browser/device_orientation/motion.h
@@ -0,0 +1,165 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_DEVICE_ORIENTATION_MOTION_H_
+#define CONTENT_BROWSER_DEVICE_ORIENTATION_MOTION_H_
+
+#include "base/compiler_specific.h"
+#include "content/browser/device_orientation/device_data.h"
+#include "content/common/content_export.h"
+
+namespace content {
+
+class Motion : public DeviceData {
+ public:
+ // acceleration_x, acceleration_y, and acceleration_z are the accelerations
+ // excluding gravity along the axes specified in
+ // http://dev.w3.org/geo/api/spec-source-orientation.html
+
+ // acceleration_including_gravity_x, acceleration_including_gravity_y, and
+ // acceleration_including_gravity_z are the accelerations including gravity
+ // along the same axes as above
+
+ // rotation_rate_alpha, rotation_rate_beta, and rotataion_rate_gamma are the
+ // rotations around the same axes as above
+
+ // interval is the time interval at which data is obtained from the hardware,
+ // as specified in the document referenced above
+
+ // can_provide_{acceleration_x, acceleration_y, acceleration_z,
+ // acceleration_including_gravity_x, acceleration_including_gravity_y,
+ // acceleration_including_gravity_z, rotation_rate_alpha, rotation_rate_beta,
+ // rotation_rate_gamma, interval} is true if data can be provided for that
+ // variable
+ CONTENT_EXPORT Motion();
+
+ // From DeviceData.
+ virtual IPC::Message* CreateIPCMessage(int render_view_id) const OVERRIDE;
+ virtual bool ShouldFireEvent(const DeviceData* old_data) const OVERRIDE;
+
+ void set_acceleration_x(double acceleration_x) {
+ can_provide_acceleration_x_ = true;
+ acceleration_x_ = acceleration_x;
+ }
+ bool can_provide_acceleration_x() const {
+ return can_provide_acceleration_x_;
+ }
+ double acceleration_x() const { return acceleration_x_; }
+
+ void set_acceleration_y(double acceleration_y) {
+ can_provide_acceleration_y_ = true;
+ acceleration_y_ = acceleration_y;
+ }
+ bool can_provide_acceleration_y() const {
+ return can_provide_acceleration_y_;
+ }
+ double acceleration_y() const { return acceleration_y_; }
+
+ void set_acceleration_z(double acceleration_z) {
+ can_provide_acceleration_z_ = true;
+ acceleration_z_ = acceleration_z;
+ }
+ bool can_provide_acceleration_z() const {
+ return can_provide_acceleration_z_;
+ }
+ double acceleration_z() const { return acceleration_z_; }
+
+ void set_acceleration_including_gravity_x(
+ double acceleration_including_gravity_x) {
+ can_provide_acceleration_including_gravity_x_ = true;
+ acceleration_including_gravity_x_ = acceleration_including_gravity_x;
+ }
+ bool can_provide_acceleration_including_gravity_x() const {
+ return can_provide_acceleration_x_;
+ }
+ double acceleration_including_gravity_x() const {
+ return acceleration_including_gravity_x_;
+ }
+
+ void set_acceleration_including_gravity_y(
+ double acceleration_including_gravity_y) {
+ can_provide_acceleration_including_gravity_y_ = true;
+ acceleration_including_gravity_y_ = acceleration_including_gravity_y;
+ }
+ bool can_provide_acceleration_including_gravity_y() const {
+ return can_provide_acceleration_y_;
+ }
+ double acceleration_including_gravity_y() const {
+ return acceleration_including_gravity_y_;
+ }
+
+ void set_acceleration_including_gravity_z(
+ double acceleration_including_gravity_z) {
+ can_provide_acceleration_including_gravity_z_ = true;
+ acceleration_including_gravity_z_ = acceleration_including_gravity_z;
+ }
+ bool can_provide_acceleration_including_gravity_z() const {
+ return can_provide_acceleration_z_;
+ }
+ double acceleration_including_gravity_z() const {
+ return acceleration_including_gravity_z_;
+ }
+
+ void set_rotation_rate_alpha(double rotation_rate_alpha) {
+ can_provide_rotation_rate_alpha_ = true;
+ rotation_rate_alpha_ = rotation_rate_alpha;
+ }
+ bool can_provide_rotation_rate_alpha() const {
+ return can_provide_rotation_rate_alpha_;
+ }
+ double rotation_rate_alpha() const { return rotation_rate_alpha_; }
+
+ void set_rotation_rate_beta(double rotation_rate_beta) {
+ can_provide_rotation_rate_beta_ = true;
+ rotation_rate_beta_ = rotation_rate_beta;
+ }
+ bool can_provide_rotation_rate_beta() const {
+ return can_provide_rotation_rate_beta_;
+ }
+ double rotation_rate_beta() const { return rotation_rate_beta_; }
+
+ void set_rotation_rate_gamma(double rotation_rate_gamma) {
+ can_provide_rotation_rate_gamma_ = true;
+ rotation_rate_gamma_ = rotation_rate_gamma;
+ }
+ bool can_provide_rotation_rate_gamma() const {
+ return can_provide_rotation_rate_gamma_;
+ }
+ double rotation_rate_gamma() const { return rotation_rate_gamma_; }
+
+ void set_interval(double interval) {
+ can_provide_interval_ = true;
+ interval_ = interval;
+ }
+ bool can_provide_interval() const { return can_provide_interval_; }
+ double interval() const { return interval_; }
+
+ private:
+ virtual ~Motion();
+
+ double acceleration_x_;
+ double acceleration_y_;
+ double acceleration_z_;
+ double acceleration_including_gravity_x_;
+ double acceleration_including_gravity_y_;
+ double acceleration_including_gravity_z_;
+ double rotation_rate_alpha_;
+ double rotation_rate_beta_;
+ double rotation_rate_gamma_;
+ double interval_;
+ bool can_provide_acceleration_x_;
+ bool can_provide_acceleration_y_;
+ bool can_provide_acceleration_z_;
+ bool can_provide_acceleration_including_gravity_x_;
+ bool can_provide_acceleration_including_gravity_y_;
+ bool can_provide_acceleration_including_gravity_z_;
+ bool can_provide_rotation_rate_alpha_;
+ bool can_provide_rotation_rate_beta_;
+ bool can_provide_rotation_rate_gamma_;
+ bool can_provide_interval_;
+};
+
+} // namespace content
+
+#endif // CONTENT_BROWSER_DEVICE_ORIENTATION_MOTION_H_
diff --git a/content/browser/device_orientation/motion_message_filter.cc b/content/browser/device_orientation/motion_message_filter.cc
new file mode 100644
index 0000000..769e74d
--- /dev/null
+++ b/content/browser/device_orientation/motion_message_filter.cc
@@ -0,0 +1,32 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/device_orientation/motion_message_filter.h"
+
+#include "content/browser/device_orientation/device_data.h"
+#include "content/common/device_motion_messages.h"
+#include "content/public/browser/browser_thread.h"
+
+namespace content {
+
+MotionMessageFilter::MotionMessageFilter()
+ : MessageFilter(DeviceData::kTypeMotion) {
+}
+
+MotionMessageFilter::~MotionMessageFilter() {
+}
+
+bool MotionMessageFilter::OnMessageReceived(const IPC::Message& message,
+ bool* message_was_ok) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ bool handled = true;
+ IPC_BEGIN_MESSAGE_MAP_EX(MotionMessageFilter, message, *message_was_ok)
+ IPC_MESSAGE_HANDLER(DeviceMotionHostMsg_StartUpdating, OnStartUpdating)
+ IPC_MESSAGE_HANDLER(DeviceMotionHostMsg_StopUpdating, OnStopUpdating)
+ IPC_MESSAGE_UNHANDLED(handled = false)
+ IPC_END_MESSAGE_MAP()
+ return handled;
+}
+
+} // namespace content
diff --git a/content/browser/device_orientation/motion_message_filter.h b/content/browser/device_orientation/motion_message_filter.h
new file mode 100644
index 0000000..3cd9297
--- /dev/null
+++ b/content/browser/device_orientation/motion_message_filter.h
@@ -0,0 +1,30 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_DEVICE_ORIENTATION_MOTION_MESSAGE_FILTER_H_
+#define CONTENT_BROWSER_DEVICE_ORIENTATION_MOTION_MESSAGE_FILTER_H_
+
+#include <map>
+
+#include "content/browser/device_orientation/message_filter.h"
+
+namespace content {
+
+class MotionMessageFilter : public MessageFilter {
+ public:
+ MotionMessageFilter();
+
+ // MessageFilter implementation.
+ virtual bool OnMessageReceived(const IPC::Message& message,
+ bool* message_was_ok) OVERRIDE;
+
+ private:
+ virtual ~MotionMessageFilter();
+
+ DISALLOW_COPY_AND_ASSIGN(MotionMessageFilter);
+};
+
+} // namespace content
+
+#endif // CONTENT_BROWSER_DEVICE_ORIENTATION_MOTION_MESSAGE_FILTER_H_
diff --git a/content/browser/device_orientation/observer_delegate.cc b/content/browser/device_orientation/observer_delegate.cc
index 6598f0f..1ffe07a 100644
--- a/content/browser/device_orientation/observer_delegate.cc
+++ b/content/browser/device_orientation/observer_delegate.cc
@@ -6,6 +6,7 @@
#include "base/logging.h"
#include "content/browser/device_orientation/device_data.h"
+#include "content/browser/device_orientation/motion.h"
#include "content/browser/device_orientation/orientation.h"
#include "ipc/ipc_sender.h"
@@ -35,8 +36,16 @@ void ObserverDelegate::OnDeviceDataUpdate(
}
DeviceData* ObserverDelegate::EmptyDeviceData(DeviceData::Type type) {
- DCHECK(type == DeviceData::kTypeOrientation);
- return new Orientation();
+ switch (type) {
+ case DeviceData::kTypeMotion:
+ return new Motion();
+ case DeviceData::kTypeOrientation:
+ return new Orientation();
+ case DeviceData::kTypeTest:
+ NOTREACHED();
+ }
+ NOTREACHED();
+ return NULL;
}
} // namespace content
diff --git a/content/browser/device_orientation/orientation_message_filter.h b/content/browser/device_orientation/orientation_message_filter.h
index de0df56..efbccd3 100644
--- a/content/browser/device_orientation/orientation_message_filter.h
+++ b/content/browser/device_orientation/orientation_message_filter.h
@@ -15,7 +15,7 @@ class OrientationMessageFilter : public MessageFilter {
public:
OrientationMessageFilter();
- // content::BrowserMessageFilter implementation.
+ // MessageFilter implementation.
virtual bool OnMessageReceived(const IPC::Message& message,
bool* message_was_ok) OVERRIDE;
diff --git a/content/browser/device_orientation/provider_unittest.cc b/content/browser/device_orientation/provider_unittest.cc
index 471efa4..47944cf 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());
diff --git a/content/common/content_message_generator.h b/content/common/content_message_generator.h
index e5cdb48..741152d 100644
--- a/content/common/content_message_generator.h
+++ b/content/common/content_message_generator.h
@@ -12,6 +12,7 @@
#include "content/common/clipboard_messages.h"
#include "content/common/database_messages.h"
#include "content/common/desktop_notification_messages.h"
+#include "content/common/device_motion_messages.h"
#include "content/common/device_orientation_messages.h"
#include "content/common/devtools_messages.h"
#include "content/common/dom_storage_messages.h"
diff --git a/content/common/device_motion_messages.h b/content/common/device_motion_messages.h
new file mode 100644
index 0000000..0d3303d
--- /dev/null
+++ b/content/common/device_motion_messages.h
@@ -0,0 +1,50 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// IPC messages for device motion.
+// Multiply-included message file, hence no include guard.
+
+#include "ipc/ipc_message_macros.h"
+
+#define IPC_MESSAGE_START DeviceMotionMsgStart
+
+IPC_STRUCT_BEGIN(DeviceMotionMsg_Updated_Params)
+ // These fields have the same meaning as in device_motion::Motion.
+ IPC_STRUCT_MEMBER(bool, can_provide_acceleration_x)
+ IPC_STRUCT_MEMBER(double, acceleration_x)
+ IPC_STRUCT_MEMBER(bool, can_provide_acceleration_y)
+ IPC_STRUCT_MEMBER(double, acceleration_y)
+ IPC_STRUCT_MEMBER(bool, can_provide_acceleration_z)
+ IPC_STRUCT_MEMBER(double, acceleration_z)
+ IPC_STRUCT_MEMBER(bool, can_provide_acceleration_including_gravity_x)
+ IPC_STRUCT_MEMBER(double, acceleration_including_gravity_x)
+ IPC_STRUCT_MEMBER(bool, can_provide_acceleration_including_gravity_y)
+ IPC_STRUCT_MEMBER(double, acceleration_including_gravity_y)
+ IPC_STRUCT_MEMBER(bool, can_provide_acceleration_including_gravity_z)
+ IPC_STRUCT_MEMBER(double, acceleration_including_gravity_z)
+ IPC_STRUCT_MEMBER(bool, can_provide_rotation_rate_alpha)
+ IPC_STRUCT_MEMBER(double, rotation_rate_alpha)
+ IPC_STRUCT_MEMBER(bool, can_provide_rotation_rate_beta)
+ IPC_STRUCT_MEMBER(double, rotation_rate_beta)
+ IPC_STRUCT_MEMBER(bool, can_provide_rotation_rate_gamma)
+ IPC_STRUCT_MEMBER(double, rotation_rate_gamma)
+ IPC_STRUCT_MEMBER(bool, can_provide_interval)
+ IPC_STRUCT_MEMBER(double, interval)
+IPC_STRUCT_END()
+
+// Messages sent from the browser to the renderer.
+
+// Notification that the device's motion has changed.
+IPC_MESSAGE_ROUTED1(DeviceMotionMsg_Updated,
+ DeviceMotionMsg_Updated_Params)
+
+// Messages sent from the renderer to the browser.
+
+// A RenderView requests to start receiving device motion updates.
+IPC_MESSAGE_CONTROL1(DeviceMotionHostMsg_StartUpdating,
+ int /* render_view_id */)
+
+// A RenderView requests to stop receiving device motion updates.
+IPC_MESSAGE_CONTROL1(DeviceMotionHostMsg_StopUpdating,
+ int /* render_view_id */)
diff --git a/content/content_browser.gypi b/content/content_browser.gypi
index 9d2ad10..b95c14e 100644
--- a/content/content_browser.gypi
+++ b/content/content_browser.gypi
@@ -288,12 +288,16 @@
'browser/device_orientation/device_data.h',
'browser/device_orientation/message_filter.cc',
'browser/device_orientation/message_filter.h',
+ 'browser/device_orientation/motion.cc',
+ 'browser/device_orientation/motion.h',
+ 'browser/device_orientation/motion_message_filter.cc',
+ 'browser/device_orientation/motion_message_filter.h',
'browser/device_orientation/observer_delegate.cc',
'browser/device_orientation/observer_delegate.h',
- 'browser/device_orientation/orientation_message_filter.cc',
- 'browser/device_orientation/orientation_message_filter.h',
'browser/device_orientation/orientation.cc',
'browser/device_orientation/orientation.h',
+ 'browser/device_orientation/orientation_message_filter.cc',
+ 'browser/device_orientation/orientation_message_filter.h',
'browser/device_orientation/provider.cc',
'browser/device_orientation/provider.h',
'browser/device_orientation/provider_impl.cc',
diff --git a/content/content_common.gypi b/content/content_common.gypi
index 2599db3..755ea29 100644
--- a/content/content_common.gypi
+++ b/content/content_common.gypi
@@ -156,6 +156,7 @@
'common/debug_flags.cc',
'common/debug_flags.h',
'common/desktop_notification_messages.h',
+ 'common/device_motion_messages.h',
'common/device_orientation_messages.h',
'common/devtools_messages.h',
'common/dom_storage_messages.h',
diff --git a/ipc/ipc_message_utils.h b/ipc/ipc_message_utils.h
index 168b2bc..07db6ef 100644
--- a/ipc/ipc_message_utils.h
+++ b/ipc/ipc_message_utils.h
@@ -78,6 +78,7 @@ enum IPCMessageStart {
ClipboardMsgStart,
BlobMsgStart,
AppCacheMsgStart,
+ DeviceMotionMsgStart,
DeviceOrientationMsgStart,
DesktopNotificationMsgStart,
GeolocationMsgStart,