PassRefPtr<CSSValue> CSSValue::cloneForCSSOM() const { switch (classType()) { case PrimitiveClass: return toCSSPrimitiveValue(this)->cloneForCSSOM(); case ValueListClass: return toCSSValueList(this)->cloneForCSSOM(); case ImageClass: case CursorImageClass: return toCSSImageValue(this)->cloneForCSSOM(); #if ENABLE(CSS_FILTERS) case WebKitCSSFilterClass: return toWebKitCSSFilterValue(this)->cloneForCSSOM(); #endif case WebKitCSSTransformClass: return toWebKitCSSTransformValue(this)->cloneForCSSOM(); #if ENABLE(CSS_IMAGE_SET) case ImageSetClass: return toCSSImageSetValue(this)->cloneForCSSOM(); #endif #if ENABLE(SVG) case SVGColorClass: return toSVGColor(this)->cloneForCSSOM(); case SVGPaintClass: return toSVGPaint(this)->cloneForCSSOM(); #endif default: ASSERT(!isSubtypeExposedToCSSOM()); return TextCloneCSSValue::create(classType(), cssText()); } }
void CSSValue::destroy() { if (m_isTextClone) { ASSERT(isCSSOMSafe()); delete static_cast<TextCloneCSSValue*>(this); return; } ASSERT(!isCSSOMSafe() || isSubtypeExposedToCSSOM()); switch (classType()) { case AspectRatioClass: delete static_cast<CSSAspectRatioValue*>(this); return; case BorderImageSliceClass: delete static_cast<CSSBorderImageSliceValue*>(this); return; case CanvasClass: delete static_cast<CSSCanvasValue*>(this); return; case CursorImageClass: delete static_cast<CSSCursorImageValue*>(this); return; case FontClass: delete static_cast<FontValue*>(this); return; case FontFaceSrcClass: delete static_cast<CSSFontFaceSrcValue*>(this); return; case FontFeatureClass: delete static_cast<FontFeatureValue*>(this); return; case FunctionClass: delete static_cast<CSSFunctionValue*>(this); return; case LinearGradientClass: delete static_cast<CSSLinearGradientValue*>(this); return; case RadialGradientClass: delete static_cast<CSSRadialGradientValue*>(this); return; case CrossfadeClass: delete static_cast<CSSCrossfadeValue*>(this); return; case ImageClass: delete static_cast<CSSImageValue*>(this); return; case InheritedClass: delete static_cast<CSSInheritedValue*>(this); return; case InitialClass: delete static_cast<CSSInitialValue*>(this); return; case PrimitiveClass: delete static_cast<CSSPrimitiveValue*>(this); return; case ReflectClass: delete toCSSReflectValue(this); return; case ShadowClass: delete static_cast<ShadowValue*>(this); return; case CubicBezierTimingFunctionClass: delete static_cast<CSSCubicBezierTimingFunctionValue*>(this); return; case StepsTimingFunctionClass: delete static_cast<CSSStepsTimingFunctionValue*>(this); return; case UnicodeRangeClass: delete static_cast<CSSUnicodeRangeValue*>(this); return; case ValueListClass: delete static_cast<CSSValueList*>(this); return; case WebKitCSSTransformClass: delete toWebKitCSSTransformValue(this); return; case LineBoxContainClass: delete static_cast<CSSLineBoxContainValue*>(this); return; case CalculationClass: delete static_cast<CSSCalcValue*>(this); return; #if ENABLE(CSS_IMAGE_SET) case ImageSetClass: delete toCSSImageSetValue(this); return; #endif #if ENABLE(CSS_FILTERS) case FilterImageClass: delete static_cast<CSSFilterImageValue*>(this); return; case WebKitCSSFilterClass: delete toWebKitCSSFilterValue(this); return; #if ENABLE(CSS_SHADERS) case WebKitCSSArrayFunctionValueClass: delete toWebKitCSSArrayFunctionValue(this); return; case WebKitCSSMatFunctionValueClass: delete toWebKitCSSMatFunctionValue(this); return; case WebKitCSSMixFunctionValueClass: delete toWebKitCSSMixFunctionValue(this); return; case WebKitCSSShaderClass: delete static_cast<WebKitCSSShaderValue*>(this); return; #endif #endif #if ENABLE(CSS_VARIABLES) case VariableClass: delete static_cast<CSSVariableValue*>(this); return; #endif #if ENABLE(SVG) case SVGColorClass: delete static_cast<SVGColor*>(this); return; case SVGPaintClass: delete static_cast<SVGPaint*>(this); return; case WebKitCSSSVGDocumentClass: delete toWebKitCSSSVGDocumentValue(this); return; #endif } ASSERT_NOT_REACHED(); }
bool transformsForValue(const RenderStyle* style, const RenderStyle* rootStyle, CSSValue* value, TransformOperations& outOperations) { if (!value || !value->isValueList()) { outOperations.clear(); return false; } float zoomFactor = style ? style->effectiveZoom() : 1; TransformOperations operations; for (CSSValueListIterator i = value; i.hasMore(); i.advance()) { CSSValue* currValue = i.value(); if (!currValue->isWebKitCSSTransformValue()) continue; WebKitCSSTransformValue* transformValue = toWebKitCSSTransformValue(i.value()); if (!transformValue->length()) continue; bool haveNonPrimitiveValue = false; for (unsigned j = 0; j < transformValue->length(); ++j) { if (!transformValue->itemWithoutBoundsCheck(j)->isPrimitiveValue()) { haveNonPrimitiveValue = true; break; } } if (haveNonPrimitiveValue) continue; CSSPrimitiveValue* firstValue = toCSSPrimitiveValue(transformValue->itemWithoutBoundsCheck(0)); switch (transformValue->operationType()) { case WebKitCSSTransformValue::ScaleTransformOperation: case WebKitCSSTransformValue::ScaleXTransformOperation: case WebKitCSSTransformValue::ScaleYTransformOperation: { double sx = 1.0; double sy = 1.0; if (transformValue->operationType() == WebKitCSSTransformValue::ScaleYTransformOperation) sy = firstValue->getDoubleValue(); else { sx = firstValue->getDoubleValue(); if (transformValue->operationType() != WebKitCSSTransformValue::ScaleXTransformOperation) { if (transformValue->length() > 1) { CSSPrimitiveValue* secondValue = toCSSPrimitiveValue(transformValue->itemWithoutBoundsCheck(1)); sy = secondValue->getDoubleValue(); } else sy = sx; } } operations.operations().append(ScaleTransformOperation::create(sx, sy, 1.0, transformOperationType(transformValue->operationType()))); break; } case WebKitCSSTransformValue::ScaleZTransformOperation: case WebKitCSSTransformValue::Scale3DTransformOperation: { double sx = 1.0; double sy = 1.0; double sz = 1.0; if (transformValue->operationType() == WebKitCSSTransformValue::ScaleZTransformOperation) sz = firstValue->getDoubleValue(); else if (transformValue->operationType() == WebKitCSSTransformValue::ScaleYTransformOperation) sy = firstValue->getDoubleValue(); else { sx = firstValue->getDoubleValue(); if (transformValue->operationType() != WebKitCSSTransformValue::ScaleXTransformOperation) { if (transformValue->length() > 2) { CSSPrimitiveValue* thirdValue = toCSSPrimitiveValue(transformValue->itemWithoutBoundsCheck(2)); sz = thirdValue->getDoubleValue(); } if (transformValue->length() > 1) { CSSPrimitiveValue* secondValue = toCSSPrimitiveValue(transformValue->itemWithoutBoundsCheck(1)); sy = secondValue->getDoubleValue(); } else sy = sx; } } operations.operations().append(ScaleTransformOperation::create(sx, sy, sz, transformOperationType(transformValue->operationType()))); break; } case WebKitCSSTransformValue::TranslateTransformOperation: case WebKitCSSTransformValue::TranslateXTransformOperation: case WebKitCSSTransformValue::TranslateYTransformOperation: { Length tx = Length(0, Fixed); Length ty = Length(0, Fixed); if (transformValue->operationType() == WebKitCSSTransformValue::TranslateYTransformOperation) ty = convertToFloatLength(firstValue, style, rootStyle, zoomFactor); else { tx = convertToFloatLength(firstValue, style, rootStyle, zoomFactor); if (transformValue->operationType() != WebKitCSSTransformValue::TranslateXTransformOperation) { if (transformValue->length() > 1) { CSSPrimitiveValue* secondValue = toCSSPrimitiveValue(transformValue->itemWithoutBoundsCheck(1)); ty = convertToFloatLength(secondValue, style, rootStyle, zoomFactor); } } } if (tx.isUndefined() || ty.isUndefined()) return false; operations.operations().append(TranslateTransformOperation::create(tx, ty, Length(0, Fixed), transformOperationType(transformValue->operationType()))); break; } case WebKitCSSTransformValue::TranslateZTransformOperation: case WebKitCSSTransformValue::Translate3DTransformOperation: { Length tx = Length(0, Fixed); Length ty = Length(0, Fixed); Length tz = Length(0, Fixed); if (transformValue->operationType() == WebKitCSSTransformValue::TranslateZTransformOperation) tz = convertToFloatLength(firstValue, style, rootStyle, zoomFactor); else if (transformValue->operationType() == WebKitCSSTransformValue::TranslateYTransformOperation) ty = convertToFloatLength(firstValue, style, rootStyle, zoomFactor); else { tx = convertToFloatLength(firstValue, style, rootStyle, zoomFactor); if (transformValue->operationType() != WebKitCSSTransformValue::TranslateXTransformOperation) { if (transformValue->length() > 2) { CSSPrimitiveValue* thirdValue = toCSSPrimitiveValue(transformValue->itemWithoutBoundsCheck(2)); tz = convertToFloatLength(thirdValue, style, rootStyle, zoomFactor); } if (transformValue->length() > 1) { CSSPrimitiveValue* secondValue = toCSSPrimitiveValue(transformValue->itemWithoutBoundsCheck(1)); ty = convertToFloatLength(secondValue, style, rootStyle, zoomFactor); } } } if (tx.isUndefined() || ty.isUndefined() || tz.isUndefined()) return false; operations.operations().append(TranslateTransformOperation::create(tx, ty, tz, transformOperationType(transformValue->operationType()))); break; } case WebKitCSSTransformValue::RotateTransformOperation: { double angle = firstValue->computeDegrees(); operations.operations().append(RotateTransformOperation::create(0, 0, 1, angle, transformOperationType(transformValue->operationType()))); break; } case WebKitCSSTransformValue::RotateXTransformOperation: case WebKitCSSTransformValue::RotateYTransformOperation: case WebKitCSSTransformValue::RotateZTransformOperation: { double x = 0; double y = 0; double z = 0; double angle = firstValue->computeDegrees(); if (transformValue->operationType() == WebKitCSSTransformValue::RotateXTransformOperation) x = 1; else if (transformValue->operationType() == WebKitCSSTransformValue::RotateYTransformOperation) y = 1; else z = 1; operations.operations().append(RotateTransformOperation::create(x, y, z, angle, transformOperationType(transformValue->operationType()))); break; } case WebKitCSSTransformValue::Rotate3DTransformOperation: { if (transformValue->length() < 4) break; CSSPrimitiveValue* secondValue = toCSSPrimitiveValue(transformValue->itemWithoutBoundsCheck(1)); CSSPrimitiveValue* thirdValue = toCSSPrimitiveValue(transformValue->itemWithoutBoundsCheck(2)); CSSPrimitiveValue* fourthValue = toCSSPrimitiveValue(transformValue->itemWithoutBoundsCheck(3)); double x = firstValue->getDoubleValue(); double y = secondValue->getDoubleValue(); double z = thirdValue->getDoubleValue(); double angle = fourthValue->computeDegrees(); operations.operations().append(RotateTransformOperation::create(x, y, z, angle, transformOperationType(transformValue->operationType()))); break; } case WebKitCSSTransformValue::SkewTransformOperation: case WebKitCSSTransformValue::SkewXTransformOperation: case WebKitCSSTransformValue::SkewYTransformOperation: { double angleX = 0; double angleY = 0; double angle = firstValue->computeDegrees(); if (transformValue->operationType() == WebKitCSSTransformValue::SkewYTransformOperation) angleY = angle; else { angleX = angle; if (transformValue->operationType() == WebKitCSSTransformValue::SkewTransformOperation) { if (transformValue->length() > 1) { CSSPrimitiveValue* secondValue = toCSSPrimitiveValue(transformValue->itemWithoutBoundsCheck(1)); angleY = secondValue->computeDegrees(); } } } operations.operations().append(SkewTransformOperation::create(angleX, angleY, transformOperationType(transformValue->operationType()))); break; } case WebKitCSSTransformValue::MatrixTransformOperation: { if (transformValue->length() < 6) break; double a = firstValue->getDoubleValue(); double b = toCSSPrimitiveValue(transformValue->itemWithoutBoundsCheck(1))->getDoubleValue(); double c = toCSSPrimitiveValue(transformValue->itemWithoutBoundsCheck(2))->getDoubleValue(); double d = toCSSPrimitiveValue(transformValue->itemWithoutBoundsCheck(3))->getDoubleValue(); double e = zoomFactor * toCSSPrimitiveValue(transformValue->itemWithoutBoundsCheck(4))->getDoubleValue(); double f = zoomFactor * toCSSPrimitiveValue(transformValue->itemWithoutBoundsCheck(5))->getDoubleValue(); operations.operations().append(MatrixTransformOperation::create(a, b, c, d, e, f)); break; } case WebKitCSSTransformValue::Matrix3DTransformOperation: { if (transformValue->length() < 16) break; TransformationMatrix matrix(toCSSPrimitiveValue(transformValue->itemWithoutBoundsCheck(0))->getDoubleValue(), toCSSPrimitiveValue(transformValue->itemWithoutBoundsCheck(1))->getDoubleValue(), toCSSPrimitiveValue(transformValue->itemWithoutBoundsCheck(2))->getDoubleValue(), toCSSPrimitiveValue(transformValue->itemWithoutBoundsCheck(3))->getDoubleValue(), toCSSPrimitiveValue(transformValue->itemWithoutBoundsCheck(4))->getDoubleValue(), toCSSPrimitiveValue(transformValue->itemWithoutBoundsCheck(5))->getDoubleValue(), toCSSPrimitiveValue(transformValue->itemWithoutBoundsCheck(6))->getDoubleValue(), toCSSPrimitiveValue(transformValue->itemWithoutBoundsCheck(7))->getDoubleValue(), toCSSPrimitiveValue(transformValue->itemWithoutBoundsCheck(8))->getDoubleValue(), toCSSPrimitiveValue(transformValue->itemWithoutBoundsCheck(9))->getDoubleValue(), toCSSPrimitiveValue(transformValue->itemWithoutBoundsCheck(10))->getDoubleValue(), toCSSPrimitiveValue(transformValue->itemWithoutBoundsCheck(11))->getDoubleValue(), zoomFactor * toCSSPrimitiveValue(transformValue->itemWithoutBoundsCheck(12))->getDoubleValue(), zoomFactor * toCSSPrimitiveValue(transformValue->itemWithoutBoundsCheck(13))->getDoubleValue(), toCSSPrimitiveValue(transformValue->itemWithoutBoundsCheck(14))->getDoubleValue(), toCSSPrimitiveValue(transformValue->itemWithoutBoundsCheck(15))->getDoubleValue()); operations.operations().append(Matrix3DTransformOperation::create(matrix)); break; } case WebKitCSSTransformValue::PerspectiveTransformOperation: { Length p = Length(0, Fixed); if (firstValue->isLength()) p = convertToFloatLength(firstValue, style, rootStyle, zoomFactor); else { // This is a quirk that should go away when 3d transforms are finalized. double val = firstValue->getDoubleValue(); p = val >= 0 ? Length(clampToPositiveInteger(val), Fixed) : Length(Undefined); } if (p.isUndefined()) return false; operations.operations().append(PerspectiveTransformOperation::create(p)); break; } case WebKitCSSTransformValue::UnknownTransformOperation: ASSERT_NOT_REACHED(); break; } } outOperations = operations; return true; }
String CSSValue::cssText() const { if (m_isTextClone) { ASSERT(isCSSOMSafe()); return static_cast<const TextCloneCSSValue*>(this)->cssText(); } ASSERT(!isCSSOMSafe() || isSubtypeExposedToCSSOM()); switch (classType()) { case AspectRatioClass: return toCSSAspectRatioValue(this)->customCSSText(); case BorderImageSliceClass: return toCSSBorderImageSliceValue(this)->customCSSText(); case CanvasClass: return toCSSCanvasValue(this)->customCSSText(); case CursorImageClass: return toCSSCursorImageValue(this)->customCSSText(); #if ENABLE(CSS_FILTERS) case FilterImageClass: return toCSSFilterImageValue(this)->customCSSText(); #endif case FontClass: return toCSSFontValue(this)->customCSSText(); case FontFaceSrcClass: return toCSSFontFaceSrcValue(this)->customCSSText(); case FontFeatureClass: return toCSSFontFeatureValue(this)->customCSSText(); case FunctionClass: return toCSSFunctionValue(this)->customCSSText(); case LinearGradientClass: return toCSSLinearGradientValue(this)->customCSSText(); case RadialGradientClass: return toCSSRadialGradientValue(this)->customCSSText(); case CrossfadeClass: return toCSSCrossfadeValue(this)->customCSSText(); case ImageClass: return toCSSImageValue(this)->customCSSText(); case InheritedClass: return toCSSInheritedValue(this)->customCSSText(); case InitialClass: return toCSSInitialValue(this)->customCSSText(); case GridTemplateClass: return toCSSGridTemplateValue(this)->customCSSText(); case PrimitiveClass: return toCSSPrimitiveValue(this)->customCSSText(); case ReflectClass: return toCSSReflectValue(this)->customCSSText(); case ShadowClass: return toCSSShadowValue(this)->customCSSText(); case CubicBezierTimingFunctionClass: return toCSSCubicBezierTimingFunctionValue(this)->customCSSText(); case StepsTimingFunctionClass: return toCSSStepsTimingFunctionValue(this)->customCSSText(); case UnicodeRangeClass: return toCSSUnicodeRangeValue(this)->customCSSText(); case ValueListClass: return toCSSValueList(this)->customCSSText(); case WebKitCSSTransformClass: return toWebKitCSSTransformValue(this)->customCSSText(); case LineBoxContainClass: return toCSSLineBoxContainValue(this)->customCSSText(); case CalculationClass: return toCSSCalcValue(this)->customCSSText(); #if ENABLE(CSS_IMAGE_SET) case ImageSetClass: return toCSSImageSetValue(this)->customCSSText(); #endif #if ENABLE(CSS_FILTERS) case WebKitCSSFilterClass: return toWebKitCSSFilterValue(this)->customCSSText(); #if ENABLE(CSS_SHADERS) case WebKitCSSArrayFunctionValueClass: return toWebKitCSSArrayFunctionValue(this)->customCSSText(); case WebKitCSSMatFunctionValueClass: return toWebKitCSSMatFunctionValue(this)->customCSSText(); case WebKitCSSMixFunctionValueClass: return toWebKitCSSMixFunctionValue(this)->customCSSText(); case WebKitCSSShaderClass: return toWebKitCSSShaderValue(this)->customCSSText(); #endif #endif #if ENABLE(SVG) case SVGColorClass: return toSVGColor(this)->customCSSText(); case SVGPaintClass: return toSVGPaint(this)->customCSSText(); case WebKitCSSSVGDocumentClass: return toWebKitCSSSVGDocumentValue(this)->customCSSText(); #endif } ASSERT_NOT_REACHED(); return String(); }