Bug 1355648 - Part 2: Handle GampadPose losing tracking situation; r?kip, qdot draft
authorDaosheng Mu <daoshengmu@gmail.com>
Fri, 21 Apr 2017 18:15:22 +0800
changeset 568422 9eeb4ec9d265f232e7741f9b63018a2a43e54b92
parent 568421 c2457d57f4db025a057aa73eb6160a4f1698ccde
child 568423 2d2340365d600f6a49240138ed79df07db7b7c67
push id55867
push userbmo:dmu@mozilla.com
push dateWed, 26 Apr 2017 06:11:42 +0000
reviewerskip, qdot
bugs1355648
milestone55.0a1
Bug 1355648 - Part 2: Handle GampadPose losing tracking situation; r?kip, qdot MozReview-Commit-ID: FAWnYBuDfFy
dom/gamepad/GamepadPose.cpp
dom/gamepad/GamepadPoseState.h
dom/gamepad/ipc/GamepadMessageUtils.h
--- a/dom/gamepad/GamepadPose.cpp
+++ b/dom/gamepad/GamepadPose.cpp
@@ -50,63 +50,69 @@ GamepadPose::HasPosition() const
   return bool(mPoseState.flags & GamepadCapabilityFlags::Cap_Orientation);
 }
 
 void
 GamepadPose::GetPosition(JSContext* aJSContext,
                          JS::MutableHandle<JSObject*> aRetval,
                          ErrorResult& aRv)
 {
-  SetFloat32Array(aJSContext, aRetval, mPosition, mPoseState.position, 3,
-    bool(mPoseState.flags & GamepadCapabilityFlags::Cap_Position), aRv);
+  SetFloat32Array(aJSContext, aRetval, mPosition,
+                  mPoseState.isPositionValid ? mPoseState.position : nullptr, 3,
+                  bool(mPoseState.flags & GamepadCapabilityFlags::Cap_Position), aRv);
 }
 
 void
 GamepadPose::GetLinearVelocity(JSContext* aJSContext,
                                JS::MutableHandle<JSObject*> aRetval,
                                ErrorResult& aRv)
 {
-  SetFloat32Array(aJSContext, aRetval, mLinearVelocity, mPoseState.linearVelocity, 3,
-    bool(mPoseState.flags & GamepadCapabilityFlags::Cap_Position), aRv);
+  SetFloat32Array(aJSContext, aRetval, mLinearVelocity,
+                  mPoseState.isPositionValid ? mPoseState.linearVelocity : nullptr, 3,
+                  bool(mPoseState.flags & GamepadCapabilityFlags::Cap_Position), aRv);
 }
 
 void
 GamepadPose::GetLinearAcceleration(JSContext* aJSContext,
                                    JS::MutableHandle<JSObject*> aRetval,
                                    ErrorResult& aRv)
 {
-  SetFloat32Array(aJSContext, aRetval, mLinearAcceleration, mPoseState.linearAcceleration, 3,
-    bool(mPoseState.flags & GamepadCapabilityFlags::Cap_LinearAcceleration), aRv);
+  SetFloat32Array(aJSContext, aRetval, mLinearAcceleration,
+                  mPoseState.isPositionValid ? mPoseState.linearAcceleration : nullptr, 3,
+                  bool(mPoseState.flags & GamepadCapabilityFlags::Cap_LinearAcceleration), aRv);
 }
 
 void
 GamepadPose::GetOrientation(JSContext* aJSContext,
                             JS::MutableHandle<JSObject*> aRetval,
                             ErrorResult& aRv)
 {
-  SetFloat32Array(aJSContext, aRetval, mOrientation, mPoseState.orientation, 4,
-    bool(mPoseState.flags & GamepadCapabilityFlags::Cap_Orientation), aRv);
+  SetFloat32Array(aJSContext, aRetval, mOrientation,
+                  mPoseState.isOrientationValid ? mPoseState.orientation : nullptr, 4,
+                  bool(mPoseState.flags & GamepadCapabilityFlags::Cap_Orientation), aRv);
 }
 
 void
 GamepadPose::GetAngularVelocity(JSContext* aJSContext,
                                 JS::MutableHandle<JSObject*> aRetval,
                                 ErrorResult& aRv)
 {
-  SetFloat32Array(aJSContext, aRetval, mAngularVelocity, mPoseState.angularVelocity, 3,
-    bool(mPoseState.flags & GamepadCapabilityFlags::Cap_Orientation), aRv);
+  SetFloat32Array(aJSContext, aRetval, mAngularVelocity,
+                  mPoseState.isOrientationValid ? mPoseState.angularVelocity : nullptr, 3,
+                  bool(mPoseState.flags & GamepadCapabilityFlags::Cap_Orientation), aRv);
 }
 
 void
 GamepadPose::GetAngularAcceleration(JSContext* aJSContext,
                                     JS::MutableHandle<JSObject*> aRetval,
                                     ErrorResult& aRv)
 {
-  SetFloat32Array(aJSContext, aRetval, mAngularAcceleration, mPoseState.angularAcceleration, 3,
-    bool(mPoseState.flags & GamepadCapabilityFlags::Cap_AngularAcceleration), aRv);
+  SetFloat32Array(aJSContext, aRetval, mAngularAcceleration,
+                  mPoseState.isOrientationValid ? mPoseState.angularAcceleration : nullptr, 3,
+                  bool(mPoseState.flags & GamepadCapabilityFlags::Cap_AngularAcceleration), aRv);
 }
 
 void
 GamepadPose::SetPoseState(const GamepadPoseState& aPose)
 {
   mPoseState = aPose;
 }
 
--- a/dom/gamepad/GamepadPoseState.h
+++ b/dom/gamepad/GamepadPoseState.h
@@ -37,16 +37,18 @@ struct GamepadPoseState
 {
   GamepadCapabilityFlags flags;
   float orientation[4];
   float position[3];
   float angularVelocity[3];
   float angularAcceleration[3];
   float linearVelocity[3];
   float linearAcceleration[3];
+  bool isPositionValid;
+  bool isOrientationValid;
 
   GamepadPoseState()
   {
     Clear();
   }
 
   bool operator==(const GamepadPoseState& aPose) const
   {
@@ -64,17 +66,19 @@ struct GamepadPoseState
            && angularAcceleration[0] == aPose.angularAcceleration[0]
            && angularAcceleration[1] == aPose.angularAcceleration[1]
            && angularAcceleration[2] == aPose.angularAcceleration[2]
            && linearVelocity[0] == aPose.linearVelocity[0]
            && linearVelocity[1] == aPose.linearVelocity[1]
            && linearVelocity[2] == aPose.linearVelocity[2]
            && linearAcceleration[0] == aPose.linearAcceleration[0]
            && linearAcceleration[1] == aPose.linearAcceleration[1]
-           && linearAcceleration[2] == aPose.linearAcceleration[2];
+           && linearAcceleration[2] == aPose.linearAcceleration[2]
+           && isPositionValid == aPose.isPositionValid
+           && isOrientationValid == aPose.isOrientationValid;
   }
 
   bool operator!=(const GamepadPoseState& aPose) const
   {
     return !(*this == aPose);
   }
 
   void Clear() {
--- a/dom/gamepad/ipc/GamepadMessageUtils.h
+++ b/dom/gamepad/ipc/GamepadMessageUtils.h
@@ -57,16 +57,18 @@ struct ParamTraits<mozilla::dom::Gamepad
     WriteParam(aMsg, aParam.angularAcceleration[1]);
     WriteParam(aMsg, aParam.angularAcceleration[2]);
     WriteParam(aMsg, aParam.linearVelocity[0]);
     WriteParam(aMsg, aParam.linearVelocity[1]);
     WriteParam(aMsg, aParam.linearVelocity[2]);
     WriteParam(aMsg, aParam.linearAcceleration[0]);
     WriteParam(aMsg, aParam.linearAcceleration[1]);
     WriteParam(aMsg, aParam.linearAcceleration[2]);
+    WriteParam(aMsg, aParam.isPositionValid);
+    WriteParam(aMsg, aParam.isOrientationValid);
   }
 
   static bool Read(const Message* aMsg, PickleIterator* aIter, paramType* aResult)
   {
     if (!ReadParam(aMsg, aIter, &(aResult->flags)) ||
         !ReadParam(aMsg, aIter, &(aResult->orientation[0])) ||
         !ReadParam(aMsg, aIter, &(aResult->orientation[1])) ||
         !ReadParam(aMsg, aIter, &(aResult->orientation[2])) ||
@@ -80,17 +82,19 @@ struct ParamTraits<mozilla::dom::Gamepad
         !ReadParam(aMsg, aIter, &(aResult->angularAcceleration[0])) ||
         !ReadParam(aMsg, aIter, &(aResult->angularAcceleration[1])) ||
         !ReadParam(aMsg, aIter, &(aResult->angularAcceleration[2])) ||
         !ReadParam(aMsg, aIter, &(aResult->linearVelocity[0])) ||
         !ReadParam(aMsg, aIter, &(aResult->linearVelocity[1])) ||
         !ReadParam(aMsg, aIter, &(aResult->linearVelocity[2])) ||
         !ReadParam(aMsg, aIter, &(aResult->linearAcceleration[0])) ||
         !ReadParam(aMsg, aIter, &(aResult->linearAcceleration[1])) ||
-        !ReadParam(aMsg, aIter, &(aResult->linearAcceleration[2]))) {
+        !ReadParam(aMsg, aIter, &(aResult->linearAcceleration[2])) ||
+        !ReadParam(aMsg, aIter, &(aResult->isPositionValid)) ||
+        !ReadParam(aMsg, aIter, &(aResult->isOrientationValid))) {
       return false;
     }
     return true;
   }
 };
 
 } // namespace IPC