diff options
author | Simon Hausmann <simon.hausmann@nokia.com> | 2012-09-10 19:10:20 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2012-09-10 19:10:20 +0200 |
commit | 284837daa07b29d6a63a748544a90b1f5842ac5c (patch) | |
tree | ecd258180bde91fe741e0cfd2638beb3c6da7e8e /Source/WebCore/css/CSSCalculationValue.cpp | |
parent | 2e2ba8ff45915f40ed3e014101269c175f2a89a0 (diff) | |
download | qtwebkit-284837daa07b29d6a63a748544a90b1f5842ac5c.tar.gz |
Imported WebKit commit 68645295d2e3e09af2c942f092556f06aa5f8b0d (http://svn.webkit.org/repository/webkit/trunk@128073)
New snapshot
Diffstat (limited to 'Source/WebCore/css/CSSCalculationValue.cpp')
-rwxr-xr-x | Source/WebCore/css/CSSCalculationValue.cpp | 149 |
1 files changed, 107 insertions, 42 deletions
diff --git a/Source/WebCore/css/CSSCalculationValue.cpp b/Source/WebCore/css/CSSCalculationValue.cpp index 5a10c5985..76b8509f0 100755 --- a/Source/WebCore/css/CSSCalculationValue.cpp +++ b/Source/WebCore/css/CSSCalculationValue.cpp @@ -33,8 +33,8 @@ #include "CSSValueList.h" #include "Length.h" -#include "MemoryInstrumentation.h" #include "StyleResolver.h" +#include "WebCoreMemoryInstrumentation.h" #include <wtf/OwnPtr.h> #include <wtf/PassOwnPtr.h> @@ -68,17 +68,19 @@ static CalculationCategory unitCategory(CSSPrimitiveValue::UnitTypes type) case CSSPrimitiveValue::CSS_PC: case CSSPrimitiveValue::CSS_REMS: return CalcLength; +#if ENABLE(CSS_VARIABLES) + case CSSPrimitiveValue::CSS_VARIABLE_NAME: + return CalcVariable; +#endif default: return CalcOther; } } - -String CSSCalcValue::customCssText() const + +static String buildCssText(const String& expression) { StringBuilder result; - result.append("-webkit-calc"); - String expression = m_expression->customCssText(); bool expressionHasSingleTerm = expression[0] != '('; if (expressionHasSingleTerm) result.append('('); @@ -88,9 +90,26 @@ String CSSCalcValue::customCssText() const return result.toString(); } +String CSSCalcValue::customCssText() const +{ + return buildCssText(m_expression->customCssText()); +} + +#if ENABLE(CSS_VARIABLES) +String CSSCalcValue::customSerializeResolvingVariables(const HashMap<AtomicString, String>& variables) const +{ + return buildCssText(m_expression->serializeResolvingVariables(variables)); +} + +bool CSSCalcValue::hasVariableReference() const +{ + return m_expression->hasVariableReference(); +} +#endif + void CSSCalcValue::reportDescendantMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const { - MemoryClassInfo info(memoryObjectInfo, this, MemoryInstrumentation::CSS); + MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::CSS); } double CSSCalcValue::clampToPermittedRange(double value) const @@ -130,6 +149,18 @@ public: return m_value->cssText(); } +#if ENABLE(CSS_VARIABLES) + virtual String serializeResolvingVariables(const HashMap<AtomicString, String>& variables) const + { + return m_value->customSerializeResolvingVariables(variables); + } + + virtual bool hasVariableReference() const + { + return m_value->isVariableName(); + } +#endif + virtual PassOwnPtr<CalcExpressionNode> toCalcValue(RenderStyle* style, RenderStyle* rootStyle, double zoom) const { switch (m_category) { @@ -143,6 +174,9 @@ public: // Only types that could be part of a Length expression can be converted // to a CalcExpressionNode. CalcPercentNumber makes no sense as a Length. case CalcPercentNumber: +#if ENABLE(CSS_VARIABLES) + case CalcVariable: +#endif case CalcOther: ASSERT_NOT_REACHED(); } @@ -158,6 +192,9 @@ public: case CalcLength: case CalcPercentLength: case CalcPercentNumber: +#if ENABLE(CSS_VARIABLES) + case CalcVariable: +#endif case CalcOther: ASSERT_NOT_REACHED(); break; @@ -175,6 +212,9 @@ public: return m_value->getDoubleValue(); case CalcPercentLength: case CalcPercentNumber: +#if ENABLE(CSS_VARIABLES) + case CalcVariable: +#endif case CalcOther: ASSERT_NOT_REACHED(); break; @@ -184,14 +224,14 @@ public: virtual void reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const OVERRIDE { - MemoryClassInfo info(memoryObjectInfo, this, MemoryInstrumentation::CSS); + MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::CSS); info.addInstrumentedMember(m_value); } private: explicit CSSCalcPrimitiveValue(CSSPrimitiveValue* value, bool isInteger) : CSSCalcExpressionNode(unitCategory((CSSPrimitiveValue::UnitTypes)value->primitiveType()), isInteger) - , m_value(value) + , m_value(value) { } @@ -205,42 +245,50 @@ static const CalculationCategory addSubtractResult[CalcOther][CalcOther] = { { CalcPercentNumber, CalcOther, CalcPercentNumber, CalcPercentNumber, CalcOther }, { CalcOther, CalcPercentLength, CalcPercentLength, CalcOther, CalcPercentLength }, }; + +static CalculationCategory determineCategory(const CSSCalcExpressionNode& leftSide, const CSSCalcExpressionNode& rightSide, CalcOperator op) +{ + CalculationCategory leftCategory = leftSide.category(); + CalculationCategory rightCategory = rightSide.category(); + + if (leftCategory == CalcOther || rightCategory == CalcOther) + return CalcOther; + +#if ENABLE(CSS_VARIABLES) + if (leftCategory == CalcVariable || rightCategory == CalcVariable) + return CalcVariable; +#endif + + switch (op) { + case CalcAdd: + case CalcSubtract: + return addSubtractResult[leftCategory][rightCategory]; + case CalcMultiply: + if (leftCategory != CalcNumber && rightCategory != CalcNumber) + return CalcOther; + return leftCategory == CalcNumber ? rightCategory : leftCategory; + case CalcDivide: + if (rightCategory != CalcNumber || rightSide.isZero()) + return CalcOther; + return leftCategory; + } + ASSERT_NOT_REACHED(); + return CalcOther; +} + class CSSCalcBinaryOperation : public CSSCalcExpressionNode { + public: static PassRefPtr<CSSCalcBinaryOperation> create(PassRefPtr<CSSCalcExpressionNode> leftSide, PassRefPtr<CSSCalcExpressionNode> rightSide, CalcOperator op) { - CalculationCategory leftCategory = leftSide->category(); - CalculationCategory rightCategory = rightSide->category(); - CalculationCategory newCategory = CalcOther; - - ASSERT(leftCategory != CalcOther && rightCategory != CalcOther); - - switch (op) { - case CalcAdd: - case CalcSubtract: - if (leftCategory == CalcOther || rightCategory == CalcOther) - return 0; - newCategory = addSubtractResult[leftCategory][rightCategory]; - break; - - case CalcMultiply: - if (leftCategory != CalcNumber && rightCategory != CalcNumber) - return 0; - - newCategory = leftCategory == CalcNumber ? rightCategory : leftCategory; - break; - - case CalcDivide: - if (rightCategory != CalcNumber || rightSide->isZero()) - return 0; - newCategory = leftCategory; - break; - } + ASSERT(leftSide->category() != CalcOther && rightSide->category() != CalcOther); + CalculationCategory newCategory = determineCategory(*leftSide, *rightSide, op); + if (newCategory == CalcOther) return 0; - + return adoptRef(new CSSCalcBinaryOperation(leftSide, rightSide, op, newCategory)); } @@ -274,24 +322,41 @@ public: virtual void reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const OVERRIDE { - MemoryClassInfo info(memoryObjectInfo, this, MemoryInstrumentation::CSS); + MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::CSS); info.addInstrumentedMember(m_leftSide); info.addInstrumentedMember(m_rightSide); } - virtual String customCssText() const + static String buildCssText(const String& leftExpression, const String& rightExpression, CalcOperator op) { StringBuilder result; result.append('('); - result.append(m_leftSide->customCssText()); + result.append(leftExpression); result.append(' '); - result.append(static_cast<char>(m_operator)); + result.append(static_cast<char>(op)); result.append(' '); - result.append(m_rightSide->customCssText()); + result.append(rightExpression); result.append(')'); - return result.toString(); + return result.toString(); + } + + virtual String customCssText() const + { + return buildCssText(m_leftSide->customCssText(), m_rightSide->customCssText(), m_operator); + } + +#if ENABLE(CSS_VARIABLES) + virtual String serializeResolvingVariables(const HashMap<AtomicString, String>& variables) const + { + return buildCssText(m_leftSide->serializeResolvingVariables(variables), m_rightSide->serializeResolvingVariables(variables), m_operator); + } + + virtual bool hasVariableReference() const + { + return m_leftSide->hasVariableReference() || m_rightSide->hasVariableReference(); } +#endif private: CSSCalcBinaryOperation(PassRefPtr<CSSCalcExpressionNode> leftSide, PassRefPtr<CSSCalcExpressionNode> rightSide, CalcOperator op, CalculationCategory category) |