Commit bf7694ac authored by eseidel@chromium.org's avatar eseidel@chromium.org

Remove mutation foot-gun from CSSPrimitiveValue

Misuse of this method could easily cause
memory leaks and UAFs. It wasn't actually doing anything
in the one place it was called, so I removed it.

I also fixed another FIXME about how unsigned/signed
constructors are confusing.  At least now we'll ASSERT
if you got the wrong one.

Review URL: https://codereview.chromium.org/209353004

git-svn-id: svn://svn.chromium.org/blink/trunk@170029 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 3dab5c1b
...@@ -87,14 +87,10 @@ PassRefPtrWillBeRawPtr<CSSValue> CSSParserValue::createCSSValue() ...@@ -87,14 +87,10 @@ PassRefPtrWillBeRawPtr<CSSValue> CSSParserValue::createCSSValue()
if (id) if (id)
return CSSPrimitiveValue::createIdentifier(id); return CSSPrimitiveValue::createIdentifier(id);
if (unit == CSSParserValue::Operator) { if (unit == CSSParserValue::Operator)
RefPtrWillBeRawPtr<CSSPrimitiveValue> primitiveValue = CSSPrimitiveValue::createParserOperator(iValue); return CSSPrimitiveValue::createParserOperator(iValue);
primitiveValue->setPrimitiveType(CSSPrimitiveValue::CSS_PARSER_OPERATOR); if (unit == CSSParserValue::Function)
return primitiveValue;
}
if (unit == CSSParserValue::Function) {
return CSSFunctionValue::create(function); return CSSFunctionValue::create(function);
}
if (unit == CSSParserValue::ValueList) if (unit == CSSParserValue::ValueList)
return CSSValueList::createFromParserValueList(valueList); return CSSValueList::createFromParserValueList(valueList);
if (unit >= CSSParserValue::Q_EMS) if (unit >= CSSParserValue::Q_EMS)
...@@ -148,9 +144,9 @@ PassRefPtrWillBeRawPtr<CSSValue> CSSParserValue::createCSSValue() ...@@ -148,9 +144,9 @@ PassRefPtrWillBeRawPtr<CSSValue> CSSParserValue::createCSSValue()
case CSSPrimitiveValue::CSS_DPCM: case CSSPrimitiveValue::CSS_DPCM:
case CSSPrimitiveValue::CSS_PAIR: case CSSPrimitiveValue::CSS_PAIR:
case CSSPrimitiveValue::CSS_UNICODE_RANGE: case CSSPrimitiveValue::CSS_UNICODE_RANGE:
case CSSPrimitiveValue::CSS_PARSER_OPERATOR:
case CSSPrimitiveValue::CSS_PARSER_INTEGER: case CSSPrimitiveValue::CSS_PARSER_INTEGER:
case CSSPrimitiveValue::CSS_PARSER_IDENTIFIER: case CSSPrimitiveValue::CSS_PARSER_IDENTIFIER:
case CSSPrimitiveValue::CSS_PARSER_OPERATOR:
case CSSPrimitiveValue::CSS_COUNTER_NAME: case CSSPrimitiveValue::CSS_COUNTER_NAME:
case CSSPrimitiveValue::CSS_SHAPE: case CSSPrimitiveValue::CSS_SHAPE:
case CSSPrimitiveValue::CSS_QUAD: case CSSPrimitiveValue::CSS_QUAD:
......
...@@ -268,9 +268,10 @@ CSSPrimitiveValue::CSSPrimitiveValue(CSSPropertyID propertyID) ...@@ -268,9 +268,10 @@ CSSPrimitiveValue::CSSPrimitiveValue(CSSPropertyID propertyID)
m_value.propertyID = propertyID; m_value.propertyID = propertyID;
} }
CSSPrimitiveValue::CSSPrimitiveValue(int parserOperator) CSSPrimitiveValue::CSSPrimitiveValue(int parserOperator, UnitTypes type)
: CSSValue(PrimitiveClass) : CSSValue(PrimitiveClass)
{ {
ASSERT(type == CSS_PARSER_OPERATOR);
m_primitiveUnitType = CSS_PARSER_OPERATOR; m_primitiveUnitType = CSS_PARSER_OPERATOR;
m_value.parserOperator = parserOperator; m_value.parserOperator = parserOperator;
} }
...@@ -297,9 +298,10 @@ CSSPrimitiveValue::CSSPrimitiveValue(const LengthSize& lengthSize) ...@@ -297,9 +298,10 @@ CSSPrimitiveValue::CSSPrimitiveValue(const LengthSize& lengthSize)
init(lengthSize); init(lengthSize);
} }
CSSPrimitiveValue::CSSPrimitiveValue(RGBA32 color) CSSPrimitiveValue::CSSPrimitiveValue(RGBA32 color, UnitTypes type)
: CSSValue(PrimitiveClass) : CSSValue(PrimitiveClass)
{ {
ASSERT(type == CSS_RGBCOLOR);
m_primitiveUnitType = CSS_RGBCOLOR; m_primitiveUnitType = CSS_RGBCOLOR;
m_value.rgbcolor = color; m_value.rgbcolor = color;
} }
......
...@@ -65,6 +65,10 @@ template<> inline float roundForImpreciseConversion(double value) ...@@ -65,6 +65,10 @@ template<> inline float roundForImpreciseConversion(double value)
return static_cast<float>(value); return static_cast<float>(value);
} }
// CSSPrimitiveValues are immutable. This class has manual ref-counting
// of unioned types and does not have the code necessary
// to handle any kind of mutations. All DOM-exposed "setters" just throw
// exceptions.
class CSSPrimitiveValue : public CSSValue { class CSSPrimitiveValue : public CSSValue {
public: public:
enum UnitTypes { enum UnitTypes {
...@@ -209,11 +213,11 @@ public: ...@@ -209,11 +213,11 @@ public:
} }
static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> createParserOperator(int parserOperator) static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> createParserOperator(int parserOperator)
{ {
return adoptRefWillBeRefCountedGarbageCollected(new CSSPrimitiveValue(parserOperator)); return adoptRefWillBeRefCountedGarbageCollected(new CSSPrimitiveValue(parserOperator, CSS_PARSER_OPERATOR));
} }
static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> createColor(unsigned rgbValue) static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> createColor(unsigned rgbValue)
{ {
return adoptRefWillBeRefCountedGarbageCollected(new CSSPrimitiveValue(rgbValue)); return adoptRefWillBeRefCountedGarbageCollected(new CSSPrimitiveValue(rgbValue, CSS_RGBCOLOR));
} }
static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> create(double value, UnitTypes type) static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> create(double value, UnitTypes type)
{ {
...@@ -284,9 +288,6 @@ public: ...@@ -284,9 +288,6 @@ public:
// Converts to a Length, mapping various unit types appropriately. // Converts to a Length, mapping various unit types appropriately.
template<int> Length convertToLength(const CSSToLengthConversionData&); template<int> Length convertToLength(const CSSToLengthConversionData&);
// use with care!!!
void setPrimitiveType(unsigned short type) { m_primitiveUnitType = type; }
double getDoubleValue(unsigned short unitType, ExceptionState&) const; double getDoubleValue(unsigned short unitType, ExceptionState&) const;
double getDoubleValue(unsigned short unitType) const; double getDoubleValue(unsigned short unitType) const;
double getDoubleValue() const; double getDoubleValue() const;
...@@ -349,9 +350,9 @@ public: ...@@ -349,9 +350,9 @@ public:
private: private:
CSSPrimitiveValue(CSSValueID); CSSPrimitiveValue(CSSValueID);
CSSPrimitiveValue(CSSPropertyID); CSSPrimitiveValue(CSSPropertyID);
// FIXME: int vs. unsigned overloading is too subtle to distinguish the color and operator cases. // int vs. unsigned is too subtle to distinguish types, so require a UnitType.
CSSPrimitiveValue(int parserOperator); CSSPrimitiveValue(int parserOperator, UnitTypes);
CSSPrimitiveValue(unsigned color); // RGB value CSSPrimitiveValue(unsigned color, UnitTypes); // RGB value
CSSPrimitiveValue(const Length& length) CSSPrimitiveValue(const Length& length)
: CSSValue(PrimitiveClass) : CSSValue(PrimitiveClass)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment