Bug 1219296 - Add IPC support for nsStyleCoord and nsStyleCoord::CalcValue. r=dholbert
MozReview-Commit-ID: 61gzOqI3tji
--- a/gfx/ipc/GfxMessageUtils.h
+++ b/gfx/ipc/GfxMessageUtils.h
@@ -767,16 +767,134 @@ struct ParamTraits<mozilla::layers::Fram
ReadBoolForBitfield(aMsg, aIter, aResult, ¶mType::SetAllowVerticalScrollWithWheel) &&
ReadBoolForBitfield(aMsg, aIter, aResult, ¶mType::SetIsLayersIdRoot) &&
ReadBoolForBitfield(aMsg, aIter, aResult, ¶mType::SetUsesContainerScrolling) &&
ReadBoolForBitfield(aMsg, aIter, aResult, ¶mType::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