/* * Copyright (C) 2004 Zack Rusin * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved. * Copyright (C) 2007 Alexey Proskuryakov * Copyright (C) 2007 Nicholas Shanks * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "config.h" #include "CSSComputedStyleDeclaration.h" #include "AnimationController.h" #include "CSSBorderImageValue.h" #include "CSSMutableStyleDeclaration.h" #include "CSSPrimitiveValue.h" #include "CSSPrimitiveValueMappings.h" #include "CSSProperty.h" #include "CSSPropertyNames.h" #include "CSSReflectValue.h" #include "CSSSelector.h" #include "CSSTimingFunctionValue.h" #include "CSSValueList.h" #include "Document.h" #include "ExceptionCode.h" #include "Rect.h" #include "RenderBox.h" #include "RenderLayer.h" #include "ShadowValue.h" #ifdef ANDROID_LAYOUT #include "Frame.h" #include "Settings.h" #endif #include "WebKitCSSTransformValue.h" #if ENABLE(DASHBOARD_SUPPORT) #include "DashboardRegion.h" #endif namespace WebCore { // List of all properties we know how to compute, omitting shorthands. static const int computedProperties[] = { CSSPropertyBackgroundAttachment, CSSPropertyBackgroundClip, CSSPropertyBackgroundColor, CSSPropertyBackgroundImage, CSSPropertyBackgroundOrigin, CSSPropertyBackgroundPosition, // more-specific background-position-x/y are non-standard CSSPropertyBackgroundRepeat, CSSPropertyBackgroundSize, CSSPropertyBorderBottomColor, CSSPropertyBorderBottomLeftRadius, CSSPropertyBorderBottomRightRadius, CSSPropertyBorderBottomStyle, CSSPropertyBorderBottomWidth, CSSPropertyBorderCollapse, CSSPropertyBorderLeftColor, CSSPropertyBorderLeftStyle, CSSPropertyBorderLeftWidth, CSSPropertyBorderRightColor, CSSPropertyBorderRightStyle, CSSPropertyBorderRightWidth, CSSPropertyBorderTopColor, CSSPropertyBorderTopLeftRadius, CSSPropertyBorderTopRightRadius, CSSPropertyBorderTopStyle, CSSPropertyBorderTopWidth, CSSPropertyBottom, CSSPropertyBoxSizing, CSSPropertyCaptionSide, CSSPropertyClear, CSSPropertyClip, CSSPropertyColor, CSSPropertyCursor, CSSPropertyDirection, CSSPropertyDisplay, CSSPropertyEmptyCells, CSSPropertyFloat, CSSPropertyFontFamily, CSSPropertyFontSize, CSSPropertyFontStyle, CSSPropertyFontVariant, CSSPropertyFontWeight, CSSPropertyHeight, CSSPropertyLeft, CSSPropertyLetterSpacing, CSSPropertyLineHeight, CSSPropertyListStyleImage, CSSPropertyListStylePosition, CSSPropertyListStyleType, CSSPropertyMarginBottom, CSSPropertyMarginLeft, CSSPropertyMarginRight, CSSPropertyMarginTop, CSSPropertyMaxHeight, CSSPropertyMaxWidth, CSSPropertyMinHeight, CSSPropertyMinWidth, CSSPropertyOpacity, CSSPropertyOrphans, CSSPropertyOutlineColor, CSSPropertyOutlineStyle, CSSPropertyOutlineWidth, CSSPropertyOverflowX, CSSPropertyOverflowY, CSSPropertyPaddingBottom, CSSPropertyPaddingLeft, CSSPropertyPaddingRight, CSSPropertyPaddingTop, CSSPropertyPageBreakAfter, CSSPropertyPageBreakBefore, CSSPropertyPageBreakInside, CSSPropertyPointerEvents, CSSPropertyPosition, CSSPropertyResize, CSSPropertyRight, CSSPropertySpeak, CSSPropertyTableLayout, CSSPropertyTextAlign, CSSPropertyTextDecoration, CSSPropertyTextIndent, CSSPropertyTextRendering, CSSPropertyTextShadow, CSSPropertyTextOverflow, CSSPropertyTextTransform, CSSPropertyTop, CSSPropertyUnicodeBidi, CSSPropertyVerticalAlign, CSSPropertyVisibility, CSSPropertyWhiteSpace, CSSPropertyWidows, CSSPropertyWidth, CSSPropertyWordBreak, CSSPropertyWordSpacing, CSSPropertyWordWrap, CSSPropertyZIndex, CSSPropertyZoom, CSSPropertyWebkitAnimationDelay, CSSPropertyWebkitAnimationDirection, CSSPropertyWebkitAnimationDuration, CSSPropertyWebkitAnimationFillMode, CSSPropertyWebkitAnimationIterationCount, CSSPropertyWebkitAnimationName, CSSPropertyWebkitAnimationPlayState, CSSPropertyWebkitAnimationTimingFunction, CSSPropertyWebkitAppearance, CSSPropertyWebkitBackfaceVisibility, CSSPropertyWebkitBackgroundClip, CSSPropertyWebkitBackgroundComposite, CSSPropertyWebkitBackgroundOrigin, CSSPropertyWebkitBackgroundSize, CSSPropertyWebkitBorderFit, CSSPropertyWebkitBorderHorizontalSpacing, CSSPropertyWebkitBorderImage, CSSPropertyWebkitBorderVerticalSpacing, CSSPropertyWebkitBoxAlign, CSSPropertyWebkitBoxDirection, CSSPropertyWebkitBoxFlex, CSSPropertyWebkitBoxFlexGroup, CSSPropertyWebkitBoxLines, CSSPropertyWebkitBoxOrdinalGroup, CSSPropertyWebkitBoxOrient, CSSPropertyWebkitBoxPack, CSSPropertyWebkitBoxReflect, CSSPropertyWebkitBoxShadow, CSSPropertyWebkitColorCorrection, CSSPropertyWebkitColumnBreakAfter, CSSPropertyWebkitColumnBreakBefore, CSSPropertyWebkitColumnBreakInside, CSSPropertyWebkitColumnCount, CSSPropertyWebkitColumnGap, CSSPropertyWebkitColumnRuleColor, CSSPropertyWebkitColumnRuleStyle, CSSPropertyWebkitColumnRuleWidth, CSSPropertyWebkitColumnSpan, CSSPropertyWebkitColumnWidth, #if ENABLE(DASHBOARD_SUPPORT) CSSPropertyWebkitDashboardRegion, #endif CSSPropertyWebkitFontSmoothing, CSSPropertyWebkitHighlight, CSSPropertyWebkitLineBreak, CSSPropertyWebkitLineClamp, CSSPropertyWebkitMarginBeforeCollapse, CSSPropertyWebkitMarginAfterCollapse, CSSPropertyWebkitMarqueeDirection, CSSPropertyWebkitMarqueeIncrement, CSSPropertyWebkitMarqueeRepetition, CSSPropertyWebkitMarqueeStyle, CSSPropertyWebkitMaskAttachment, CSSPropertyWebkitMaskBoxImage, CSSPropertyWebkitMaskClip, CSSPropertyWebkitMaskComposite, CSSPropertyWebkitMaskImage, CSSPropertyWebkitMaskOrigin, CSSPropertyWebkitMaskPosition, CSSPropertyWebkitMaskRepeat, CSSPropertyWebkitMaskSize, CSSPropertyWebkitNbspMode, CSSPropertyWebkitPerspective, CSSPropertyWebkitPerspectiveOrigin, CSSPropertyWebkitRtlOrdering, CSSPropertyWebkitTextCombine, CSSPropertyWebkitTextDecorationsInEffect, CSSPropertyWebkitTextFillColor, CSSPropertyWebkitTextSecurity, CSSPropertyWebkitTextStrokeColor, CSSPropertyWebkitTextStrokeWidth, CSSPropertyWebkitTransform, CSSPropertyWebkitTransformOrigin, CSSPropertyWebkitTransformStyle, CSSPropertyWebkitTransitionDelay, CSSPropertyWebkitTransitionDuration, CSSPropertyWebkitTransitionProperty, CSSPropertyWebkitTransitionTimingFunction, CSSPropertyWebkitUserDrag, CSSPropertyWebkitUserModify, CSSPropertyWebkitUserSelect, CSSPropertyWebkitWritingMode #if ENABLE(SVG) , CSSPropertyClipPath, CSSPropertyClipRule, CSSPropertyMask, CSSPropertyFilter, CSSPropertyFloodColor, CSSPropertyFloodOpacity, CSSPropertyLightingColor, CSSPropertyStopColor, CSSPropertyStopOpacity, CSSPropertyColorInterpolation, CSSPropertyColorInterpolationFilters, CSSPropertyColorRendering, CSSPropertyFill, CSSPropertyFillOpacity, CSSPropertyFillRule, CSSPropertyImageRendering, CSSPropertyMarkerEnd, CSSPropertyMarkerMid, CSSPropertyMarkerStart, CSSPropertyShapeRendering, CSSPropertyStroke, CSSPropertyStrokeDasharray, CSSPropertyStrokeDashoffset, CSSPropertyStrokeLinecap, CSSPropertyStrokeLinejoin, CSSPropertyStrokeMiterlimit, CSSPropertyStrokeOpacity, CSSPropertyStrokeWidth, CSSPropertyAlignmentBaseline, CSSPropertyBaselineShift, CSSPropertyDominantBaseline, CSSPropertyKerning, CSSPropertyTextAnchor, CSSPropertyWritingMode, CSSPropertyGlyphOrientationHorizontal, CSSPropertyGlyphOrientationVertical, CSSPropertyWebkitSvgShadow, CSSPropertyVectorEffect #endif #ifdef ANDROID_CSS_RING , CSSPropertyWebkitRingFillColor, CSSPropertyWebkitRingInnerWidth, CSSPropertyWebkitRingOuterWidth, CSSPropertyWebkitRingOutset, CSSPropertyWebkitRingPressedInnerColor, CSSPropertyWebkitRingPressedOuterColor, CSSPropertyWebkitRingRadius, CSSPropertyWebkitRingSelectedInnerColor, CSSPropertyWebkitRingSelectedOuterColor #endif #ifdef ANDROID_CSS_TAP_HIGHLIGHT_COLOR , CSSPropertyWebkitTapHighlightColor #endif }; const unsigned numComputedProperties = WTF_ARRAY_LENGTH(computedProperties); static int valueForRepeatRule(int rule) { switch (rule) { case RepeatImageRule: return CSSValueRepeat; case RoundImageRule: return CSSValueRound; default: return CSSValueStretch; } } static PassRefPtr valueForNinePieceImage(const NinePieceImage& image) { if (!image.hasImage()) return CSSPrimitiveValue::createIdentifier(CSSValueNone); // Image first. RefPtr imageValue; if (image.image()) imageValue = image.image()->cssValue(); // Create the slices. RefPtr top; if (image.slices().top().isPercent()) top = CSSPrimitiveValue::create(image.slices().top().value(), CSSPrimitiveValue::CSS_PERCENTAGE); else top = CSSPrimitiveValue::create(image.slices().top().value(), CSSPrimitiveValue::CSS_NUMBER); RefPtr right; if (image.slices().right().isPercent()) right = CSSPrimitiveValue::create(image.slices().right().value(), CSSPrimitiveValue::CSS_PERCENTAGE); else right = CSSPrimitiveValue::create(image.slices().right().value(), CSSPrimitiveValue::CSS_NUMBER); RefPtr bottom; if (image.slices().bottom().isPercent()) bottom = CSSPrimitiveValue::create(image.slices().bottom().value(), CSSPrimitiveValue::CSS_PERCENTAGE); else bottom = CSSPrimitiveValue::create(image.slices().bottom().value(), CSSPrimitiveValue::CSS_NUMBER); RefPtr left; if (image.slices().left().isPercent()) left = CSSPrimitiveValue::create(image.slices().left().value(), CSSPrimitiveValue::CSS_PERCENTAGE); else left = CSSPrimitiveValue::create(image.slices().left().value(), CSSPrimitiveValue::CSS_NUMBER); RefPtr rect = Rect::create(); rect->setTop(top); rect->setRight(right); rect->setBottom(bottom); rect->setLeft(left); return CSSBorderImageValue::create(imageValue, rect, valueForRepeatRule(image.horizontalRule()), valueForRepeatRule(image.verticalRule())); } inline static PassRefPtr zoomAdjustedPixelValue(int value, const RenderStyle* style) { return CSSPrimitiveValue::create(adjustForAbsoluteZoom(value, style), CSSPrimitiveValue::CSS_PX); } inline static PassRefPtr zoomAdjustedNumberValue(double value, const RenderStyle* style) { return CSSPrimitiveValue::create(value / style->effectiveZoom(), CSSPrimitiveValue::CSS_NUMBER); } static PassRefPtr valueForReflection(const StyleReflection* reflection, const RenderStyle* style) { if (!reflection) return CSSPrimitiveValue::createIdentifier(CSSValueNone); RefPtr offset; if (reflection->offset().isPercent()) offset = CSSPrimitiveValue::create(reflection->offset().percent(), CSSPrimitiveValue::CSS_PERCENTAGE); else offset = zoomAdjustedPixelValue(reflection->offset().value(), style); return CSSReflectValue::create(reflection->direction(), offset.release(), valueForNinePieceImage(reflection->mask())); } static PassRefPtr getPositionOffsetValue(RenderStyle* style, int propertyID) { if (!style) return 0; Length l; switch (propertyID) { case CSSPropertyLeft: l = style->left(); break; case CSSPropertyRight: l = style->right(); break; case CSSPropertyTop: l = style->top(); break; case CSSPropertyBottom: l = style->bottom(); break; default: return 0; } if (style->position() == AbsolutePosition || style->position() == FixedPosition) { if (l.type() == WebCore::Fixed) return zoomAdjustedPixelValue(l.value(), style); return CSSPrimitiveValue::create(l); } if (style->position() == RelativePosition) // FIXME: It's not enough to simply return "auto" values for one offset if the other side is defined. // In other words if left is auto and right is not auto, then left's computed value is negative right(). // So we should get the opposite length unit and see if it is auto. return CSSPrimitiveValue::create(l); return CSSPrimitiveValue::createIdentifier(CSSValueAuto); } PassRefPtr CSSComputedStyleDeclaration::currentColorOrValidColor(RenderStyle* style, const Color& color) const { // This function does NOT look at visited information, so that computed style doesn't expose that. if (!color.isValid()) return CSSPrimitiveValue::createColor(style->color().rgb()); return CSSPrimitiveValue::createColor(color.rgb()); } static PassRefPtr getBorderRadiusCornerValue(LengthSize radius, const RenderStyle* style) { RefPtr list = CSSValueList::createSpaceSeparated(); if (radius.width() == radius.height()) { if (radius.width().type() == Percent) return CSSPrimitiveValue::create(radius.width().percent(), CSSPrimitiveValue::CSS_PERCENTAGE); return zoomAdjustedPixelValue(radius.width().value(), style); } if (radius.width().type() == Percent) list->append(CSSPrimitiveValue::create(radius.width().percent(), CSSPrimitiveValue::CSS_PERCENTAGE)); else list->append(zoomAdjustedPixelValue(radius.width().value(), style)); if (radius.height().type() == Percent) list->append(CSSPrimitiveValue::create(radius.height().percent(), CSSPrimitiveValue::CSS_PERCENTAGE)); else list->append(zoomAdjustedPixelValue(radius.height().value(), style)); return list.release(); } static IntRect sizingBox(RenderObject* renderer) { if (!renderer->isBox()) return IntRect(); RenderBox* box = toRenderBox(renderer); return box->style()->boxSizing() == CONTENT_BOX ? box->contentBoxRect() : box->borderBoxRect(); } static inline bool hasCompositedLayer(RenderObject* renderer) { return renderer && renderer->hasLayer() && toRenderBoxModelObject(renderer)->layer()->isComposited(); } static PassRefPtr computedTransform(RenderObject* renderer, const RenderStyle* style) { if (!renderer || style->transform().operations().isEmpty()) return CSSPrimitiveValue::createIdentifier(CSSValueNone); IntRect box = sizingBox(renderer); TransformationMatrix transform; style->applyTransform(transform, box.size(), RenderStyle::ExcludeTransformOrigin); // Note that this does not flatten to an affine transform if ENABLE(3D_RENDERING) is off, by design. RefPtr transformVal; // FIXME: Need to print out individual functions (https://bugs.webkit.org/show_bug.cgi?id=23924) if (transform.isAffine()) { transformVal = WebKitCSSTransformValue::create(WebKitCSSTransformValue::MatrixTransformOperation); transformVal->append(CSSPrimitiveValue::create(transform.a(), CSSPrimitiveValue::CSS_NUMBER)); transformVal->append(CSSPrimitiveValue::create(transform.b(), CSSPrimitiveValue::CSS_NUMBER)); transformVal->append(CSSPrimitiveValue::create(transform.c(), CSSPrimitiveValue::CSS_NUMBER)); transformVal->append(CSSPrimitiveValue::create(transform.d(), CSSPrimitiveValue::CSS_NUMBER)); transformVal->append(zoomAdjustedNumberValue(transform.e(), style)); transformVal->append(zoomAdjustedNumberValue(transform.f(), style)); } else { transformVal = WebKitCSSTransformValue::create(WebKitCSSTransformValue::Matrix3DTransformOperation); transformVal->append(CSSPrimitiveValue::create(transform.m11(), CSSPrimitiveValue::CSS_NUMBER)); transformVal->append(CSSPrimitiveValue::create(transform.m12(), CSSPrimitiveValue::CSS_NUMBER)); transformVal->append(CSSPrimitiveValue::create(transform.m13(), CSSPrimitiveValue::CSS_NUMBER)); transformVal->append(CSSPrimitiveValue::create(transform.m14(), CSSPrimitiveValue::CSS_NUMBER)); transformVal->append(CSSPrimitiveValue::create(transform.m21(), CSSPrimitiveValue::CSS_NUMBER)); transformVal->append(CSSPrimitiveValue::create(transform.m22(), CSSPrimitiveValue::CSS_NUMBER)); transformVal->append(CSSPrimitiveValue::create(transform.m23(), CSSPrimitiveValue::CSS_NUMBER)); transformVal->append(CSSPrimitiveValue::create(transform.m24(), CSSPrimitiveValue::CSS_NUMBER)); transformVal->append(CSSPrimitiveValue::create(transform.m31(), CSSPrimitiveValue::CSS_NUMBER)); transformVal->append(CSSPrimitiveValue::create(transform.m32(), CSSPrimitiveValue::CSS_NUMBER)); transformVal->append(CSSPrimitiveValue::create(transform.m33(), CSSPrimitiveValue::CSS_NUMBER)); transformVal->append(CSSPrimitiveValue::create(transform.m34(), CSSPrimitiveValue::CSS_NUMBER)); transformVal->append(zoomAdjustedNumberValue(transform.m41(), style)); transformVal->append(zoomAdjustedNumberValue(transform.m42(), style)); transformVal->append(zoomAdjustedNumberValue(transform.m43(), style)); transformVal->append(CSSPrimitiveValue::create(transform.m44(), CSSPrimitiveValue::CSS_NUMBER)); } RefPtr list = CSSValueList::createSpaceSeparated(); list->append(transformVal); return list.release(); } static PassRefPtr getDelayValue(const AnimationList* animList) { RefPtr list = CSSValueList::createCommaSeparated(); if (animList) { for (size_t i = 0; i < animList->size(); ++i) list->append(CSSPrimitiveValue::create(animList->animation(i)->delay(), CSSPrimitiveValue::CSS_S)); } else { // Note that initialAnimationDelay() is used for both transitions and animations list->append(CSSPrimitiveValue::create(Animation::initialAnimationDelay(), CSSPrimitiveValue::CSS_S)); } return list.release(); } static PassRefPtr getDurationValue(const AnimationList* animList) { RefPtr list = CSSValueList::createCommaSeparated(); if (animList) { for (size_t i = 0; i < animList->size(); ++i) list->append(CSSPrimitiveValue::create(animList->animation(i)->duration(), CSSPrimitiveValue::CSS_S)); } else { // Note that initialAnimationDuration() is used for both transitions and animations list->append(CSSPrimitiveValue::create(Animation::initialAnimationDuration(), CSSPrimitiveValue::CSS_S)); } return list.release(); } static PassRefPtr getTimingFunctionValue(const AnimationList* animList) { RefPtr list = CSSValueList::createCommaSeparated(); if (animList) { for (size_t i = 0; i < animList->size(); ++i) { const TimingFunction* tf = animList->animation(i)->timingFunction().get(); if (tf->isCubicBezierTimingFunction()) { const CubicBezierTimingFunction* ctf = static_cast(tf); list->append(CSSCubicBezierTimingFunctionValue::create(ctf->x1(), ctf->y1(), ctf->x2(), ctf->y2())); } else if (tf->isStepsTimingFunction()) { const StepsTimingFunction* stf = static_cast(tf); list->append(CSSStepsTimingFunctionValue::create(stf->numberOfSteps(), stf->stepAtStart())); } else { list->append(CSSLinearTimingFunctionValue::create()); } } } else { // Note that initialAnimationTimingFunction() is used for both transitions and animations RefPtr tf = Animation::initialAnimationTimingFunction(); if (tf->isCubicBezierTimingFunction()) { const CubicBezierTimingFunction* ctf = static_cast(tf.get()); list->append(CSSCubicBezierTimingFunctionValue::create(ctf->x1(), ctf->y1(), ctf->x2(), ctf->y2())); } else if (tf->isStepsTimingFunction()) { const StepsTimingFunction* stf = static_cast(tf.get()); list->append(CSSStepsTimingFunctionValue::create(stf->numberOfSteps(), stf->stepAtStart())); } else { list->append(CSSLinearTimingFunctionValue::create()); } } return list.release(); } CSSComputedStyleDeclaration::CSSComputedStyleDeclaration(PassRefPtr n, bool allowVisitedStyle, const String& pseudoElementName) : m_node(n) , m_allowVisitedStyle(allowVisitedStyle) { unsigned nameWithoutColonsStart = pseudoElementName[0] == ':' ? (pseudoElementName[1] == ':' ? 2 : 1) : 0; m_pseudoElementSpecifier = CSSSelector::pseudoId(CSSSelector::parsePseudoType( AtomicString(pseudoElementName.substring(nameWithoutColonsStart)))); } CSSComputedStyleDeclaration::~CSSComputedStyleDeclaration() { } String CSSComputedStyleDeclaration::cssText() const { String result(""); for (unsigned i = 0; i < numComputedProperties; i++) { if (i) result += " "; result += getPropertyName(static_cast(computedProperties[i])); result += ": "; result += getPropertyValue(computedProperties[i]); result += ";"; } return result; } void CSSComputedStyleDeclaration::setCssText(const String&, ExceptionCode& ec) { ec = NO_MODIFICATION_ALLOWED_ERR; } static int cssIdentifierForFontSizeKeyword(int keywordSize) { ASSERT_ARG(keywordSize, keywordSize); ASSERT_ARG(keywordSize, keywordSize <= 8); return CSSValueXxSmall + keywordSize - 1; } PassRefPtr CSSComputedStyleDeclaration::getFontSizeCSSValuePreferringKeyword() const { if (!m_node) return 0; m_node->document()->updateLayoutIgnorePendingStylesheets(); RefPtr style = m_node->computedStyle(m_pseudoElementSpecifier); if (!style) return 0; if (int keywordSize = style->fontDescription().keywordSize()) return CSSPrimitiveValue::createIdentifier(cssIdentifierForFontSizeKeyword(keywordSize)); return zoomAdjustedPixelValue(style->fontDescription().computedPixelSize(), style.get()); } bool CSSComputedStyleDeclaration::useFixedFontDefaultSize() const { if (!m_node) return false; RefPtr style = m_node->computedStyle(m_pseudoElementSpecifier); if (!style) return false; return style->fontDescription().useFixedDefaultSize(); } PassRefPtr CSSComputedStyleDeclaration::valueForShadow(const ShadowData* shadow, int id, RenderStyle* style) const { if (!shadow) return CSSPrimitiveValue::createIdentifier(CSSValueNone); CSSPropertyID propertyID = static_cast(id); RefPtr list = CSSValueList::createCommaSeparated(); for (const ShadowData* s = shadow; s; s = s->next()) { RefPtr x = zoomAdjustedPixelValue(s->x(), style); RefPtr y = zoomAdjustedPixelValue(s->y(), style); RefPtr blur = zoomAdjustedPixelValue(s->blur(), style); RefPtr spread = propertyID == CSSPropertyTextShadow ? 0 : zoomAdjustedPixelValue(s->spread(), style); RefPtr style = propertyID == CSSPropertyTextShadow || s->style() == Normal ? 0 : CSSPrimitiveValue::createIdentifier(CSSValueInset); RefPtr color = CSSPrimitiveValue::createColor(s->color().rgb()); list->prepend(ShadowValue::create(x.release(), y.release(), blur.release(), spread.release(), style.release(), color.release())); } return list.release(); } PassRefPtr CSSComputedStyleDeclaration::getPropertyCSSValue(int propertyID) const { return getPropertyCSSValue(propertyID, UpdateLayout); } static int identifierForFamily(const AtomicString& family) { DEFINE_STATIC_LOCAL(AtomicString, cursiveFamily, ("-webkit-cursive")); DEFINE_STATIC_LOCAL(AtomicString, fantasyFamily, ("-webkit-fantasy")); DEFINE_STATIC_LOCAL(AtomicString, monospaceFamily, ("-webkit-monospace")); DEFINE_STATIC_LOCAL(AtomicString, sansSerifFamily, ("-webkit-sans-serif")); DEFINE_STATIC_LOCAL(AtomicString, serifFamily, ("-webkit-serif")); if (family == cursiveFamily) return CSSValueCursive; if (family == fantasyFamily) return CSSValueFantasy; if (family == monospaceFamily) return CSSValueMonospace; if (family == sansSerifFamily) return CSSValueSansSerif; if (family == serifFamily) return CSSValueSerif; return 0; } static PassRefPtr valueForFamily(const AtomicString& family) { if (int familyIdentifier = identifierForFamily(family)) return CSSPrimitiveValue::createIdentifier(familyIdentifier); return CSSPrimitiveValue::create(family.string(), CSSPrimitiveValue::CSS_STRING); } static PassRefPtr renderTextDecorationFlagsToCSSValue(int textDecoration) { RefPtr list = CSSValueList::createSpaceSeparated(); if (textDecoration & UNDERLINE) list->append(CSSPrimitiveValue::createIdentifier(CSSValueUnderline)); if (textDecoration & OVERLINE) list->append(CSSPrimitiveValue::createIdentifier(CSSValueOverline)); if (textDecoration & LINE_THROUGH) list->append(CSSPrimitiveValue::createIdentifier(CSSValueLineThrough)); if (textDecoration & BLINK) list->append(CSSPrimitiveValue::createIdentifier(CSSValueBlink)); if (!list->length()) return CSSPrimitiveValue::createIdentifier(CSSValueNone); return list; } static PassRefPtr fillRepeatToCSSValue(EFillRepeat xRepeat, EFillRepeat yRepeat) { // For backwards compatibility, if both values are equal, just return one of them. And // if the two values are equivalent to repeat-x or repeat-y, just return the shorthand. if (xRepeat == yRepeat) return CSSPrimitiveValue::create(xRepeat); if (xRepeat == RepeatFill && yRepeat == NoRepeatFill) return CSSPrimitiveValue::createIdentifier(CSSValueRepeatX); if (xRepeat == NoRepeatFill && yRepeat == RepeatFill) return CSSPrimitiveValue::createIdentifier(CSSValueRepeatY); RefPtr list = CSSValueList::createSpaceSeparated(); list->append(CSSPrimitiveValue::create(xRepeat)); list->append(CSSPrimitiveValue::create(yRepeat)); return list.release(); } static PassRefPtr fillSizeToCSSValue(const FillSize& fillSize) { if (fillSize.type == Contain) return CSSPrimitiveValue::createIdentifier(CSSValueContain); if (fillSize.type == Cover) return CSSPrimitiveValue::createIdentifier(CSSValueCover); RefPtr list = CSSValueList::createSpaceSeparated(); list->append(CSSPrimitiveValue::create(fillSize.size.width())); list->append(CSSPrimitiveValue::create(fillSize.size.height())); return list.release(); } static void logUnimplementedPropertyID(int propertyID) { DEFINE_STATIC_LOCAL(HashSet, propertyIDSet, ()); if (!propertyIDSet.add(propertyID).second) return; LOG_ERROR("WebKit does not yet implement getComputedStyle for '%s'.", getPropertyName(static_cast(propertyID))); } PassRefPtr CSSComputedStyleDeclaration::getPropertyCSSValue(int propertyID, EUpdateLayout updateLayout) const { Node* node = m_node.get(); if (!node) return 0; // Make sure our layout is up to date before we allow a query on these attributes. if (updateLayout) node->document()->updateLayoutIgnorePendingStylesheets(); RenderObject* renderer = node->renderer(); RefPtr style; if (renderer && hasCompositedLayer(renderer) && AnimationController::supportsAcceleratedAnimationOfProperty(static_cast(propertyID))) { style = renderer->animation()->getAnimatedStyleForRenderer(renderer); if (m_pseudoElementSpecifier) { // FIXME: This cached pseudo style will only exist if the animation has been run at least once. style = style->getCachedPseudoStyle(m_pseudoElementSpecifier); } } else style = node->computedStyle(m_pseudoElementSpecifier); if (!style) return 0; propertyID = CSSProperty::resolveDirectionAwareProperty(propertyID, style->direction(), style->writingMode()); #ifdef ANDROID_LAYOUT const Settings * settings = node->document()->frame() ? node->document()->frame()->settings() : 0; #endif switch (static_cast(propertyID)) { case CSSPropertyInvalid: break; case CSSPropertyBackgroundColor: return CSSPrimitiveValue::createColor(m_allowVisitedStyle? style->visitedDependentColor(CSSPropertyBackgroundColor).rgb() : style->backgroundColor().rgb()); case CSSPropertyBackgroundImage: case CSSPropertyWebkitMaskImage: { const FillLayer* layers = propertyID == CSSPropertyWebkitMaskImage ? style->maskLayers() : style->backgroundLayers(); if (!layers) return CSSPrimitiveValue::createIdentifier(CSSValueNone); if (!layers->next()) { if (layers->image()) return layers->image()->cssValue(); return CSSPrimitiveValue::createIdentifier(CSSValueNone); } RefPtr list = CSSValueList::createCommaSeparated(); for (const FillLayer* currLayer = layers; currLayer; currLayer = currLayer->next()) { if (currLayer->image()) list->append(currLayer->image()->cssValue()); else list->append(CSSPrimitiveValue::createIdentifier(CSSValueNone)); } return list.release(); } case CSSPropertyBackgroundSize: case CSSPropertyWebkitBackgroundSize: case CSSPropertyWebkitMaskSize: { const FillLayer* layers = propertyID == CSSPropertyWebkitMaskSize ? style->maskLayers() : style->backgroundLayers(); if (!layers->next()) return fillSizeToCSSValue(layers->size()); RefPtr list = CSSValueList::createCommaSeparated(); for (const FillLayer* currLayer = layers; currLayer; currLayer = currLayer->next()) list->append(fillSizeToCSSValue(currLayer->size())); return list.release(); } case CSSPropertyBackgroundRepeat: case CSSPropertyWebkitMaskRepeat: { const FillLayer* layers = propertyID == CSSPropertyWebkitMaskRepeat ? style->maskLayers() : style->backgroundLayers(); if (!layers->next()) return fillRepeatToCSSValue(layers->repeatX(), layers->repeatY()); RefPtr list = CSSValueList::createCommaSeparated(); for (const FillLayer* currLayer = layers; currLayer; currLayer = currLayer->next()) list->append(fillRepeatToCSSValue(currLayer->repeatX(), currLayer->repeatY())); return list.release(); } case CSSPropertyWebkitBackgroundComposite: case CSSPropertyWebkitMaskComposite: { const FillLayer* layers = propertyID == CSSPropertyWebkitMaskComposite ? style->maskLayers() : style->backgroundLayers(); if (!layers->next()) return CSSPrimitiveValue::create(layers->composite()); RefPtr list = CSSValueList::createCommaSeparated(); for (const FillLayer* currLayer = layers; currLayer; currLayer = currLayer->next()) list->append(CSSPrimitiveValue::create(currLayer->composite())); return list.release(); } case CSSPropertyBackgroundAttachment: case CSSPropertyWebkitMaskAttachment: { const FillLayer* layers = propertyID == CSSPropertyWebkitMaskAttachment ? style->maskLayers() : style->backgroundLayers(); if (!layers->next()) return CSSPrimitiveValue::create(layers->attachment()); RefPtr list = CSSValueList::createCommaSeparated(); for (const FillLayer* currLayer = layers; currLayer; currLayer = currLayer->next()) list->append(CSSPrimitiveValue::create(currLayer->attachment())); return list.release(); } case CSSPropertyBackgroundClip: case CSSPropertyBackgroundOrigin: case CSSPropertyWebkitBackgroundClip: case CSSPropertyWebkitBackgroundOrigin: case CSSPropertyWebkitMaskClip: case CSSPropertyWebkitMaskOrigin: { const FillLayer* layers = (propertyID == CSSPropertyWebkitMaskClip || propertyID == CSSPropertyWebkitMaskOrigin) ? style->maskLayers() : style->backgroundLayers(); bool isClip = propertyID == CSSPropertyBackgroundClip || propertyID == CSSPropertyWebkitBackgroundClip || propertyID == CSSPropertyWebkitMaskClip; if (!layers->next()) { EFillBox box = isClip ? layers->clip() : layers->origin(); return CSSPrimitiveValue::create(box); } RefPtr list = CSSValueList::createCommaSeparated(); for (const FillLayer* currLayer = layers; currLayer; currLayer = currLayer->next()) { EFillBox box = isClip ? currLayer->clip() : currLayer->origin(); list->append(CSSPrimitiveValue::create(box)); } return list.release(); } case CSSPropertyBackgroundPosition: case CSSPropertyWebkitMaskPosition: { const FillLayer* layers = propertyID == CSSPropertyWebkitMaskPosition ? style->maskLayers() : style->backgroundLayers(); if (!layers->next()) { RefPtr list = CSSValueList::createSpaceSeparated(); list->append(CSSPrimitiveValue::create(layers->xPosition())); list->append(CSSPrimitiveValue::create(layers->yPosition())); return list.release(); } RefPtr list = CSSValueList::createCommaSeparated(); for (const FillLayer* currLayer = layers; currLayer; currLayer = currLayer->next()) { RefPtr positionList = CSSValueList::createSpaceSeparated(); positionList->append(CSSPrimitiveValue::create(currLayer->xPosition())); positionList->append(CSSPrimitiveValue::create(currLayer->yPosition())); list->append(positionList); } return list.release(); } case CSSPropertyBackgroundPositionX: case CSSPropertyWebkitMaskPositionX: { const FillLayer* layers = propertyID == CSSPropertyWebkitMaskPositionX ? style->maskLayers() : style->backgroundLayers(); if (!layers->next()) return CSSPrimitiveValue::create(layers->xPosition()); RefPtr list = CSSValueList::createCommaSeparated(); for (const FillLayer* currLayer = layers; currLayer; currLayer = currLayer->next()) list->append(CSSPrimitiveValue::create(currLayer->xPosition())); return list.release(); } case CSSPropertyBackgroundPositionY: case CSSPropertyWebkitMaskPositionY: { const FillLayer* layers = propertyID == CSSPropertyWebkitMaskPositionY ? style->maskLayers() : style->backgroundLayers(); if (!layers->next()) return CSSPrimitiveValue::create(layers->yPosition()); RefPtr list = CSSValueList::createCommaSeparated(); for (const FillLayer* currLayer = layers; currLayer; currLayer = currLayer->next()) list->append(CSSPrimitiveValue::create(currLayer->yPosition())); return list.release(); } case CSSPropertyBorderCollapse: if (style->borderCollapse()) return CSSPrimitiveValue::createIdentifier(CSSValueCollapse); return CSSPrimitiveValue::createIdentifier(CSSValueSeparate); case CSSPropertyBorderSpacing: { RefPtr list = CSSValueList::createSpaceSeparated(); list->append(zoomAdjustedPixelValue(style->horizontalBorderSpacing(), style.get())); list->append(zoomAdjustedPixelValue(style->verticalBorderSpacing(), style.get())); return list.release(); } case CSSPropertyWebkitBorderHorizontalSpacing: return zoomAdjustedPixelValue(style->horizontalBorderSpacing(), style.get()); case CSSPropertyWebkitBorderVerticalSpacing: return zoomAdjustedPixelValue(style->verticalBorderSpacing(), style.get()); case CSSPropertyBorderTopColor: return m_allowVisitedStyle ? CSSPrimitiveValue::createColor(style->visitedDependentColor(CSSPropertyBorderTopColor).rgb()) : currentColorOrValidColor(style.get(), style->borderTopColor()); case CSSPropertyBorderRightColor: return m_allowVisitedStyle ? CSSPrimitiveValue::createColor(style->visitedDependentColor(CSSPropertyBorderRightColor).rgb()) : currentColorOrValidColor(style.get(), style->borderRightColor()); case CSSPropertyBorderBottomColor: return m_allowVisitedStyle ? CSSPrimitiveValue::createColor(style->visitedDependentColor(CSSPropertyBorderBottomColor).rgb()) : currentColorOrValidColor(style.get(), style->borderBottomColor()); case CSSPropertyBorderLeftColor: return m_allowVisitedStyle ? CSSPrimitiveValue::createColor(style->visitedDependentColor(CSSPropertyBorderLeftColor).rgb()) : currentColorOrValidColor(style.get(), style->borderLeftColor()); case CSSPropertyBorderTopStyle: return CSSPrimitiveValue::create(style->borderTopStyle()); case CSSPropertyBorderRightStyle: return CSSPrimitiveValue::create(style->borderRightStyle()); case CSSPropertyBorderBottomStyle: return CSSPrimitiveValue::create(style->borderBottomStyle()); case CSSPropertyBorderLeftStyle: return CSSPrimitiveValue::create(style->borderLeftStyle()); case CSSPropertyBorderTopWidth: return zoomAdjustedPixelValue(style->borderTopWidth(), style.get()); case CSSPropertyBorderRightWidth: return zoomAdjustedPixelValue(style->borderRightWidth(), style.get()); case CSSPropertyBorderBottomWidth: return zoomAdjustedPixelValue(style->borderBottomWidth(), style.get()); case CSSPropertyBorderLeftWidth: return zoomAdjustedPixelValue(style->borderLeftWidth(), style.get()); case CSSPropertyBottom: return getPositionOffsetValue(style.get(), CSSPropertyBottom); case CSSPropertyWebkitBoxAlign: return CSSPrimitiveValue::create(style->boxAlign()); case CSSPropertyWebkitBoxDirection: return CSSPrimitiveValue::create(style->boxDirection()); case CSSPropertyWebkitBoxFlex: return CSSPrimitiveValue::create(style->boxFlex(), CSSPrimitiveValue::CSS_NUMBER); case CSSPropertyWebkitBoxFlexGroup: return CSSPrimitiveValue::create(style->boxFlexGroup(), CSSPrimitiveValue::CSS_NUMBER); case CSSPropertyWebkitBoxLines: return CSSPrimitiveValue::create(style->boxLines()); case CSSPropertyWebkitBoxOrdinalGroup: return CSSPrimitiveValue::create(style->boxOrdinalGroup(), CSSPrimitiveValue::CSS_NUMBER); case CSSPropertyWebkitBoxOrient: return CSSPrimitiveValue::create(style->boxOrient()); case CSSPropertyWebkitBoxPack: { EBoxAlignment boxPack = style->boxPack(); ASSERT(boxPack != BSTRETCH); ASSERT(boxPack != BBASELINE); if (boxPack == BJUSTIFY || boxPack== BBASELINE) return 0; return CSSPrimitiveValue::create(boxPack); } case CSSPropertyWebkitBoxReflect: return valueForReflection(style->boxReflect(), style.get()); case CSSPropertyWebkitBoxShadow: return valueForShadow(style->boxShadow(), propertyID, style.get()); case CSSPropertyCaptionSide: return CSSPrimitiveValue::create(style->captionSide()); case CSSPropertyClear: return CSSPrimitiveValue::create(style->clear()); case CSSPropertyColor: return CSSPrimitiveValue::createColor(m_allowVisitedStyle ? style->visitedDependentColor(CSSPropertyColor).rgb() : style->color().rgb()); case CSSPropertyWebkitColumnCount: if (style->hasAutoColumnCount()) return CSSPrimitiveValue::createIdentifier(CSSValueAuto); return CSSPrimitiveValue::create(style->columnCount(), CSSPrimitiveValue::CSS_NUMBER); case CSSPropertyWebkitColumnGap: if (style->hasNormalColumnGap()) return CSSPrimitiveValue::createIdentifier(CSSValueNormal); return CSSPrimitiveValue::create(style->columnGap(), CSSPrimitiveValue::CSS_NUMBER); case CSSPropertyWebkitColumnRuleColor: return m_allowVisitedStyle ? CSSPrimitiveValue::createColor(style->visitedDependentColor(CSSPropertyOutlineColor).rgb()) : currentColorOrValidColor(style.get(), style->columnRuleColor()); case CSSPropertyWebkitColumnRuleStyle: return CSSPrimitiveValue::create(style->columnRuleStyle()); case CSSPropertyWebkitColumnRuleWidth: return zoomAdjustedPixelValue(style->columnRuleWidth(), style.get()); case CSSPropertyWebkitColumnSpan: if (style->columnSpan()) return CSSPrimitiveValue::createIdentifier(CSSValueAll); return CSSPrimitiveValue::create(1, CSSPrimitiveValue::CSS_NUMBER); case CSSPropertyWebkitColumnBreakAfter: return CSSPrimitiveValue::create(style->columnBreakAfter()); case CSSPropertyWebkitColumnBreakBefore: return CSSPrimitiveValue::create(style->columnBreakBefore()); case CSSPropertyWebkitColumnBreakInside: return CSSPrimitiveValue::create(style->columnBreakInside()); case CSSPropertyWebkitColumnWidth: if (style->hasAutoColumnWidth()) return CSSPrimitiveValue::createIdentifier(CSSValueAuto); return CSSPrimitiveValue::create(style->columnWidth(), CSSPrimitiveValue::CSS_NUMBER); case CSSPropertyCursor: { RefPtr list; CursorList* cursors = style->cursors(); if (cursors && cursors->size() > 0) { list = CSSValueList::createCommaSeparated(); for (unsigned i = 0; i < cursors->size(); ++i) if (StyleImage* image = cursors->at(i).image()) list->append(image->cssValue()); } RefPtr value = CSSPrimitiveValue::create(style->cursor()); if (list) { list->append(value); return list.release(); } return value.release(); } case CSSPropertyDirection: return CSSPrimitiveValue::create(style->direction()); case CSSPropertyDisplay: return CSSPrimitiveValue::create(style->display()); case CSSPropertyEmptyCells: return CSSPrimitiveValue::create(style->emptyCells()); case CSSPropertyFloat: #ifdef ANDROID_LAYOUT if (settings && settings->layoutAlgorithm() == Settings::kLayoutSSR) return CSSPrimitiveValue::createIdentifier(CSSValueNone); #endif return CSSPrimitiveValue::create(style->floating()); case CSSPropertyFontFamily: { const FontFamily& firstFamily = style->fontDescription().family(); if (!firstFamily.next()) return valueForFamily(firstFamily.family()); RefPtr list = CSSValueList::createCommaSeparated(); for (const FontFamily* family = &firstFamily; family; family = family->next()) list->append(valueForFamily(family->family())); return list.release(); } case CSSPropertyFontSize: return zoomAdjustedPixelValue(style->fontDescription().computedPixelSize(), style.get()); case CSSPropertyFontStyle: if (style->fontDescription().italic()) return CSSPrimitiveValue::createIdentifier(CSSValueItalic); return CSSPrimitiveValue::createIdentifier(CSSValueNormal); case CSSPropertyFontVariant: if (style->fontDescription().smallCaps()) return CSSPrimitiveValue::createIdentifier(CSSValueSmallCaps); return CSSPrimitiveValue::createIdentifier(CSSValueNormal); case CSSPropertyFontWeight: switch (style->fontDescription().weight()) { case FontWeight100: return CSSPrimitiveValue::createIdentifier(CSSValue100); case FontWeight200: return CSSPrimitiveValue::createIdentifier(CSSValue200); case FontWeight300: return CSSPrimitiveValue::createIdentifier(CSSValue300); case FontWeightNormal: return CSSPrimitiveValue::createIdentifier(CSSValueNormal); case FontWeight500: return CSSPrimitiveValue::createIdentifier(CSSValue500); case FontWeight600: return CSSPrimitiveValue::createIdentifier(CSSValue600); case FontWeightBold: return CSSPrimitiveValue::createIdentifier(CSSValueBold); case FontWeight800: return CSSPrimitiveValue::createIdentifier(CSSValue800); case FontWeight900: return CSSPrimitiveValue::createIdentifier(CSSValue900); } ASSERT_NOT_REACHED(); return CSSPrimitiveValue::createIdentifier(CSSValueNormal); case CSSPropertyHeight: if (renderer) return zoomAdjustedPixelValue(sizingBox(renderer).height(), style.get()); return CSSPrimitiveValue::create(style->height()); case CSSPropertyWebkitHighlight: if (style->highlight() == nullAtom) return CSSPrimitiveValue::createIdentifier(CSSValueNone); return CSSPrimitiveValue::create(style->highlight(), CSSPrimitiveValue::CSS_STRING); case CSSPropertyWebkitHyphens: return CSSPrimitiveValue::create(style->hyphens()); case CSSPropertyWebkitHyphenateCharacter: if (style->hyphenationString().isNull()) return CSSPrimitiveValue::createIdentifier(CSSValueAuto); return CSSPrimitiveValue::create(style->hyphenationString(), CSSPrimitiveValue::CSS_STRING); case CSSPropertyWebkitHyphenateLocale: if (style->hyphenationLocale().isNull()) return CSSPrimitiveValue::createIdentifier(CSSValueAuto); return CSSPrimitiveValue::create(style->hyphenationLocale(), CSSPrimitiveValue::CSS_STRING); case CSSPropertyWebkitBorderFit: if (style->borderFit() == BorderFitBorder) return CSSPrimitiveValue::createIdentifier(CSSValueBorder); return CSSPrimitiveValue::createIdentifier(CSSValueLines); case CSSPropertyLeft: return getPositionOffsetValue(style.get(), CSSPropertyLeft); case CSSPropertyLetterSpacing: if (!style->letterSpacing()) return CSSPrimitiveValue::createIdentifier(CSSValueNormal); return zoomAdjustedPixelValue(style->letterSpacing(), style.get()); case CSSPropertyWebkitLineClamp: if (style->lineClamp().isNone()) return CSSPrimitiveValue::createIdentifier(CSSValueNone); return CSSPrimitiveValue::create(style->lineClamp().value(), style->lineClamp().isPercentage() ? CSSPrimitiveValue::CSS_PERCENTAGE : CSSPrimitiveValue::CSS_NUMBER); case CSSPropertyLineHeight: { Length length = style->lineHeight(); if (length.isNegative()) return CSSPrimitiveValue::createIdentifier(CSSValueNormal); if (length.isPercent()) // This is imperfect, because it doesn't include the zoom factor and the real computation // for how high to be in pixels does include things like minimum font size and the zoom factor. // On the other hand, since font-size doesn't include the zoom factor, we really can't do // that here either. return zoomAdjustedPixelValue(static_cast(length.percent() * style->fontDescription().specifiedSize()) / 100, style.get()); return zoomAdjustedPixelValue(length.value(), style.get()); } case CSSPropertyListStyleImage: if (style->listStyleImage()) return style->listStyleImage()->cssValue(); return CSSPrimitiveValue::createIdentifier(CSSValueNone); case CSSPropertyListStylePosition: return CSSPrimitiveValue::create(style->listStylePosition()); case CSSPropertyListStyleType: return CSSPrimitiveValue::create(style->listStyleType()); case CSSPropertyMarginTop: if (renderer && renderer->isBox()) // FIXME: Supposed to return the percentage if percentage was specified. return zoomAdjustedPixelValue(toRenderBox(renderer)->marginTop(), style.get()); return CSSPrimitiveValue::create(style->marginTop()); case CSSPropertyMarginRight: if (renderer && renderer->isBox()) // FIXME: Supposed to return the percentage if percentage was specified. return zoomAdjustedPixelValue(toRenderBox(renderer)->marginRight(), style.get()); return CSSPrimitiveValue::create(style->marginRight()); case CSSPropertyMarginBottom: if (renderer && renderer->isBox()) // FIXME: Supposed to return the percentage if percentage was specified. return zoomAdjustedPixelValue(toRenderBox(renderer)->marginBottom(), style.get()); return CSSPrimitiveValue::create(style->marginBottom()); case CSSPropertyMarginLeft: if (renderer && renderer->isBox()) // FIXME: Supposed to return the percentage if percentage was specified. return zoomAdjustedPixelValue(toRenderBox(renderer)->marginLeft(), style.get()); return CSSPrimitiveValue::create(style->marginLeft()); case CSSPropertyWebkitMarqueeDirection: return CSSPrimitiveValue::create(style->marqueeDirection()); case CSSPropertyWebkitMarqueeIncrement: return CSSPrimitiveValue::create(style->marqueeIncrement()); case CSSPropertyWebkitMarqueeRepetition: if (style->marqueeLoopCount() < 0) return CSSPrimitiveValue::createIdentifier(CSSValueInfinite); return CSSPrimitiveValue::create(style->marqueeLoopCount(), CSSPrimitiveValue::CSS_NUMBER); case CSSPropertyWebkitMarqueeStyle: return CSSPrimitiveValue::create(style->marqueeBehavior()); case CSSPropertyWebkitUserModify: return CSSPrimitiveValue::create(style->userModify()); case CSSPropertyMaxHeight: { const Length& maxHeight = style->maxHeight(); if (maxHeight.isFixed() && maxHeight.value() == undefinedLength) return CSSPrimitiveValue::createIdentifier(CSSValueNone); return CSSPrimitiveValue::create(maxHeight); } case CSSPropertyMaxWidth: { const Length& maxWidth = style->maxWidth(); if (maxWidth.isFixed() && maxWidth.value() == undefinedLength) return CSSPrimitiveValue::createIdentifier(CSSValueNone); return CSSPrimitiveValue::create(maxWidth); } case CSSPropertyMinHeight: return CSSPrimitiveValue::create(style->minHeight()); case CSSPropertyMinWidth: return CSSPrimitiveValue::create(style->minWidth()); case CSSPropertyOpacity: return CSSPrimitiveValue::create(style->opacity(), CSSPrimitiveValue::CSS_NUMBER); case CSSPropertyOrphans: return CSSPrimitiveValue::create(style->orphans(), CSSPrimitiveValue::CSS_NUMBER); case CSSPropertyOutlineColor: return m_allowVisitedStyle ? CSSPrimitiveValue::createColor(style->visitedDependentColor(CSSPropertyOutlineColor).rgb()) : currentColorOrValidColor(style.get(), style->outlineColor()); case CSSPropertyOutlineStyle: if (style->outlineStyleIsAuto()) return CSSPrimitiveValue::createIdentifier(CSSValueAuto); return CSSPrimitiveValue::create(style->outlineStyle()); case CSSPropertyOutlineWidth: return zoomAdjustedPixelValue(style->outlineWidth(), style.get()); case CSSPropertyOverflow: return CSSPrimitiveValue::create(max(style->overflowX(), style->overflowY())); case CSSPropertyOverflowX: return CSSPrimitiveValue::create(style->overflowX()); case CSSPropertyOverflowY: #ifdef ANDROID_LAYOUT if (settings && settings->layoutAlgorithm() == Settings::kLayoutSSR) return CSSPrimitiveValue::createIdentifier(CSSValueVisible); #endif return CSSPrimitiveValue::create(style->overflowY()); case CSSPropertyPaddingTop: if (renderer && renderer->isBox()) return zoomAdjustedPixelValue(toRenderBox(renderer)->paddingTop(false), style.get()); return CSSPrimitiveValue::create(style->paddingTop()); case CSSPropertyPaddingRight: if (renderer && renderer->isBox()) return zoomAdjustedPixelValue(toRenderBox(renderer)->paddingRight(false), style.get()); return CSSPrimitiveValue::create(style->paddingRight()); case CSSPropertyPaddingBottom: if (renderer && renderer->isBox()) return zoomAdjustedPixelValue(toRenderBox(renderer)->paddingBottom(false), style.get()); return CSSPrimitiveValue::create(style->paddingBottom()); case CSSPropertyPaddingLeft: if (renderer && renderer->isBox()) return zoomAdjustedPixelValue(toRenderBox(renderer)->paddingLeft(false), style.get()); return CSSPrimitiveValue::create(style->paddingLeft()); case CSSPropertyPageBreakAfter: return CSSPrimitiveValue::create(style->pageBreakAfter()); case CSSPropertyPageBreakBefore: return CSSPrimitiveValue::create(style->pageBreakBefore()); case CSSPropertyPageBreakInside: { EPageBreak pageBreak = style->pageBreakInside(); ASSERT(pageBreak != PBALWAYS); if (pageBreak == PBALWAYS) return 0; return CSSPrimitiveValue::create(style->pageBreakInside()); } case CSSPropertyPosition: #ifdef ANDROID_LAYOUT if (settings && settings->layoutAlgorithm() == Settings::kLayoutSSR) return CSSPrimitiveValue::createIdentifier(CSSValueStatic); #endif return CSSPrimitiveValue::create(style->position()); case CSSPropertyRight: return getPositionOffsetValue(style.get(), CSSPropertyRight); case CSSPropertyTableLayout: return CSSPrimitiveValue::create(style->tableLayout()); case CSSPropertyTextAlign: return CSSPrimitiveValue::create(style->textAlign()); case CSSPropertyTextDecoration: return renderTextDecorationFlagsToCSSValue(style->textDecoration()); case CSSPropertyWebkitTextDecorationsInEffect: return renderTextDecorationFlagsToCSSValue(style->textDecorationsInEffect()); case CSSPropertyWebkitTextFillColor: return currentColorOrValidColor(style.get(), style->textFillColor()); case CSSPropertyTextIndent: return CSSPrimitiveValue::create(style->textIndent()); case CSSPropertyTextShadow: return valueForShadow(style->textShadow(), propertyID, style.get()); case CSSPropertyTextRendering: return CSSPrimitiveValue::create(style->fontDescription().textRenderingMode()); case CSSPropertyTextOverflow: if (style->textOverflow()) return CSSPrimitiveValue::createIdentifier(CSSValueEllipsis); return CSSPrimitiveValue::createIdentifier(CSSValueClip); case CSSPropertyWebkitTextSecurity: return CSSPrimitiveValue::create(style->textSecurity()); case CSSPropertyWebkitTextSizeAdjust: if (style->textSizeAdjust()) return CSSPrimitiveValue::createIdentifier(CSSValueAuto); return CSSPrimitiveValue::createIdentifier(CSSValueNone); case CSSPropertyWebkitTextStrokeColor: return currentColorOrValidColor(style.get(), style->textStrokeColor()); case CSSPropertyWebkitTextStrokeWidth: return zoomAdjustedPixelValue(style->textStrokeWidth(), style.get()); case CSSPropertyTextTransform: return CSSPrimitiveValue::create(style->textTransform()); case CSSPropertyTop: return getPositionOffsetValue(style.get(), CSSPropertyTop); case CSSPropertyUnicodeBidi: return CSSPrimitiveValue::create(style->unicodeBidi()); case CSSPropertyVerticalAlign: switch (style->verticalAlign()) { case BASELINE: return CSSPrimitiveValue::createIdentifier(CSSValueBaseline); case MIDDLE: return CSSPrimitiveValue::createIdentifier(CSSValueMiddle); case SUB: return CSSPrimitiveValue::createIdentifier(CSSValueSub); case SUPER: return CSSPrimitiveValue::createIdentifier(CSSValueSuper); case TEXT_TOP: return CSSPrimitiveValue::createIdentifier(CSSValueTextTop); case TEXT_BOTTOM: return CSSPrimitiveValue::createIdentifier(CSSValueTextBottom); case TOP: return CSSPrimitiveValue::createIdentifier(CSSValueTop); case BOTTOM: return CSSPrimitiveValue::createIdentifier(CSSValueBottom); case BASELINE_MIDDLE: return CSSPrimitiveValue::createIdentifier(CSSValueWebkitBaselineMiddle); case LENGTH: return CSSPrimitiveValue::create(style->verticalAlignLength()); } ASSERT_NOT_REACHED(); return 0; case CSSPropertyVisibility: #ifdef ANDROID_LAYOUT if (settings && settings->layoutAlgorithm() == Settings::kLayoutSSR) return CSSPrimitiveValue::createIdentifier(CSSValueVisible); #endif return CSSPrimitiveValue::create(style->visibility()); case CSSPropertyWhiteSpace: #ifdef ANDROID_LAYOUT if (settings && settings->layoutAlgorithm() == Settings::kLayoutSSR) switch (style->whiteSpace()) { case NORMAL: case NOWRAP: case KHTML_NOWRAP: return CSSPrimitiveValue::createIdentifier(CSSValueNormal); case PRE: case PRE_WRAP: return CSSPrimitiveValue::createIdentifier(CSSValuePreWrap); case PRE_LINE: return CSSPrimitiveValue::createIdentifier(CSSValuePreLine); } else #endif return CSSPrimitiveValue::create(style->whiteSpace()); case CSSPropertyWidows: return CSSPrimitiveValue::create(style->widows(), CSSPrimitiveValue::CSS_NUMBER); case CSSPropertyWidth: if (renderer) return zoomAdjustedPixelValue(sizingBox(renderer).width(), style.get()); return CSSPrimitiveValue::create(style->width()); case CSSPropertyWordBreak: return CSSPrimitiveValue::create(style->wordBreak()); case CSSPropertyWordSpacing: return zoomAdjustedPixelValue(style->wordSpacing(), style.get()); case CSSPropertyWordWrap: return CSSPrimitiveValue::create(style->wordWrap()); case CSSPropertyWebkitLineBreak: return CSSPrimitiveValue::create(style->khtmlLineBreak()); case CSSPropertyWebkitNbspMode: return CSSPrimitiveValue::create(style->nbspMode()); case CSSPropertyWebkitMatchNearestMailBlockquoteColor: return CSSPrimitiveValue::create(style->matchNearestMailBlockquoteColor()); case CSSPropertyResize: return CSSPrimitiveValue::create(style->resize()); case CSSPropertyWebkitFontSmoothing: return CSSPrimitiveValue::create(style->fontDescription().fontSmoothing()); case CSSPropertyZIndex: if (style->hasAutoZIndex()) return CSSPrimitiveValue::createIdentifier(CSSValueAuto); return CSSPrimitiveValue::create(style->zIndex(), CSSPrimitiveValue::CSS_NUMBER); case CSSPropertyZoom: return CSSPrimitiveValue::create(style->zoom(), CSSPrimitiveValue::CSS_NUMBER); case CSSPropertyBoxSizing: if (style->boxSizing() == CONTENT_BOX) return CSSPrimitiveValue::createIdentifier(CSSValueContentBox); return CSSPrimitiveValue::createIdentifier(CSSValueBorderBox); #if ENABLE(DASHBOARD_SUPPORT) case CSSPropertyWebkitDashboardRegion: { const Vector& regions = style->dashboardRegions(); unsigned count = regions.size(); if (count == 1 && regions[0].type == StyleDashboardRegion::None) return CSSPrimitiveValue::createIdentifier(CSSValueNone); RefPtr firstRegion; DashboardRegion* previousRegion = 0; for (unsigned i = 0; i < count; i++) { RefPtr region = DashboardRegion::create(); StyleDashboardRegion styleRegion = regions[i]; region->m_label = styleRegion.label; LengthBox offset = styleRegion.offset; region->setTop(zoomAdjustedPixelValue(offset.top().value(), style.get())); region->setRight(zoomAdjustedPixelValue(offset.right().value(), style.get())); region->setBottom(zoomAdjustedPixelValue(offset.bottom().value(), style.get())); region->setLeft(zoomAdjustedPixelValue(offset.left().value(), style.get())); region->m_isRectangle = (styleRegion.type == StyleDashboardRegion::Rectangle); region->m_isCircle = (styleRegion.type == StyleDashboardRegion::Circle); if (previousRegion) previousRegion->m_next = region; else firstRegion = region; previousRegion = region.get(); } return CSSPrimitiveValue::create(firstRegion.release()); } #endif case CSSPropertyWebkitAnimationDelay: return getDelayValue(style->animations()); case CSSPropertyWebkitAnimationDirection: { RefPtr list = CSSValueList::createCommaSeparated(); const AnimationList* t = style->animations(); if (t) { for (size_t i = 0; i < t->size(); ++i) { if (t->animation(i)->direction()) list->append(CSSPrimitiveValue::createIdentifier(CSSValueAlternate)); else list->append(CSSPrimitiveValue::createIdentifier(CSSValueNormal)); } } else list->append(CSSPrimitiveValue::createIdentifier(CSSValueNormal)); return list.release(); } case CSSPropertyWebkitAnimationDuration: return getDurationValue(style->animations()); case CSSPropertyWebkitAnimationFillMode: { RefPtr list = CSSValueList::createCommaSeparated(); const AnimationList* t = style->animations(); if (t) { for (size_t i = 0; i < t->size(); ++i) { switch (t->animation(i)->fillMode()) { case AnimationFillModeNone: list->append(CSSPrimitiveValue::createIdentifier(CSSValueNone)); break; case AnimationFillModeForwards: list->append(CSSPrimitiveValue::createIdentifier(CSSValueForwards)); break; case AnimationFillModeBackwards: list->append(CSSPrimitiveValue::createIdentifier(CSSValueBackwards)); break; case AnimationFillModeBoth: list->append(CSSPrimitiveValue::createIdentifier(CSSValueBoth)); break; } } } else list->append(CSSPrimitiveValue::createIdentifier(CSSValueNone)); return list.release(); } case CSSPropertyWebkitAnimationIterationCount: { RefPtr list = CSSValueList::createCommaSeparated(); const AnimationList* t = style->animations(); if (t) { for (size_t i = 0; i < t->size(); ++i) { int iterationCount = t->animation(i)->iterationCount(); if (iterationCount == Animation::IterationCountInfinite) list->append(CSSPrimitiveValue::createIdentifier(CSSValueInfinite)); else list->append(CSSPrimitiveValue::create(iterationCount, CSSPrimitiveValue::CSS_NUMBER)); } } else list->append(CSSPrimitiveValue::create(Animation::initialAnimationIterationCount(), CSSPrimitiveValue::CSS_NUMBER)); return list.release(); } case CSSPropertyWebkitAnimationName: { RefPtr list = CSSValueList::createCommaSeparated(); const AnimationList* t = style->animations(); if (t) { for (size_t i = 0; i < t->size(); ++i) list->append(CSSPrimitiveValue::create(t->animation(i)->name(), CSSPrimitiveValue::CSS_STRING)); } else list->append(CSSPrimitiveValue::createIdentifier(CSSValueNone)); return list.release(); } case CSSPropertyWebkitAnimationPlayState: { RefPtr list = CSSValueList::createCommaSeparated(); const AnimationList* t = style->animations(); if (t) { for (size_t i = 0; i < t->size(); ++i) { int prop = t->animation(i)->playState(); if (prop == AnimPlayStatePlaying) list->append(CSSPrimitiveValue::createIdentifier(CSSValueRunning)); else list->append(CSSPrimitiveValue::createIdentifier(CSSValuePaused)); } } else list->append(CSSPrimitiveValue::createIdentifier(CSSValueRunning)); return list.release(); } case CSSPropertyWebkitAnimationTimingFunction: return getTimingFunctionValue(style->animations()); case CSSPropertyWebkitAppearance: return CSSPrimitiveValue::create(style->appearance()); case CSSPropertyWebkitBackfaceVisibility: return CSSPrimitiveValue::createIdentifier((style->backfaceVisibility() == BackfaceVisibilityHidden) ? CSSValueHidden : CSSValueVisible); case CSSPropertyWebkitBorderImage: return valueForNinePieceImage(style->borderImage()); case CSSPropertyWebkitMaskBoxImage: return valueForNinePieceImage(style->maskBoxImage()); case CSSPropertyWebkitFontSizeDelta: // Not a real style property -- used by the editing engine -- so has no computed value. break; case CSSPropertyWebkitMarginBottomCollapse: case CSSPropertyWebkitMarginAfterCollapse: return CSSPrimitiveValue::create(style->marginAfterCollapse()); case CSSPropertyWebkitMarginTopCollapse: case CSSPropertyWebkitMarginBeforeCollapse: return CSSPrimitiveValue::create(style->marginBeforeCollapse()); case CSSPropertyWebkitPerspective: if (!style->hasPerspective()) return CSSPrimitiveValue::createIdentifier(CSSValueNone); return CSSPrimitiveValue::create(style->perspective(), CSSPrimitiveValue::CSS_NUMBER); case CSSPropertyWebkitPerspectiveOrigin: { RefPtr list = CSSValueList::createSpaceSeparated(); if (renderer) { IntRect box = sizingBox(renderer); list->append(zoomAdjustedPixelValue(style->perspectiveOriginX().calcMinValue(box.width()), style.get())); list->append(zoomAdjustedPixelValue(style->perspectiveOriginY().calcMinValue(box.height()), style.get())); } else { list->append(CSSPrimitiveValue::create(style->perspectiveOriginX())); list->append(CSSPrimitiveValue::create(style->perspectiveOriginY())); } return list.release(); } case CSSPropertyWebkitRtlOrdering: if (style->visuallyOrdered()) return CSSPrimitiveValue::createIdentifier(CSSValueVisual); return CSSPrimitiveValue::createIdentifier(CSSValueLogical); case CSSPropertyWebkitUserDrag: return CSSPrimitiveValue::create(style->userDrag()); case CSSPropertyWebkitUserSelect: return CSSPrimitiveValue::create(style->userSelect()); case CSSPropertyBorderBottomLeftRadius: return getBorderRadiusCornerValue(style->borderBottomLeftRadius(), style.get()); case CSSPropertyBorderBottomRightRadius: return getBorderRadiusCornerValue(style->borderBottomRightRadius(), style.get()); case CSSPropertyBorderTopLeftRadius: return getBorderRadiusCornerValue(style->borderTopLeftRadius(), style.get()); case CSSPropertyBorderTopRightRadius: return getBorderRadiusCornerValue(style->borderTopRightRadius(), style.get()); case CSSPropertyClip: { if (!style->hasClip()) return CSSPrimitiveValue::createIdentifier(CSSValueAuto); RefPtr rect = Rect::create(); rect->setTop(zoomAdjustedPixelValue(style->clip().top().value(), style.get())); rect->setRight(zoomAdjustedPixelValue(style->clip().right().value(), style.get())); rect->setBottom(zoomAdjustedPixelValue(style->clip().bottom().value(), style.get())); rect->setLeft(zoomAdjustedPixelValue(style->clip().left().value(), style.get())); return CSSPrimitiveValue::create(rect.release()); } case CSSPropertySpeak: return CSSPrimitiveValue::create(style->speak()); case CSSPropertyWebkitTransform: return computedTransform(renderer, style.get()); case CSSPropertyWebkitTransformOrigin: { RefPtr list = CSSValueList::createSpaceSeparated(); if (renderer) { IntRect box = sizingBox(renderer); list->append(zoomAdjustedPixelValue(style->transformOriginX().calcMinValue(box.width()), style.get())); list->append(zoomAdjustedPixelValue(style->transformOriginY().calcMinValue(box.height()), style.get())); if (style->transformOriginZ() != 0) list->append(zoomAdjustedPixelValue(style->transformOriginZ(), style.get())); } else { list->append(CSSPrimitiveValue::create(style->transformOriginX())); list->append(CSSPrimitiveValue::create(style->transformOriginY())); if (style->transformOriginZ() != 0) list->append(zoomAdjustedPixelValue(style->transformOriginZ(), style.get())); } return list.release(); } case CSSPropertyWebkitTransformStyle: return CSSPrimitiveValue::createIdentifier((style->transformStyle3D() == TransformStyle3DPreserve3D) ? CSSValuePreserve3d : CSSValueFlat); case CSSPropertyWebkitTransitionDelay: return getDelayValue(style->transitions()); case CSSPropertyWebkitTransitionDuration: return getDurationValue(style->transitions()); case CSSPropertyWebkitTransitionProperty: { RefPtr list = CSSValueList::createCommaSeparated(); const AnimationList* t = style->transitions(); if (t) { for (size_t i = 0; i < t->size(); ++i) { int prop = t->animation(i)->property(); RefPtr propertyValue; if (prop == cAnimateNone) propertyValue = CSSPrimitiveValue::createIdentifier(CSSValueNone); else if (prop == cAnimateAll) propertyValue = CSSPrimitiveValue::createIdentifier(CSSValueAll); else propertyValue = CSSPrimitiveValue::create(getPropertyName(static_cast(prop)), CSSPrimitiveValue::CSS_STRING); list->append(propertyValue); } } else list->append(CSSPrimitiveValue::createIdentifier(CSSValueAll)); return list.release(); } case CSSPropertyWebkitTransitionTimingFunction: return getTimingFunctionValue(style->transitions()); case CSSPropertyPointerEvents: return CSSPrimitiveValue::create(style->pointerEvents()); case CSSPropertyWebkitColorCorrection: return CSSPrimitiveValue::create(style->colorSpace()); case CSSPropertyWebkitWritingMode: return CSSPrimitiveValue::create(style->writingMode()); case CSSPropertyWebkitTextCombine: return CSSPrimitiveValue::create(style->textCombine()); /* Shorthand properties, currently not supported see bug 13658*/ case CSSPropertyBackground: case CSSPropertyBorder: case CSSPropertyBorderBottom: case CSSPropertyBorderColor: case CSSPropertyBorderLeft: case CSSPropertyBorderRadius: case CSSPropertyBorderRight: case CSSPropertyBorderStyle: case CSSPropertyBorderTop: case CSSPropertyBorderWidth: case CSSPropertyFont: case CSSPropertyListStyle: case CSSPropertyMargin: case CSSPropertyPadding: break; /* Unimplemented CSS 3 properties (including CSS3 shorthand properties) */ case CSSPropertyTextLineThrough: case CSSPropertyTextLineThroughColor: case CSSPropertyTextLineThroughMode: case CSSPropertyTextLineThroughStyle: case CSSPropertyTextLineThroughWidth: case CSSPropertyTextOverline: case CSSPropertyTextOverlineColor: case CSSPropertyTextOverlineMode: case CSSPropertyTextOverlineStyle: case CSSPropertyTextOverlineWidth: case CSSPropertyTextUnderline: case CSSPropertyTextUnderlineColor: case CSSPropertyTextUnderlineMode: case CSSPropertyTextUnderlineStyle: case CSSPropertyTextUnderlineWidth: break; /* Directional properties are resolved by resolveDirectionAwareProperty() before the switch. */ case CSSPropertyWebkitBorderEnd: case CSSPropertyWebkitBorderEndColor: case CSSPropertyWebkitBorderEndStyle: case CSSPropertyWebkitBorderEndWidth: case CSSPropertyWebkitBorderStart: case CSSPropertyWebkitBorderStartColor: case CSSPropertyWebkitBorderStartStyle: case CSSPropertyWebkitBorderStartWidth: case CSSPropertyWebkitBorderAfter: case CSSPropertyWebkitBorderAfterColor: case CSSPropertyWebkitBorderAfterStyle: case CSSPropertyWebkitBorderAfterWidth: case CSSPropertyWebkitBorderBefore: case CSSPropertyWebkitBorderBeforeColor: case CSSPropertyWebkitBorderBeforeStyle: case CSSPropertyWebkitBorderBeforeWidth: case CSSPropertyWebkitMarginEnd: case CSSPropertyWebkitMarginStart: case CSSPropertyWebkitMarginAfter: case CSSPropertyWebkitMarginBefore: case CSSPropertyWebkitPaddingEnd: case CSSPropertyWebkitPaddingStart: case CSSPropertyWebkitPaddingAfter: case CSSPropertyWebkitPaddingBefore: case CSSPropertyWebkitLogicalWidth: case CSSPropertyWebkitLogicalHeight: case CSSPropertyWebkitMinLogicalWidth: case CSSPropertyWebkitMinLogicalHeight: case CSSPropertyWebkitMaxLogicalWidth: case CSSPropertyWebkitMaxLogicalHeight: ASSERT_NOT_REACHED(); break; /* Unimplemented @font-face properties */ case CSSPropertyFontStretch: case CSSPropertySrc: case CSSPropertyUnicodeRange: break; /* Other unimplemented properties */ case CSSPropertyBackgroundRepeatX: case CSSPropertyBackgroundRepeatY: case CSSPropertyContent: // FIXME: needs implementation, bug 23668 case CSSPropertyCounterIncrement: case CSSPropertyCounterReset: case CSSPropertyOutline: // FIXME: needs implementation case CSSPropertyOutlineOffset: // FIXME: needs implementation case CSSPropertyPage: // for @page case CSSPropertyQuotes: // FIXME: needs implementation case CSSPropertySize: // for @page break; /* Unimplemented -webkit- properties */ case CSSPropertyWebkitAnimation: case CSSPropertyWebkitBorderRadius: case CSSPropertyWebkitColumns: case CSSPropertyWebkitColumnRule: case CSSPropertyWebkitMarginCollapse: case CSSPropertyWebkitMarquee: case CSSPropertyWebkitMarqueeSpeed: case CSSPropertyWebkitMask: case CSSPropertyWebkitMaskRepeatX: case CSSPropertyWebkitMaskRepeatY: case CSSPropertyWebkitPerspectiveOriginX: case CSSPropertyWebkitPerspectiveOriginY: case CSSPropertyWebkitTextStroke: case CSSPropertyWebkitTransformOriginX: case CSSPropertyWebkitTransformOriginY: case CSSPropertyWebkitTransformOriginZ: case CSSPropertyWebkitTransition: break; #ifdef ANDROID_CSS_RING case CSSPropertyWebkitRing: // shorthand property currently not supported see bug 13658 break; case CSSPropertyWebkitRingFillColor: return CSSPrimitiveValue::createColor(style->ringFillColor().rgb()); case CSSPropertyWebkitRingInnerWidth: return CSSPrimitiveValue::create(style->ringInnerWidth()); case CSSPropertyWebkitRingOuterWidth: return CSSPrimitiveValue::create(style->ringOuterWidth()); case CSSPropertyWebkitRingOutset: return CSSPrimitiveValue::create(style->ringOutset()); case CSSPropertyWebkitRingPressedInnerColor: return CSSPrimitiveValue::createColor(style->ringPressedInnerColor().rgb()); case CSSPropertyWebkitRingPressedOuterColor: return CSSPrimitiveValue::createColor(style->ringPressedOuterColor().rgb()); case CSSPropertyWebkitRingRadius: return CSSPrimitiveValue::create(style->ringRadius()); case CSSPropertyWebkitRingSelectedInnerColor: return CSSPrimitiveValue::createColor(style->ringSelectedInnerColor().rgb()); case CSSPropertyWebkitRingSelectedOuterColor: return CSSPrimitiveValue::createColor(style->ringSelectedOuterColor().rgb()); #endif #ifdef ANDROID_CSS_TAP_HIGHLIGHT_COLOR case CSSPropertyWebkitTapHighlightColor: return CSSPrimitiveValue::createColor(style->tapHighlightColor().rgb()); #endif #if ENABLE(SVG) case CSSPropertyClipPath: case CSSPropertyClipRule: case CSSPropertyMask: case CSSPropertyEnableBackground: case CSSPropertyFilter: case CSSPropertyFloodColor: case CSSPropertyFloodOpacity: case CSSPropertyLightingColor: case CSSPropertyStopColor: case CSSPropertyStopOpacity: case CSSPropertyColorInterpolation: case CSSPropertyColorInterpolationFilters: case CSSPropertyColorProfile: case CSSPropertyColorRendering: case CSSPropertyFill: case CSSPropertyFillOpacity: case CSSPropertyFillRule: case CSSPropertyImageRendering: case CSSPropertyMarker: case CSSPropertyMarkerEnd: case CSSPropertyMarkerMid: case CSSPropertyMarkerStart: case CSSPropertyShapeRendering: case CSSPropertyStroke: case CSSPropertyStrokeDasharray: case CSSPropertyStrokeDashoffset: case CSSPropertyStrokeLinecap: case CSSPropertyStrokeLinejoin: case CSSPropertyStrokeMiterlimit: case CSSPropertyStrokeOpacity: case CSSPropertyStrokeWidth: case CSSPropertyAlignmentBaseline: case CSSPropertyBaselineShift: case CSSPropertyDominantBaseline: case CSSPropertyGlyphOrientationHorizontal: case CSSPropertyGlyphOrientationVertical: case CSSPropertyKerning: case CSSPropertyTextAnchor: case CSSPropertyVectorEffect: case CSSPropertyWritingMode: case CSSPropertyWebkitSvgShadow: return getSVGPropertyCSSValue(propertyID, DoNotUpdateLayout); #endif } logUnimplementedPropertyID(propertyID); return 0; } String CSSComputedStyleDeclaration::getPropertyValue(int propertyID) const { RefPtr value = getPropertyCSSValue(propertyID); if (value) return value->cssText(); return ""; } bool CSSComputedStyleDeclaration::getPropertyPriority(int /*propertyID*/) const { // All computed styles have a priority of false (not "important"). return false; } String CSSComputedStyleDeclaration::removeProperty(int /*propertyID*/, ExceptionCode& ec) { ec = NO_MODIFICATION_ALLOWED_ERR; return String(); } void CSSComputedStyleDeclaration::setProperty(int /*propertyID*/, const String& /*value*/, bool /*important*/, ExceptionCode& ec) { ec = NO_MODIFICATION_ALLOWED_ERR; } unsigned CSSComputedStyleDeclaration::virtualLength() const { Node* node = m_node.get(); if (!node) return 0; RenderStyle* style = node->computedStyle(m_pseudoElementSpecifier); if (!style) return 0; return numComputedProperties; } String CSSComputedStyleDeclaration::item(unsigned i) const { if (i >= length()) return ""; return getPropertyName(static_cast(computedProperties[i])); } bool CSSComputedStyleDeclaration::cssPropertyMatches(const CSSProperty* property) const { if (property->id() == CSSPropertyFontSize && property->value()->isPrimitiveValue() && m_node) { m_node->document()->updateLayoutIgnorePendingStylesheets(); RenderStyle* style = m_node->computedStyle(m_pseudoElementSpecifier); if (style && style->fontDescription().keywordSize()) { int sizeValue = cssIdentifierForFontSizeKeyword(style->fontDescription().keywordSize()); CSSPrimitiveValue* primitiveValue = static_cast(property->value()); if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_IDENT && primitiveValue->getIdent() == sizeValue) return true; } } return CSSStyleDeclaration::cssPropertyMatches(property); } PassRefPtr CSSComputedStyleDeclaration::copy() const { return copyPropertiesInSet(computedProperties, numComputedProperties); } PassRefPtr CSSComputedStyleDeclaration::makeMutable() { return copy(); } } // namespace WebCore