Bug 1219296 - Add IPC support for nsStyleCoord and nsStyleCoord::CalcValue. r=dholbert draft
authorBotond Ballo <botond@mozilla.com>
Fri, 18 Mar 2016 19:01:06 -0400
changeset 342370 c4ccb67575306d3eb6e013632c95bc4bd3ab5a99
parent 342369 e2fdbc0661213c5fad76bf366d4ef2757982a77f
child 342371 1cc7df5e6c7a9ced74b6e0a0bca60fdc10a3655d
push id13415
push userbballo@mozilla.com
push dateSat, 19 Mar 2016 01:24:56 +0000
reviewersdholbert
bugs1219296
milestone48.0a1
Bug 1219296 - Add IPC support for nsStyleCoord and nsStyleCoord::CalcValue. r=dholbert MozReview-Commit-ID: 61gzOqI3tji
gfx/ipc/GfxMessageUtils.h
layout/style/nsStyleCoord.h
--- a/gfx/ipc/GfxMessageUtils.h
+++ b/gfx/ipc/GfxMessageUtils.h
@@ -767,16 +767,134 @@ struct ParamTraits<mozilla::layers::Fram
             ReadBoolForBitfield(aMsg, aIter, aResult, &paramType::SetAllowVerticalScrollWithWheel) &&
             ReadBoolForBitfield(aMsg, aIter, aResult, &paramType::SetIsLayersIdRoot) &&
             ReadBoolForBitfield(aMsg, aIter, aResult, &paramType::SetUsesContainerScrolling) &&
             ReadBoolForBitfield(aMsg, aIter, aResult, &paramType::SetIsScrollInfoLayer));
   }
 };
 
 template <>
+struct ParamTraits<nsStyleCoord::CalcValue>
+{
+  typedef nsStyleCoord::CalcValue paramType;
+
+  static void Write(Message* aMsg, const paramType& aParam)
+  {
+    WriteParam(aMsg, aParam.mLength);
+    WriteParam(aMsg, aParam.mHasPercent);
+    if (aParam.mHasPercent) {
+      WriteParam(aMsg, aParam.mPercent);
+    }
+  }
+
+  static bool Read(const Message* aMsg, void** aIter, paramType* aResult)
+  {
+    return (ReadParam(aMsg, aIter, &aResult->mLength) &&
+            ReadParam(aMsg, aIter, &aResult->mHasPercent) &&
+            (aResult->mHasPercent ? ReadParam(aMsg, aIter, &aResult->mPercent) : true));
+  }
+};
+
+template <>
+struct ParamTraits<nsStyleUnit>
+  : public ContiguousEnumSerializer<
+             nsStyleUnit,
+             eStyleUnit_Null,
+             eStyleUnit_MAX>
+{};
+
+template <>
+struct ParamTraits<nsStyleCoord>
+{
+  typedef nsStyleCoord paramType;
+
+  static void Write(Message* aMsg, const paramType& aParam)
+  {
+    WriteParam(aMsg, aParam.GetUnit());
+    switch (aParam.GetUnit()) {
+    case eStyleUnit_Null:
+    case eStyleUnit_Normal:
+    case eStyleUnit_Auto:
+    case eStyleUnit_None:
+      break;
+    case eStyleUnit_Percent:
+    case eStyleUnit_Factor:
+    case eStyleUnit_Degree:
+    case eStyleUnit_Grad:
+    case eStyleUnit_Radian:
+    case eStyleUnit_Turn:
+    case eStyleUnit_FlexFraction:
+      WriteParam(aMsg, aParam.mValue.mFloat);
+      break;
+    case eStyleUnit_Coord:
+    case eStyleUnit_Integer:
+    case eStyleUnit_Enumerated:
+      WriteParam(aMsg, aParam.mValue.mInt);
+      break;
+    case eStyleUnit_Calc:
+      WriteParam(aMsg, *static_cast<nsStyleCoord::CalcValue*>(aParam.GetCalcValue()));
+      break;
+    }
+  }
+
+  static bool Read(const Message* aMsg, void** aIter, paramType* aResult)
+  {
+    nsStyleUnit unit;
+    if (!ReadParam(aMsg, aIter, &unit)) {
+      return false;
+    }
+    switch (unit) {
+    case eStyleUnit_Null:
+    case eStyleUnit_Normal:
+    case eStyleUnit_Auto:
+    case eStyleUnit_None:
+      *aResult = nsStyleCoord(unit);
+      return true;
+    case eStyleUnit_Percent:
+    case eStyleUnit_Factor:
+    case eStyleUnit_Degree:
+    case eStyleUnit_Grad:
+    case eStyleUnit_Radian:
+    case eStyleUnit_Turn:
+    case eStyleUnit_FlexFraction:
+    {
+      nsStyleUnion value;
+      if (!ReadParam(aMsg, aIter, &value.mFloat)) {
+        return false;
+      }
+      *aResult = nsStyleCoord(value, unit);
+      return true;
+    }
+    case eStyleUnit_Coord:
+    case eStyleUnit_Integer:
+    case eStyleUnit_Enumerated:
+    {
+      nsStyleUnion value;
+      if (!ReadParam(aMsg, aIter, &value.mInt)) {
+        return false;
+      }
+      *aResult = nsStyleCoord(value, unit);
+      return true;
+    }
+    case eStyleUnit_Calc:
+    {
+      nsStyleCoord::Calc* calc = new nsStyleCoord::Calc;
+      if (!ReadParam(aMsg, aIter, static_cast<nsStyleCoord::CalcValue*>(calc))) {
+        return false;
+      }
+      aResult->SetCalcValue(calc);
+      return true;
+    }
+    }
+    MOZ_ASSERT_UNREACHABLE("All valid switch cases return");
+    return false;
+  }
+};
+
+template <>
 struct ParamTraits<mozilla::layers::ScrollMetadata>
 {
   typedef mozilla::layers::ScrollMetadata paramType;
 
   static void Write(Message* aMsg, const paramType& aParam)
   {
     WriteParam(aMsg, aParam.mMetrics);
     WriteParam(aMsg, aParam.mMaskLayerIndex);
--- a/layout/style/nsStyleCoord.h
+++ b/layout/style/nsStyleCoord.h
@@ -6,16 +6,20 @@
 /* representation of length values in computed style data */
 
 #ifndef nsStyleCoord_h___
 #define nsStyleCoord_h___
 
 #include "nsCoord.h"
 #include "nsStyleConsts.h"
 
+namespace IPC {
+template <typename T> struct ParamTraits;
+}
+
 namespace mozilla {
 
 class WritingMode;
 
 // Logical axis, edge and side constants for use in various places.
 enum LogicalAxis {
   eLogicalAxisBlock  = 0x0,
   eLogicalAxisInline = 0x1
@@ -68,16 +72,17 @@ typedef union {
  * Class that hold a single size specification used by the style
  * system.  The size specification consists of two parts -- a number
  * and a unit.  The number is an integer, a floating point value, an
  * nscoord, or undefined, and the unit is an nsStyleUnit.  Checking
  * the unit is a must before asking for the value in any particular
  * form.
  */
 class nsStyleCoord {
+  friend struct IPC::ParamTraits<nsStyleCoord>;
 public:
   // Non-reference counted calc() value.  See nsStyleStruct.h for some uses
   // of this.
   struct CalcValue {
     // Every calc() expression evaluates to a length plus a percentage.
     nscoord mLength;
     float mPercent;
     bool mHasPercent; // whether there was any % syntax, even if 0