diff options
Diffstat (limited to 'Source/WebCore/css/CSSCalculationValue.h')
-rw-r--r-- | Source/WebCore/css/CSSCalculationValue.h | 61 |
1 files changed, 47 insertions, 14 deletions
diff --git a/Source/WebCore/css/CSSCalculationValue.h b/Source/WebCore/css/CSSCalculationValue.h index 266e8f76c..27ff176f1 100644 --- a/Source/WebCore/css/CSSCalculationValue.h +++ b/Source/WebCore/css/CSSCalculationValue.h @@ -32,6 +32,7 @@ #define CSSCalculationValue_h #include "CSSParserValues.h" +#include "CSSPrimitiveValue.h" #include "CSSValue.h" #include "CalculationValue.h" #include <wtf/PassOwnPtr.h> @@ -42,9 +43,10 @@ namespace WebCore { class CSSParserValueList; class CSSValueList; -class RenderStyle; class CalculationValue; class CalcExpressionNode; +class RenderStyle; +struct Length; enum CalculationCategory { CalcNumber = 0, @@ -52,12 +54,15 @@ enum CalculationCategory { CalcPercent, CalcPercentNumber, CalcPercentLength, + CalcAngle, + CalcTime, + CalcFrequency, #if ENABLE(CSS_VARIABLES) CalcVariable, #endif CalcOther }; - + class CSSCalcExpressionNode : public RefCounted<CSSCalcExpressionNode> { public: enum Type { @@ -67,7 +72,7 @@ public: virtual ~CSSCalcExpressionNode() = 0; virtual bool isZero() const = 0; - virtual PassOwnPtr<CalcExpressionNode> toCalcValue(const RenderStyle*, const RenderStyle* rootStyle, double zoom = 1.0) const = 0; + virtual PassOwnPtr<CalcExpressionNode> toCalcValue(const RenderStyle*, const RenderStyle* rootStyle, double zoom = 1.0) const = 0; virtual double doubleValue() const = 0; virtual double computeLengthPx(const RenderStyle* currentStyle, const RenderStyle* rootStyle, double multiplier = 1.0, bool computingFontSize = false) const = 0; virtual String customCssText() const = 0; @@ -78,56 +83,84 @@ public: virtual bool equals(const CSSCalcExpressionNode& other) const { return m_category == other.m_category && m_isInteger == other.m_isInteger; } virtual Type type() const = 0; - CalculationCategory category() const { return m_category; } + CalculationCategory category() const { return m_category; } + virtual CSSPrimitiveValue::UnitTypes primitiveType() const = 0; bool isInteger() const { return m_isInteger; } - + protected: CSSCalcExpressionNode(CalculationCategory category, bool isInteger) : m_category(category) , m_isInteger(isInteger) { } - + CalculationCategory m_category; bool m_isInteger; }; - + class CSSCalcValue : public CSSValue { public: static PassRefPtr<CSSCalcValue> create(CSSParserString name, CSSParserValueList*, CalculationPermittedValueRange); - static PassRefPtr<CSSCalcValue> create(CalculationValue*); + static PassRefPtr<CSSCalcValue> create(PassRefPtr<CSSCalcExpressionNode>, CalculationPermittedValueRange = CalculationRangeAll); + static PassRefPtr<CSSCalcValue> create(const CalculationValue* value, const RenderStyle* style) { return adoptRef(new CSSCalcValue(value, style)); } + + static PassRefPtr<CSSCalcExpressionNode> createExpressionNode(PassRefPtr<CSSPrimitiveValue>, bool isInteger = false); + static PassRefPtr<CSSCalcExpressionNode> createExpressionNode(PassRefPtr<CSSCalcExpressionNode>, PassRefPtr<CSSCalcExpressionNode>, CalcOperator); + static PassRefPtr<CSSCalcExpressionNode> createExpressionNode(const CalcExpressionNode*, const RenderStyle*); + static PassRefPtr<CSSCalcExpressionNode> createExpressionNode(const Length&, const RenderStyle*); PassRefPtr<CalculationValue> toCalcValue(const RenderStyle* style, const RenderStyle* rootStyle, double zoom = 1.0) const { return CalculationValue::create(m_expression->toCalcValue(style, rootStyle, zoom), m_nonNegative ? CalculationRangeNonNegative : CalculationRangeAll); } CalculationCategory category() const { return m_expression->category(); } - bool isInt() const { return m_expression->isInteger(); } + bool isInt() const { return m_expression->isInteger(); } double doubleValue() const; bool isNegative() const { return m_expression->doubleValue() < 0; } + CalculationPermittedValueRange permittedValueRange() { return m_nonNegative ? CalculationRangeNonNegative : CalculationRangeAll; } double computeLengthPx(const RenderStyle* currentStyle, const RenderStyle* rootStyle, double multiplier = 1.0, bool computingFontSize = false) const; - + + CSSCalcExpressionNode* expressionNode() const { return m_expression.get(); } + String customCssText() const; bool equals(const CSSCalcValue&) const; #if ENABLE(CSS_VARIABLES) String customSerializeResolvingVariables(const HashMap<AtomicString, String>&) const; bool hasVariableReference() const; #endif - -private: + +private: CSSCalcValue(PassRefPtr<CSSCalcExpressionNode> expression, CalculationPermittedValueRange range) : CSSValue(CalculationClass) , m_expression(expression) , m_nonNegative(range == CalculationRangeNonNegative) { } - + CSSCalcValue(const CalculationValue* value, const RenderStyle* style) + : CSSValue(CalculationClass) + , m_expression(createExpressionNode(value->expression(), style)) + , m_nonNegative(value->isNonNegative()) + { + } + double clampToPermittedRange(double) const; const RefPtr<CSSCalcExpressionNode> m_expression; const bool m_nonNegative; }; - + +inline CSSCalcValue* toCSSCalcValue(CSSValue* value) +{ + ASSERT_WITH_SECURITY_IMPLICATION(!value || value->isCalculationValue()); + return static_cast<CSSCalcValue*>(value); +} + +inline const CSSCalcValue* toCSSCalcValue(const CSSValue* value) +{ + ASSERT_WITH_SECURITY_IMPLICATION(!value || value->isCalculationValue()); + return static_cast<const CSSCalcValue*>(value); +} + } // namespace WebCore #endif // CSSCalculationValue_h |