Home | History | Annotate | Download | only in css
      1 /*
      2  * Copyright (C) 2004 Zack Rusin <zack (at) kde.org>
      3  * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
      4  * Copyright (C) 2007 Alexey Proskuryakov <ap (at) webkit.org>
      5  * Copyright (C) 2007 Nicholas Shanks <webkit (at) nickshanks.com>
      6  *
      7  * This library is free software; you can redistribute it and/or
      8  * modify it under the terms of the GNU Lesser General Public
      9  * License as published by the Free Software Foundation; either
     10  * version 2 of the License, or (at your option) any later version.
     11  *
     12  * This library is distributed in the hope that it will be useful,
     13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     15  * Lesser General Public License for more details.
     16  *
     17  * You should have received a copy of the GNU Lesser General Public
     18  * License along with this library; if not, write to the Free Software
     19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
     20  * 02110-1301  USA
     21  */
     22 
     23 #include "config.h"
     24 #include "CSSComputedStyleDeclaration.h"
     25 
     26 #include "AnimationController.h"
     27 #include "CSSBorderImageValue.h"
     28 #include "CSSMutableStyleDeclaration.h"
     29 #include "CSSPrimitiveValue.h"
     30 #include "CSSPrimitiveValueMappings.h"
     31 #include "CSSProperty.h"
     32 #include "CSSPropertyNames.h"
     33 #include "CSSReflectValue.h"
     34 #include "CSSTimingFunctionValue.h"
     35 #include "CSSValueList.h"
     36 #include "Document.h"
     37 #include "ExceptionCode.h"
     38 #include "Rect.h"
     39 #include "RenderBox.h"
     40 #include "RenderLayer.h"
     41 #include "ShadowValue.h"
     42 #ifdef ANDROID_LAYOUT
     43 #include "Frame.h"
     44 #include "Settings.h"
     45 #endif
     46 #include "WebKitCSSTransformValue.h"
     47 
     48 #if ENABLE(DASHBOARD_SUPPORT)
     49 #include "DashboardRegion.h"
     50 #endif
     51 
     52 namespace WebCore {
     53 
     54 // List of all properties we know how to compute, omitting shorthands.
     55 static const int computedProperties[] = {
     56     CSSPropertyBackgroundAttachment,
     57     CSSPropertyBackgroundClip,
     58     CSSPropertyBackgroundColor,
     59     CSSPropertyBackgroundImage,
     60     CSSPropertyBackgroundOrigin,
     61     CSSPropertyBackgroundPosition, // more-specific background-position-x/y are non-standard
     62     CSSPropertyBackgroundRepeat,
     63     CSSPropertyBackgroundSize,
     64     CSSPropertyBorderBottomColor,
     65     CSSPropertyBorderBottomLeftRadius,
     66     CSSPropertyBorderBottomRightRadius,
     67     CSSPropertyBorderBottomStyle,
     68     CSSPropertyBorderBottomWidth,
     69     CSSPropertyBorderCollapse,
     70     CSSPropertyBorderLeftColor,
     71     CSSPropertyBorderLeftStyle,
     72     CSSPropertyBorderLeftWidth,
     73     CSSPropertyBorderRightColor,
     74     CSSPropertyBorderRightStyle,
     75     CSSPropertyBorderRightWidth,
     76     CSSPropertyBorderTopColor,
     77     CSSPropertyBorderTopLeftRadius,
     78     CSSPropertyBorderTopRightRadius,
     79     CSSPropertyBorderTopStyle,
     80     CSSPropertyBorderTopWidth,
     81     CSSPropertyBottom,
     82     CSSPropertyCaptionSide,
     83     CSSPropertyClear,
     84     CSSPropertyClip,
     85     CSSPropertyColor,
     86     CSSPropertyCursor,
     87     CSSPropertyDirection,
     88     CSSPropertyDisplay,
     89     CSSPropertyEmptyCells,
     90     CSSPropertyFloat,
     91     CSSPropertyFontFamily,
     92     CSSPropertyFontSize,
     93     CSSPropertyFontStyle,
     94     CSSPropertyFontVariant,
     95     CSSPropertyFontWeight,
     96     CSSPropertyHeight,
     97     CSSPropertyLeft,
     98     CSSPropertyLetterSpacing,
     99     CSSPropertyLineHeight,
    100     CSSPropertyListStyleImage,
    101     CSSPropertyListStylePosition,
    102     CSSPropertyListStyleType,
    103     CSSPropertyMarginBottom,
    104     CSSPropertyMarginLeft,
    105     CSSPropertyMarginRight,
    106     CSSPropertyMarginTop,
    107     CSSPropertyMaxHeight,
    108     CSSPropertyMaxWidth,
    109     CSSPropertyMinHeight,
    110     CSSPropertyMinWidth,
    111     CSSPropertyOpacity,
    112     CSSPropertyOrphans,
    113     CSSPropertyOutlineColor,
    114     CSSPropertyOutlineStyle,
    115     CSSPropertyOutlineWidth,
    116     CSSPropertyOverflowX,
    117     CSSPropertyOverflowY,
    118     CSSPropertyPaddingBottom,
    119     CSSPropertyPaddingLeft,
    120     CSSPropertyPaddingRight,
    121     CSSPropertyPaddingTop,
    122     CSSPropertyPageBreakAfter,
    123     CSSPropertyPageBreakBefore,
    124     CSSPropertyPageBreakInside,
    125     CSSPropertyPointerEvents,
    126     CSSPropertyPosition,
    127     CSSPropertyResize,
    128     CSSPropertyRight,
    129     CSSPropertyTableLayout,
    130     CSSPropertyTextAlign,
    131     CSSPropertyTextDecoration,
    132     CSSPropertyTextIndent,
    133     CSSPropertyTextRendering,
    134     CSSPropertyTextShadow,
    135     CSSPropertyTextOverflow,
    136     CSSPropertyTextTransform,
    137     CSSPropertyTop,
    138     CSSPropertyUnicodeBidi,
    139     CSSPropertyVerticalAlign,
    140     CSSPropertyVisibility,
    141     CSSPropertyWhiteSpace,
    142     CSSPropertyWidows,
    143     CSSPropertyWidth,
    144     CSSPropertyWordBreak,
    145     CSSPropertyWordSpacing,
    146     CSSPropertyWordWrap,
    147     CSSPropertyZIndex,
    148     CSSPropertyZoom,
    149 
    150     CSSPropertyWebkitAnimationDelay,
    151     CSSPropertyWebkitAnimationDirection,
    152     CSSPropertyWebkitAnimationDuration,
    153     CSSPropertyWebkitAnimationIterationCount,
    154     CSSPropertyWebkitAnimationName,
    155     CSSPropertyWebkitAnimationPlayState,
    156     CSSPropertyWebkitAnimationTimingFunction,
    157     CSSPropertyWebkitAppearance,
    158     CSSPropertyWebkitBackfaceVisibility,
    159     CSSPropertyWebkitBackgroundClip,
    160     CSSPropertyWebkitBackgroundComposite,
    161     CSSPropertyWebkitBackgroundOrigin,
    162     CSSPropertyWebkitBackgroundSize,
    163     CSSPropertyWebkitBorderFit,
    164     CSSPropertyWebkitBorderHorizontalSpacing,
    165     CSSPropertyWebkitBorderImage,
    166     CSSPropertyWebkitBorderVerticalSpacing,
    167     CSSPropertyWebkitBoxAlign,
    168     CSSPropertyWebkitBoxDirection,
    169     CSSPropertyWebkitBoxFlex,
    170     CSSPropertyWebkitBoxFlexGroup,
    171     CSSPropertyWebkitBoxLines,
    172     CSSPropertyWebkitBoxOrdinalGroup,
    173     CSSPropertyWebkitBoxOrient,
    174     CSSPropertyWebkitBoxPack,
    175     CSSPropertyWebkitBoxReflect,
    176     CSSPropertyWebkitBoxShadow,
    177     CSSPropertyWebkitBoxSizing,
    178     CSSPropertyWebkitColorCorrection,
    179     CSSPropertyWebkitColumnBreakAfter,
    180     CSSPropertyWebkitColumnBreakBefore,
    181     CSSPropertyWebkitColumnBreakInside,
    182     CSSPropertyWebkitColumnCount,
    183     CSSPropertyWebkitColumnGap,
    184     CSSPropertyWebkitColumnRuleColor,
    185     CSSPropertyWebkitColumnRuleStyle,
    186     CSSPropertyWebkitColumnRuleWidth,
    187     CSSPropertyWebkitColumnWidth,
    188 #if ENABLE(DASHBOARD_SUPPORT)
    189     CSSPropertyWebkitDashboardRegion,
    190 #endif
    191     CSSPropertyWebkitFontSmoothing,
    192     CSSPropertyWebkitHighlight,
    193     CSSPropertyWebkitLineBreak,
    194     CSSPropertyWebkitLineClamp,
    195     CSSPropertyWebkitMarginBottomCollapse,
    196     CSSPropertyWebkitMarginTopCollapse,
    197     CSSPropertyWebkitMarqueeDirection,
    198     CSSPropertyWebkitMarqueeIncrement,
    199     CSSPropertyWebkitMarqueeRepetition,
    200     CSSPropertyWebkitMarqueeStyle,
    201     CSSPropertyWebkitMaskAttachment,
    202     CSSPropertyWebkitMaskBoxImage,
    203     CSSPropertyWebkitMaskClip,
    204     CSSPropertyWebkitMaskComposite,
    205     CSSPropertyWebkitMaskImage,
    206     CSSPropertyWebkitMaskOrigin,
    207     CSSPropertyWebkitMaskPosition,
    208     CSSPropertyWebkitMaskRepeat,
    209     CSSPropertyWebkitMaskSize,
    210     CSSPropertyWebkitNbspMode,
    211     CSSPropertyWebkitPerspective,
    212     CSSPropertyWebkitPerspectiveOrigin,
    213     CSSPropertyWebkitRtlOrdering,
    214     CSSPropertyWebkitTextDecorationsInEffect,
    215     CSSPropertyWebkitTextFillColor,
    216     CSSPropertyWebkitTextSecurity,
    217     CSSPropertyWebkitTextStrokeColor,
    218     CSSPropertyWebkitTextStrokeWidth,
    219     CSSPropertyWebkitTransform,
    220     CSSPropertyWebkitTransformOrigin,
    221     CSSPropertyWebkitTransformStyle,
    222     CSSPropertyWebkitTransitionDelay,
    223     CSSPropertyWebkitTransitionDuration,
    224     CSSPropertyWebkitTransitionProperty,
    225     CSSPropertyWebkitTransitionTimingFunction,
    226     CSSPropertyWebkitUserDrag,
    227     CSSPropertyWebkitUserModify,
    228     CSSPropertyWebkitUserSelect
    229 
    230 #if ENABLE(SVG)
    231     ,
    232     CSSPropertyClipPath,
    233     CSSPropertyClipRule,
    234     CSSPropertyMask,
    235     CSSPropertyFilter,
    236     CSSPropertyFloodColor,
    237     CSSPropertyFloodOpacity,
    238     CSSPropertyLightingColor,
    239     CSSPropertyStopColor,
    240     CSSPropertyStopOpacity,
    241     CSSPropertyColorInterpolation,
    242     CSSPropertyColorInterpolationFilters,
    243     CSSPropertyColorRendering,
    244     CSSPropertyFill,
    245     CSSPropertyFillOpacity,
    246     CSSPropertyFillRule,
    247     CSSPropertyImageRendering,
    248     CSSPropertyMarkerEnd,
    249     CSSPropertyMarkerMid,
    250     CSSPropertyMarkerStart,
    251     CSSPropertyShapeRendering,
    252     CSSPropertyStroke,
    253     CSSPropertyStrokeDasharray,
    254     CSSPropertyStrokeDashoffset,
    255     CSSPropertyStrokeLinecap,
    256     CSSPropertyStrokeLinejoin,
    257     CSSPropertyStrokeMiterlimit,
    258     CSSPropertyStrokeOpacity,
    259     CSSPropertyStrokeWidth,
    260     CSSPropertyAlignmentBaseline,
    261     CSSPropertyBaselineShift,
    262     CSSPropertyDominantBaseline,
    263     CSSPropertyKerning,
    264     CSSPropertyTextAnchor,
    265     CSSPropertyWritingMode,
    266     CSSPropertyGlyphOrientationHorizontal,
    267     CSSPropertyGlyphOrientationVertical,
    268     CSSPropertyWebkitSvgShadow
    269 #endif
    270 #ifdef ANDROID_CSS_TAP_HIGHLIGHT_COLOR
    271     ,
    272     CSSPropertyWebkitTapHighlightColor
    273 #endif
    274 };
    275 
    276 const unsigned numComputedProperties = sizeof(computedProperties) / sizeof(computedProperties[0]);
    277 
    278 static int valueForRepeatRule(int rule)
    279 {
    280     switch (rule) {
    281         case RepeatImageRule:
    282             return CSSValueRepeat;
    283         case RoundImageRule:
    284             return CSSValueRound;
    285         default:
    286             return CSSValueStretch;
    287     }
    288 }
    289 
    290 static PassRefPtr<CSSValue> valueForNinePieceImage(const NinePieceImage& image)
    291 {
    292     if (!image.hasImage())
    293         return CSSPrimitiveValue::createIdentifier(CSSValueNone);
    294 
    295     // Image first.
    296     RefPtr<CSSValue> imageValue;
    297     if (image.image())
    298         imageValue = image.image()->cssValue();
    299 
    300     // Create the slices.
    301     RefPtr<CSSPrimitiveValue> top;
    302     if (image.m_slices.top().isPercent())
    303         top = CSSPrimitiveValue::create(image.m_slices.top().value(), CSSPrimitiveValue::CSS_PERCENTAGE);
    304     else
    305         top = CSSPrimitiveValue::create(image.m_slices.top().value(), CSSPrimitiveValue::CSS_NUMBER);
    306 
    307     RefPtr<CSSPrimitiveValue> right;
    308     if (image.m_slices.right().isPercent())
    309         right = CSSPrimitiveValue::create(image.m_slices.right().value(), CSSPrimitiveValue::CSS_PERCENTAGE);
    310     else
    311         right = CSSPrimitiveValue::create(image.m_slices.right().value(), CSSPrimitiveValue::CSS_NUMBER);
    312 
    313     RefPtr<CSSPrimitiveValue> bottom;
    314     if (image.m_slices.bottom().isPercent())
    315         bottom = CSSPrimitiveValue::create(image.m_slices.bottom().value(), CSSPrimitiveValue::CSS_PERCENTAGE);
    316     else
    317         bottom = CSSPrimitiveValue::create(image.m_slices.bottom().value(), CSSPrimitiveValue::CSS_NUMBER);
    318 
    319     RefPtr<CSSPrimitiveValue> left;
    320     if (image.m_slices.left().isPercent())
    321         left = CSSPrimitiveValue::create(image.m_slices.left().value(), CSSPrimitiveValue::CSS_PERCENTAGE);
    322     else
    323         left = CSSPrimitiveValue::create(image.m_slices.left().value(), CSSPrimitiveValue::CSS_NUMBER);
    324 
    325     RefPtr<Rect> rect = Rect::create();
    326     rect->setTop(top);
    327     rect->setRight(right);
    328     rect->setBottom(bottom);
    329     rect->setLeft(left);
    330 
    331     return CSSBorderImageValue::create(imageValue, rect, valueForRepeatRule(image.m_horizontalRule), valueForRepeatRule(image.m_verticalRule));
    332 }
    333 
    334 static PassRefPtr<CSSValue> valueForReflection(const StyleReflection* reflection)
    335 {
    336     if (!reflection)
    337         return CSSPrimitiveValue::createIdentifier(CSSValueNone);
    338 
    339     RefPtr<CSSPrimitiveValue> offset;
    340     if (reflection->offset().isPercent())
    341         offset = CSSPrimitiveValue::create(reflection->offset().percent(), CSSPrimitiveValue::CSS_PERCENTAGE);
    342     else
    343         offset = CSSPrimitiveValue::create(reflection->offset().value(), CSSPrimitiveValue::CSS_PX);
    344 
    345     return CSSReflectValue::create(reflection->direction(), offset.release(), valueForNinePieceImage(reflection->mask()));
    346 }
    347 
    348 static PassRefPtr<CSSValue> getPositionOffsetValue(RenderStyle* style, int propertyID)
    349 {
    350     if (!style)
    351         return 0;
    352 
    353     Length l;
    354     switch (propertyID) {
    355         case CSSPropertyLeft:
    356             l = style->left();
    357             break;
    358         case CSSPropertyRight:
    359             l = style->right();
    360             break;
    361         case CSSPropertyTop:
    362             l = style->top();
    363             break;
    364         case CSSPropertyBottom:
    365             l = style->bottom();
    366             break;
    367         default:
    368             return 0;
    369     }
    370 
    371     if (style->position() == AbsolutePosition || style->position() == FixedPosition)
    372         return CSSPrimitiveValue::create(l);
    373 
    374     if (style->position() == RelativePosition)
    375         // FIXME: It's not enough to simply return "auto" values for one offset if the other side is defined.
    376         // In other words if left is auto and right is not auto, then left's computed value is negative right().
    377         // So we should get the opposite length unit and see if it is auto.
    378         return CSSPrimitiveValue::create(l);
    379 
    380     return CSSPrimitiveValue::createIdentifier(CSSValueAuto);
    381 }
    382 
    383 static PassRefPtr<CSSPrimitiveValue> currentColorOrValidColor(RenderStyle* style, const Color& color)
    384 {
    385     if (!color.isValid())
    386         return CSSPrimitiveValue::createColor(style->color().rgb());
    387     return CSSPrimitiveValue::createColor(color.rgb());
    388 }
    389 
    390 static PassRefPtr<CSSValue> getBorderRadiusCornerValue(IntSize radius)
    391 {
    392     if (radius.width() == radius.height())
    393         return CSSPrimitiveValue::create(radius.width(), CSSPrimitiveValue::CSS_PX);
    394 
    395     RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
    396     list->append(CSSPrimitiveValue::create(radius.width(), CSSPrimitiveValue::CSS_PX));
    397     list->append(CSSPrimitiveValue::create(radius.height(), CSSPrimitiveValue::CSS_PX));
    398     return list.release();
    399 }
    400 
    401 static IntRect sizingBox(RenderObject* renderer)
    402 {
    403     if (!renderer->isBox())
    404         return IntRect();
    405 
    406     RenderBox* box = toRenderBox(renderer);
    407     return box->style()->boxSizing() == CONTENT_BOX ? box->contentBoxRect() : box->borderBoxRect();
    408 }
    409 
    410 static inline bool hasCompositedLayer(RenderObject* renderer)
    411 {
    412     return renderer && renderer->hasLayer() && toRenderBoxModelObject(renderer)->layer()->isComposited();
    413 }
    414 
    415 static PassRefPtr<CSSValue> computedTransform(RenderObject* renderer, const RenderStyle* style)
    416 {
    417     if (!renderer || style->transform().operations().isEmpty())
    418         return CSSPrimitiveValue::createIdentifier(CSSValueNone);
    419 
    420     IntRect box = sizingBox(renderer);
    421 
    422     TransformationMatrix transform;
    423     style->applyTransform(transform, box.size(), RenderStyle::ExcludeTransformOrigin);
    424     // Note that this does not flatten to an affine transform if ENABLE(3D_RENDERING) is off, by design.
    425 
    426     RefPtr<WebKitCSSTransformValue> transformVal;
    427 
    428     // FIXME: Need to print out individual functions (https://bugs.webkit.org/show_bug.cgi?id=23924)
    429     if (transform.isAffine()) {
    430         transformVal = WebKitCSSTransformValue::create(WebKitCSSTransformValue::MatrixTransformOperation);
    431 
    432         transformVal->append(CSSPrimitiveValue::create(transform.a(), CSSPrimitiveValue::CSS_NUMBER));
    433         transformVal->append(CSSPrimitiveValue::create(transform.b(), CSSPrimitiveValue::CSS_NUMBER));
    434         transformVal->append(CSSPrimitiveValue::create(transform.c(), CSSPrimitiveValue::CSS_NUMBER));
    435         transformVal->append(CSSPrimitiveValue::create(transform.d(), CSSPrimitiveValue::CSS_NUMBER));
    436         transformVal->append(CSSPrimitiveValue::create(transform.e(), CSSPrimitiveValue::CSS_NUMBER));
    437         transformVal->append(CSSPrimitiveValue::create(transform.f(), CSSPrimitiveValue::CSS_NUMBER));
    438     } else {
    439         transformVal = WebKitCSSTransformValue::create(WebKitCSSTransformValue::Matrix3DTransformOperation);
    440 
    441         transformVal->append(CSSPrimitiveValue::create(transform.m11(), CSSPrimitiveValue::CSS_NUMBER));
    442         transformVal->append(CSSPrimitiveValue::create(transform.m12(), CSSPrimitiveValue::CSS_NUMBER));
    443         transformVal->append(CSSPrimitiveValue::create(transform.m13(), CSSPrimitiveValue::CSS_NUMBER));
    444         transformVal->append(CSSPrimitiveValue::create(transform.m14(), CSSPrimitiveValue::CSS_NUMBER));
    445 
    446         transformVal->append(CSSPrimitiveValue::create(transform.m21(), CSSPrimitiveValue::CSS_NUMBER));
    447         transformVal->append(CSSPrimitiveValue::create(transform.m22(), CSSPrimitiveValue::CSS_NUMBER));
    448         transformVal->append(CSSPrimitiveValue::create(transform.m23(), CSSPrimitiveValue::CSS_NUMBER));
    449         transformVal->append(CSSPrimitiveValue::create(transform.m24(), CSSPrimitiveValue::CSS_NUMBER));
    450 
    451         transformVal->append(CSSPrimitiveValue::create(transform.m31(), CSSPrimitiveValue::CSS_NUMBER));
    452         transformVal->append(CSSPrimitiveValue::create(transform.m32(), CSSPrimitiveValue::CSS_NUMBER));
    453         transformVal->append(CSSPrimitiveValue::create(transform.m33(), CSSPrimitiveValue::CSS_NUMBER));
    454         transformVal->append(CSSPrimitiveValue::create(transform.m34(), CSSPrimitiveValue::CSS_NUMBER));
    455 
    456         transformVal->append(CSSPrimitiveValue::create(transform.m41(), CSSPrimitiveValue::CSS_NUMBER));
    457         transformVal->append(CSSPrimitiveValue::create(transform.m42(), CSSPrimitiveValue::CSS_NUMBER));
    458         transformVal->append(CSSPrimitiveValue::create(transform.m43(), CSSPrimitiveValue::CSS_NUMBER));
    459         transformVal->append(CSSPrimitiveValue::create(transform.m44(), CSSPrimitiveValue::CSS_NUMBER));
    460     }
    461 
    462     RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
    463     list->append(transformVal);
    464 
    465     return list.release();
    466 }
    467 
    468 static PassRefPtr<CSSValue> getDelayValue(const AnimationList* animList)
    469 {
    470     RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
    471     if (animList) {
    472         for (size_t i = 0; i < animList->size(); ++i)
    473             list->append(CSSPrimitiveValue::create(animList->animation(i)->delay(), CSSPrimitiveValue::CSS_S));
    474     } else {
    475         // Note that initialAnimationDelay() is used for both transitions and animations
    476         list->append(CSSPrimitiveValue::create(Animation::initialAnimationDelay(), CSSPrimitiveValue::CSS_S));
    477     }
    478     return list.release();
    479 }
    480 
    481 static PassRefPtr<CSSValue> getDurationValue(const AnimationList* animList)
    482 {
    483     RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
    484     if (animList) {
    485         for (size_t i = 0; i < animList->size(); ++i)
    486             list->append(CSSPrimitiveValue::create(animList->animation(i)->duration(), CSSPrimitiveValue::CSS_S));
    487     } else {
    488         // Note that initialAnimationDuration() is used for both transitions and animations
    489         list->append(CSSPrimitiveValue::create(Animation::initialAnimationDuration(), CSSPrimitiveValue::CSS_S));
    490     }
    491     return list.release();
    492 }
    493 
    494 static PassRefPtr<CSSValue> getTimingFunctionValue(const AnimationList* animList)
    495 {
    496     RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
    497     if (animList) {
    498         for (size_t i = 0; i < animList->size(); ++i) {
    499             const TimingFunction& tf = animList->animation(i)->timingFunction();
    500             list->append(CSSTimingFunctionValue::create(tf.x1(), tf.y1(), tf.x2(), tf.y2()));
    501         }
    502     } else {
    503         // Note that initialAnimationTimingFunction() is used for both transitions and animations
    504         const TimingFunction& tf = Animation::initialAnimationTimingFunction();
    505         list->append(CSSTimingFunctionValue::create(tf.x1(), tf.y1(), tf.x2(), tf.y2()));
    506     }
    507     return list.release();
    508 }
    509 
    510 CSSComputedStyleDeclaration::CSSComputedStyleDeclaration(PassRefPtr<Node> n)
    511     : m_node(n)
    512 {
    513 }
    514 
    515 CSSComputedStyleDeclaration::~CSSComputedStyleDeclaration()
    516 {
    517 }
    518 
    519 String CSSComputedStyleDeclaration::cssText() const
    520 {
    521     String result("");
    522 
    523     for (unsigned i = 0; i < numComputedProperties; i++) {
    524         if (i)
    525             result += " ";
    526         result += getPropertyName(static_cast<CSSPropertyID>(computedProperties[i]));
    527         result += ": ";
    528         result += getPropertyValue(computedProperties[i]);
    529         result += ";";
    530     }
    531 
    532     return result;
    533 }
    534 
    535 void CSSComputedStyleDeclaration::setCssText(const String&, ExceptionCode& ec)
    536 {
    537     ec = NO_MODIFICATION_ALLOWED_ERR;
    538 }
    539 
    540 static int cssIdentifierForFontSizeKeyword(int keywordSize)
    541 {
    542     ASSERT_ARG(keywordSize, keywordSize);
    543     ASSERT_ARG(keywordSize, keywordSize <= 8);
    544     return CSSValueXxSmall + keywordSize - 1;
    545 }
    546 
    547 PassRefPtr<CSSValue> CSSComputedStyleDeclaration::getFontSizeCSSValuePreferringKeyword() const
    548 {
    549     Node* node = m_node.get();
    550     if (!node)
    551         return 0;
    552 
    553     node->document()->updateLayoutIgnorePendingStylesheets();
    554 
    555     RefPtr<RenderStyle> style = node->computedStyle();
    556     if (!style)
    557         return 0;
    558 
    559     if (int keywordSize = style->fontDescription().keywordSize())
    560         return CSSPrimitiveValue::createIdentifier(cssIdentifierForFontSizeKeyword(keywordSize));
    561 
    562     return CSSPrimitiveValue::create(style->fontDescription().computedPixelSize(), CSSPrimitiveValue::CSS_PX);
    563 }
    564 
    565 PassRefPtr<CSSValue> CSSComputedStyleDeclaration::valueForShadow(const ShadowData* shadow, int id) const
    566 {
    567     if (!shadow)
    568         return CSSPrimitiveValue::createIdentifier(CSSValueNone);
    569 
    570     CSSPropertyID propertyID = static_cast<CSSPropertyID>(id);
    571 
    572     RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
    573     for (const ShadowData* s = shadow; s; s = s->next) {
    574         RefPtr<CSSPrimitiveValue> x = CSSPrimitiveValue::create(s->x, CSSPrimitiveValue::CSS_PX);
    575         RefPtr<CSSPrimitiveValue> y = CSSPrimitiveValue::create(s->y, CSSPrimitiveValue::CSS_PX);
    576         RefPtr<CSSPrimitiveValue> blur = CSSPrimitiveValue::create(s->blur, CSSPrimitiveValue::CSS_PX);
    577         RefPtr<CSSPrimitiveValue> spread = propertyID == CSSPropertyTextShadow ? 0 : CSSPrimitiveValue::create(s->spread, CSSPrimitiveValue::CSS_PX);
    578         RefPtr<CSSPrimitiveValue> style = propertyID == CSSPropertyTextShadow || s->style == Normal ? 0 : CSSPrimitiveValue::createIdentifier(CSSValueInset);
    579         RefPtr<CSSPrimitiveValue> color = CSSPrimitiveValue::createColor(s->color.rgb());
    580         list->prepend(ShadowValue::create(x.release(), y.release(), blur.release(), spread.release(), style.release(), color.release()));
    581     }
    582     return list.release();
    583 }
    584 
    585 PassRefPtr<CSSValue> CSSComputedStyleDeclaration::getPropertyCSSValue(int propertyID) const
    586 {
    587     return getPropertyCSSValue(propertyID, UpdateLayout);
    588 }
    589 
    590 static int identifierForFamily(const AtomicString& family)
    591 {
    592     DEFINE_STATIC_LOCAL(AtomicString, cursiveFamily, ("-webkit-cursive"));
    593     DEFINE_STATIC_LOCAL(AtomicString, fantasyFamily, ("-webkit-fantasy"));
    594     DEFINE_STATIC_LOCAL(AtomicString, monospaceFamily, ("-webkit-monospace"));
    595     DEFINE_STATIC_LOCAL(AtomicString, sansSerifFamily, ("-webkit-sans-serif"));
    596     DEFINE_STATIC_LOCAL(AtomicString, serifFamily, ("-webkit-serif"));
    597     if (family == cursiveFamily)
    598         return CSSValueCursive;
    599     if (family == fantasyFamily)
    600         return CSSValueFantasy;
    601     if (family == monospaceFamily)
    602         return CSSValueMonospace;
    603     if (family == sansSerifFamily)
    604         return CSSValueSansSerif;
    605     if (family == serifFamily)
    606         return CSSValueSerif;
    607     return 0;
    608 }
    609 
    610 static PassRefPtr<CSSPrimitiveValue> valueForFamily(const AtomicString& family)
    611 {
    612     if (int familyIdentifier = identifierForFamily(family))
    613         return CSSPrimitiveValue::createIdentifier(familyIdentifier);
    614     return CSSPrimitiveValue::create(family.string(), CSSPrimitiveValue::CSS_STRING);
    615 }
    616 
    617 static PassRefPtr<CSSValue> renderTextDecorationFlagsToCSSValue(int textDecoration)
    618 {
    619     RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
    620     if (textDecoration & UNDERLINE)
    621         list->append(CSSPrimitiveValue::createIdentifier(CSSValueUnderline));
    622     if (textDecoration & OVERLINE)
    623         list->append(CSSPrimitiveValue::createIdentifier(CSSValueOverline));
    624     if (textDecoration & LINE_THROUGH)
    625         list->append(CSSPrimitiveValue::createIdentifier(CSSValueLineThrough));
    626     if (textDecoration & BLINK)
    627         list->append(CSSPrimitiveValue::createIdentifier(CSSValueBlink));
    628 
    629     if (!list->length())
    630         return CSSPrimitiveValue::createIdentifier(CSSValueNone);
    631     return list;
    632 }
    633 
    634 static PassRefPtr<CSSValue> fillRepeatToCSSValue(EFillRepeat xRepeat, EFillRepeat yRepeat)
    635 {
    636     // For backwards compatibility, if both values are equal, just return one of them. And
    637     // if the two values are equivalent to repeat-x or repeat-y, just return the shorthand.
    638     if (xRepeat == yRepeat)
    639         return CSSPrimitiveValue::create(xRepeat);
    640     if (xRepeat == CSSValueRepeat && yRepeat == CSSValueNoRepeat)
    641         return CSSPrimitiveValue::createIdentifier(CSSValueRepeatX);
    642     if (xRepeat == CSSValueNoRepeat && yRepeat == CSSValueRepeat)
    643         return CSSPrimitiveValue::createIdentifier(CSSValueRepeatY);
    644 
    645     RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
    646     list->append(CSSPrimitiveValue::create(xRepeat));
    647     list->append(CSSPrimitiveValue::create(yRepeat));
    648     return list.release();
    649 }
    650 
    651 static void logUnimplementedPropertyID(int propertyID)
    652 {
    653     DEFINE_STATIC_LOCAL(HashSet<int>, propertyIDSet, ());
    654     if (!propertyIDSet.add(propertyID).second)
    655         return;
    656 
    657     LOG_ERROR("WebKit does not yet implement getComputedStyle for '%s'.", getPropertyName(static_cast<CSSPropertyID>(propertyID)));
    658 }
    659 
    660 PassRefPtr<CSSValue> CSSComputedStyleDeclaration::getPropertyCSSValue(int propertyID, EUpdateLayout updateLayout) const
    661 {
    662     Node* node = m_node.get();
    663     if (!node)
    664         return 0;
    665 
    666     // Make sure our layout is up to date before we allow a query on these attributes.
    667     if (updateLayout)
    668         node->document()->updateLayoutIgnorePendingStylesheets();
    669 
    670     RenderObject* renderer = node->renderer();
    671 
    672     RefPtr<RenderStyle> style;
    673     if (renderer && hasCompositedLayer(renderer) && AnimationController::supportsAcceleratedAnimationOfProperty(static_cast<CSSPropertyID>(propertyID)))
    674         style = renderer->animation()->getAnimatedStyleForRenderer(renderer);
    675     else
    676        style = node->computedStyle();
    677     if (!style)
    678         return 0;
    679 
    680 #ifdef ANDROID_LAYOUT
    681     const Settings * settings = node->document()->frame() ? node->document()->frame()->settings() : 0;
    682 #endif
    683 
    684     switch (static_cast<CSSPropertyID>(propertyID)) {
    685         case CSSPropertyInvalid:
    686             break;
    687 
    688         case CSSPropertyBackgroundColor:
    689             return CSSPrimitiveValue::createColor(style->backgroundColor().rgb());
    690         case CSSPropertyBackgroundImage:
    691             if (style->backgroundImage())
    692                 return style->backgroundImage()->cssValue();
    693             return CSSPrimitiveValue::createIdentifier(CSSValueNone);
    694         case CSSPropertyBackgroundSize:
    695         case CSSPropertyWebkitBackgroundSize: {
    696             EFillSizeType size = style->backgroundSizeType();
    697             if (size == Contain)
    698                 return CSSPrimitiveValue::createIdentifier(CSSValueContain);
    699             if (size == Cover)
    700                 return CSSPrimitiveValue::createIdentifier(CSSValueCover);
    701             RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
    702             list->append(CSSPrimitiveValue::create(style->backgroundSizeLength().width()));
    703             list->append(CSSPrimitiveValue::create(style->backgroundSizeLength().height()));
    704             return list.release();
    705         }
    706         case CSSPropertyBackgroundRepeat:
    707             return fillRepeatToCSSValue(style->backgroundRepeatX(), style->backgroundRepeatY());
    708         case CSSPropertyWebkitBackgroundComposite:
    709             return CSSPrimitiveValue::create(style->backgroundComposite());
    710         case CSSPropertyBackgroundAttachment:
    711             return CSSPrimitiveValue::create(style->backgroundAttachment());
    712         case CSSPropertyBackgroundClip:
    713         case CSSPropertyBackgroundOrigin:
    714         case CSSPropertyWebkitBackgroundClip:
    715         case CSSPropertyWebkitBackgroundOrigin: {
    716             EFillBox box = (propertyID == CSSPropertyWebkitBackgroundClip || propertyID == CSSPropertyBackgroundClip) ? style->backgroundClip() : style->backgroundOrigin();
    717             return CSSPrimitiveValue::create(box);
    718         }
    719         case CSSPropertyBackgroundPosition: {
    720             RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
    721 
    722             list->append(CSSPrimitiveValue::create(style->backgroundXPosition()));
    723             list->append(CSSPrimitiveValue::create(style->backgroundYPosition()));
    724 
    725             return list.release();
    726         }
    727         case CSSPropertyBackgroundPositionX:
    728             return CSSPrimitiveValue::create(style->backgroundXPosition());
    729         case CSSPropertyBackgroundPositionY:
    730             return CSSPrimitiveValue::create(style->backgroundYPosition());
    731         case CSSPropertyBorderCollapse:
    732             if (style->borderCollapse())
    733                 return CSSPrimitiveValue::createIdentifier(CSSValueCollapse);
    734             return CSSPrimitiveValue::createIdentifier(CSSValueSeparate);
    735         case CSSPropertyBorderSpacing: {
    736             RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
    737             list->append(CSSPrimitiveValue::create(style->horizontalBorderSpacing(), CSSPrimitiveValue::CSS_PX));
    738             list->append(CSSPrimitiveValue::create(style->verticalBorderSpacing(), CSSPrimitiveValue::CSS_PX));
    739             return list.release();
    740         }
    741         case CSSPropertyWebkitBorderHorizontalSpacing:
    742             return CSSPrimitiveValue::create(style->horizontalBorderSpacing(), CSSPrimitiveValue::CSS_PX);
    743         case CSSPropertyWebkitBorderVerticalSpacing:
    744             return CSSPrimitiveValue::create(style->verticalBorderSpacing(), CSSPrimitiveValue::CSS_PX);
    745         case CSSPropertyBorderTopColor:
    746             return currentColorOrValidColor(style.get(), style->borderTopColor());
    747         case CSSPropertyBorderRightColor:
    748             return currentColorOrValidColor(style.get(), style->borderRightColor());
    749         case CSSPropertyBorderBottomColor:
    750             return currentColorOrValidColor(style.get(), style->borderBottomColor());
    751         case CSSPropertyBorderLeftColor:
    752             return currentColorOrValidColor(style.get(), style->borderLeftColor());
    753         case CSSPropertyBorderTopStyle:
    754             return CSSPrimitiveValue::create(style->borderTopStyle());
    755         case CSSPropertyBorderRightStyle:
    756             return CSSPrimitiveValue::create(style->borderRightStyle());
    757         case CSSPropertyBorderBottomStyle:
    758             return CSSPrimitiveValue::create(style->borderBottomStyle());
    759         case CSSPropertyBorderLeftStyle:
    760             return CSSPrimitiveValue::create(style->borderLeftStyle());
    761         case CSSPropertyBorderTopWidth:
    762             return CSSPrimitiveValue::create(style->borderTopWidth(), CSSPrimitiveValue::CSS_PX);
    763         case CSSPropertyBorderRightWidth:
    764             return CSSPrimitiveValue::create(style->borderRightWidth(), CSSPrimitiveValue::CSS_PX);
    765         case CSSPropertyBorderBottomWidth:
    766             return CSSPrimitiveValue::create(style->borderBottomWidth(), CSSPrimitiveValue::CSS_PX);
    767         case CSSPropertyBorderLeftWidth:
    768             return CSSPrimitiveValue::create(style->borderLeftWidth(), CSSPrimitiveValue::CSS_PX);
    769         case CSSPropertyBottom:
    770             return getPositionOffsetValue(style.get(), CSSPropertyBottom);
    771         case CSSPropertyWebkitBoxAlign:
    772             return CSSPrimitiveValue::create(style->boxAlign());
    773         case CSSPropertyWebkitBoxDirection:
    774             return CSSPrimitiveValue::create(style->boxDirection());
    775         case CSSPropertyWebkitBoxFlex:
    776             return CSSPrimitiveValue::create(style->boxFlex(), CSSPrimitiveValue::CSS_NUMBER);
    777         case CSSPropertyWebkitBoxFlexGroup:
    778             return CSSPrimitiveValue::create(style->boxFlexGroup(), CSSPrimitiveValue::CSS_NUMBER);
    779         case CSSPropertyWebkitBoxLines:
    780             return CSSPrimitiveValue::create(style->boxLines());
    781         case CSSPropertyWebkitBoxOrdinalGroup:
    782             return CSSPrimitiveValue::create(style->boxOrdinalGroup(), CSSPrimitiveValue::CSS_NUMBER);
    783         case CSSPropertyWebkitBoxOrient:
    784             return CSSPrimitiveValue::create(style->boxOrient());
    785         case CSSPropertyWebkitBoxPack: {
    786             EBoxAlignment boxPack = style->boxPack();
    787             ASSERT(boxPack != BSTRETCH);
    788             ASSERT(boxPack != BBASELINE);
    789             if (boxPack == BJUSTIFY || boxPack== BBASELINE)
    790                 return 0;
    791             return CSSPrimitiveValue::create(boxPack);
    792         }
    793         case CSSPropertyWebkitBoxReflect:
    794             return valueForReflection(style->boxReflect());
    795         case CSSPropertyWebkitBoxShadow:
    796             return valueForShadow(style->boxShadow(), propertyID);
    797         case CSSPropertyCaptionSide:
    798             return CSSPrimitiveValue::create(style->captionSide());
    799         case CSSPropertyClear:
    800             return CSSPrimitiveValue::create(style->clear());
    801         case CSSPropertyColor:
    802             return CSSPrimitiveValue::createColor(style->color().rgb());
    803         case CSSPropertyWebkitColumnCount:
    804             if (style->hasAutoColumnCount())
    805                 return CSSPrimitiveValue::createIdentifier(CSSValueAuto);
    806             return CSSPrimitiveValue::create(style->columnCount(), CSSPrimitiveValue::CSS_NUMBER);
    807         case CSSPropertyWebkitColumnGap:
    808             if (style->hasNormalColumnGap())
    809                 return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
    810             return CSSPrimitiveValue::create(style->columnGap(), CSSPrimitiveValue::CSS_NUMBER);
    811         case CSSPropertyWebkitColumnRuleColor:
    812             return currentColorOrValidColor(style.get(), style->columnRuleColor());
    813         case CSSPropertyWebkitColumnRuleStyle:
    814             return CSSPrimitiveValue::create(style->columnRuleStyle());
    815         case CSSPropertyWebkitColumnRuleWidth:
    816             return CSSPrimitiveValue::create(style->columnRuleWidth(), CSSPrimitiveValue::CSS_PX);
    817         case CSSPropertyWebkitColumnBreakAfter:
    818             return CSSPrimitiveValue::create(style->columnBreakAfter());
    819         case CSSPropertyWebkitColumnBreakBefore:
    820             return CSSPrimitiveValue::create(style->columnBreakBefore());
    821         case CSSPropertyWebkitColumnBreakInside:
    822             return CSSPrimitiveValue::create(style->columnBreakInside());
    823         case CSSPropertyWebkitColumnWidth:
    824             if (style->hasAutoColumnWidth())
    825                 return CSSPrimitiveValue::createIdentifier(CSSValueAuto);
    826             return CSSPrimitiveValue::create(style->columnWidth(), CSSPrimitiveValue::CSS_NUMBER);
    827         case CSSPropertyCursor: {
    828             RefPtr<CSSValueList> list;
    829             CursorList* cursors = style->cursors();
    830             if (cursors && cursors->size() > 0) {
    831                 list = CSSValueList::createCommaSeparated();
    832                 for (unsigned i = 0; i < cursors->size(); ++i)
    833                     list->append(CSSPrimitiveValue::create((*cursors)[i].cursorImage->url(), CSSPrimitiveValue::CSS_URI));
    834             }
    835             RefPtr<CSSValue> value = CSSPrimitiveValue::create(style->cursor());
    836             if (list) {
    837                 list->append(value);
    838                 return list.release();
    839             }
    840             return value.release();
    841         }
    842         case CSSPropertyDirection:
    843             return CSSPrimitiveValue::create(style->direction());
    844         case CSSPropertyDisplay:
    845             return CSSPrimitiveValue::create(style->display());
    846         case CSSPropertyEmptyCells:
    847             return CSSPrimitiveValue::create(style->emptyCells());
    848         case CSSPropertyFloat:
    849 #ifdef ANDROID_LAYOUT
    850             if (settings && settings->layoutAlgorithm() == Settings::kLayoutSSR)
    851                 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
    852 #endif
    853             return CSSPrimitiveValue::create(style->floating());
    854         case CSSPropertyFontFamily: {
    855             const FontFamily& firstFamily = style->fontDescription().family();
    856             if (!firstFamily.next())
    857                 return valueForFamily(firstFamily.family());
    858             RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
    859             for (const FontFamily* family = &firstFamily; family; family = family->next())
    860                 list->append(valueForFamily(family->family()));
    861             return list.release();
    862         }
    863         case CSSPropertyFontSize:
    864             return CSSPrimitiveValue::create(style->fontDescription().computedPixelSize(), CSSPrimitiveValue::CSS_PX);
    865         case CSSPropertyWebkitBinding:
    866             break;
    867         case CSSPropertyFontStyle:
    868             if (style->fontDescription().italic())
    869                 return CSSPrimitiveValue::createIdentifier(CSSValueItalic);
    870             return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
    871         case CSSPropertyFontVariant:
    872             if (style->fontDescription().smallCaps())
    873                 return CSSPrimitiveValue::createIdentifier(CSSValueSmallCaps);
    874             return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
    875         case CSSPropertyFontWeight:
    876             switch (style->fontDescription().weight()) {
    877                 case FontWeight100:
    878                     return CSSPrimitiveValue::createIdentifier(CSSValue100);
    879                 case FontWeight200:
    880                     return CSSPrimitiveValue::createIdentifier(CSSValue200);
    881                 case FontWeight300:
    882                     return CSSPrimitiveValue::createIdentifier(CSSValue300);
    883                 case FontWeightNormal:
    884                     return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
    885                 case FontWeight500:
    886                     return CSSPrimitiveValue::createIdentifier(CSSValue500);
    887                 case FontWeight600:
    888                     return CSSPrimitiveValue::createIdentifier(CSSValue600);
    889                 case FontWeightBold:
    890                     return CSSPrimitiveValue::createIdentifier(CSSValueBold);
    891                 case FontWeight800:
    892                     return CSSPrimitiveValue::createIdentifier(CSSValue800);
    893                 case FontWeight900:
    894                     return CSSPrimitiveValue::createIdentifier(CSSValue900);
    895             }
    896             ASSERT_NOT_REACHED();
    897             return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
    898         case CSSPropertyHeight:
    899             if (renderer)
    900                 return CSSPrimitiveValue::create(sizingBox(renderer).height(), CSSPrimitiveValue::CSS_PX);
    901             return CSSPrimitiveValue::create(style->height());
    902         case CSSPropertyWebkitHighlight:
    903             if (style->highlight() == nullAtom)
    904                 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
    905             return CSSPrimitiveValue::create(style->highlight(), CSSPrimitiveValue::CSS_STRING);
    906         case CSSPropertyWebkitBorderFit:
    907             if (style->borderFit() == BorderFitBorder)
    908                 return CSSPrimitiveValue::createIdentifier(CSSValueBorder);
    909             return CSSPrimitiveValue::createIdentifier(CSSValueLines);
    910         case CSSPropertyLeft:
    911             return getPositionOffsetValue(style.get(), CSSPropertyLeft);
    912         case CSSPropertyLetterSpacing:
    913             if (!style->letterSpacing())
    914                 return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
    915             return CSSPrimitiveValue::create(style->letterSpacing(), CSSPrimitiveValue::CSS_PX);
    916         case CSSPropertyWebkitLineClamp:
    917             if (style->lineClamp().isNone())
    918                 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
    919             return CSSPrimitiveValue::create(style->lineClamp().value(), style->lineClamp().isPercentage() ? CSSPrimitiveValue::CSS_PERCENTAGE : CSSPrimitiveValue::CSS_NUMBER);
    920         case CSSPropertyLineHeight: {
    921             Length length = style->lineHeight();
    922             if (length.isNegative())
    923                 return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
    924             if (length.isPercent())
    925                 // This is imperfect, because it doesn't include the zoom factor and the real computation
    926                 // for how high to be in pixels does include things like minimum font size and the zoom factor.
    927                 // On the other hand, since font-size doesn't include the zoom factor, we really can't do
    928                 // that here either.
    929                 return CSSPrimitiveValue::create(static_cast<int>(length.percent() * style->fontDescription().specifiedSize()) / 100, CSSPrimitiveValue::CSS_PX);
    930             return CSSPrimitiveValue::create(length.value(), CSSPrimitiveValue::CSS_PX);
    931         }
    932         case CSSPropertyListStyleImage:
    933             if (style->listStyleImage())
    934                 return style->listStyleImage()->cssValue();
    935             return CSSPrimitiveValue::createIdentifier(CSSValueNone);
    936         case CSSPropertyListStylePosition:
    937             return CSSPrimitiveValue::create(style->listStylePosition());
    938         case CSSPropertyListStyleType:
    939             return CSSPrimitiveValue::create(style->listStyleType());
    940         case CSSPropertyMarginTop:
    941             if (renderer && renderer->isBox())
    942                 // FIXME: Supposed to return the percentage if percentage was specified.
    943                 return CSSPrimitiveValue::create(toRenderBox(renderer)->marginTop(), CSSPrimitiveValue::CSS_PX);
    944             return CSSPrimitiveValue::create(style->marginTop());
    945         case CSSPropertyMarginRight:
    946             if (renderer && renderer->isBox())
    947                 // FIXME: Supposed to return the percentage if percentage was specified.
    948                 return CSSPrimitiveValue::create(toRenderBox(renderer)->marginRight(), CSSPrimitiveValue::CSS_PX);
    949             return CSSPrimitiveValue::create(style->marginRight());
    950         case CSSPropertyMarginBottom:
    951             if (renderer && renderer->isBox())
    952                 // FIXME: Supposed to return the percentage if percentage was specified.
    953                 return CSSPrimitiveValue::create(toRenderBox(renderer)->marginBottom(), CSSPrimitiveValue::CSS_PX);
    954             return CSSPrimitiveValue::create(style->marginBottom());
    955         case CSSPropertyMarginLeft:
    956             if (renderer && renderer->isBox())
    957                 // FIXME: Supposed to return the percentage if percentage was specified.
    958                 return CSSPrimitiveValue::create(toRenderBox(renderer)->marginLeft(), CSSPrimitiveValue::CSS_PX);
    959             return CSSPrimitiveValue::create(style->marginLeft());
    960         case CSSPropertyWebkitMarqueeDirection:
    961             return CSSPrimitiveValue::create(style->marqueeDirection());
    962         case CSSPropertyWebkitMarqueeIncrement:
    963             return CSSPrimitiveValue::create(style->marqueeIncrement());
    964         case CSSPropertyWebkitMarqueeRepetition:
    965             if (style->marqueeLoopCount() < 0)
    966                 return CSSPrimitiveValue::createIdentifier(CSSValueInfinite);
    967             return CSSPrimitiveValue::create(style->marqueeLoopCount(), CSSPrimitiveValue::CSS_NUMBER);
    968         case CSSPropertyWebkitMarqueeStyle:
    969             return CSSPrimitiveValue::create(style->marqueeBehavior());
    970         case CSSPropertyWebkitMaskImage:
    971             if (style->maskImage())
    972                 return style->maskImage()->cssValue();
    973             return CSSPrimitiveValue::createIdentifier(CSSValueNone);
    974         case CSSPropertyWebkitMaskSize: {
    975             RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
    976             list->append(CSSPrimitiveValue::create(style->maskSize().width()));
    977             list->append(CSSPrimitiveValue::create(style->maskSize().height()));
    978             return list.release();
    979         }
    980         case CSSPropertyWebkitMaskRepeat:
    981             return fillRepeatToCSSValue(style->maskRepeatX(), style->maskRepeatY());
    982         case CSSPropertyWebkitMaskAttachment:
    983             return CSSPrimitiveValue::create(style->maskAttachment());
    984         case CSSPropertyWebkitMaskComposite:
    985             return CSSPrimitiveValue::create(style->maskComposite());
    986         case CSSPropertyWebkitMaskClip:
    987         case CSSPropertyWebkitMaskOrigin: {
    988             EFillBox box = (propertyID == CSSPropertyWebkitMaskClip ? style->maskClip() : style->maskOrigin());
    989             return CSSPrimitiveValue::create(box);
    990         }
    991         case CSSPropertyWebkitMaskPosition: {
    992             RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
    993 
    994             list->append(CSSPrimitiveValue::create(style->maskXPosition()));
    995             list->append(CSSPrimitiveValue::create(style->maskYPosition()));
    996 
    997             return list.release();
    998         }
    999         case CSSPropertyWebkitMaskPositionX:
   1000             return CSSPrimitiveValue::create(style->maskXPosition());
   1001         case CSSPropertyWebkitMaskPositionY:
   1002             return CSSPrimitiveValue::create(style->maskYPosition());
   1003         case CSSPropertyWebkitUserModify:
   1004             return CSSPrimitiveValue::create(style->userModify());
   1005         case CSSPropertyMaxHeight: {
   1006             const Length& maxHeight = style->maxHeight();
   1007             if (maxHeight.isFixed() && maxHeight.value() == undefinedLength)
   1008                 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
   1009             return CSSPrimitiveValue::create(maxHeight);
   1010         }
   1011         case CSSPropertyMaxWidth: {
   1012             const Length& maxWidth = style->maxWidth();
   1013             if (maxWidth.isFixed() && maxWidth.value() == undefinedLength)
   1014                 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
   1015             return CSSPrimitiveValue::create(maxWidth);
   1016         }
   1017         case CSSPropertyMinHeight:
   1018             return CSSPrimitiveValue::create(style->minHeight());
   1019         case CSSPropertyMinWidth:
   1020             return CSSPrimitiveValue::create(style->minWidth());
   1021         case CSSPropertyOpacity:
   1022             return CSSPrimitiveValue::create(style->opacity(), CSSPrimitiveValue::CSS_NUMBER);
   1023         case CSSPropertyOrphans:
   1024             return CSSPrimitiveValue::create(style->orphans(), CSSPrimitiveValue::CSS_NUMBER);
   1025         case CSSPropertyOutlineColor:
   1026             return currentColorOrValidColor(style.get(), style->outlineColor());
   1027         case CSSPropertyOutlineStyle:
   1028             if (style->outlineStyleIsAuto())
   1029                 return CSSPrimitiveValue::createIdentifier(CSSValueAuto);
   1030             return CSSPrimitiveValue::create(style->outlineStyle());
   1031         case CSSPropertyOutlineWidth:
   1032             return CSSPrimitiveValue::create(style->outlineWidth(), CSSPrimitiveValue::CSS_PX);
   1033         case CSSPropertyOverflow:
   1034             return CSSPrimitiveValue::create(max(style->overflowX(), style->overflowY()));
   1035         case CSSPropertyOverflowX:
   1036             return CSSPrimitiveValue::create(style->overflowX());
   1037         case CSSPropertyOverflowY:
   1038 #ifdef ANDROID_LAYOUT
   1039             if (settings && settings->layoutAlgorithm() == Settings::kLayoutSSR)
   1040                 return CSSPrimitiveValue::createIdentifier(CSSValueVisible);
   1041 #endif
   1042             return CSSPrimitiveValue::create(style->overflowY());
   1043         case CSSPropertyPaddingTop:
   1044             if (renderer && renderer->isBox())
   1045                 return CSSPrimitiveValue::create(toRenderBox(renderer)->paddingTop(false), CSSPrimitiveValue::CSS_PX);
   1046             return CSSPrimitiveValue::create(style->paddingTop());
   1047         case CSSPropertyPaddingRight:
   1048             if (renderer && renderer->isBox())
   1049                 return CSSPrimitiveValue::create(toRenderBox(renderer)->paddingRight(false), CSSPrimitiveValue::CSS_PX);
   1050             return CSSPrimitiveValue::create(style->paddingRight());
   1051         case CSSPropertyPaddingBottom:
   1052             if (renderer && renderer->isBox())
   1053                 return CSSPrimitiveValue::create(toRenderBox(renderer)->paddingBottom(false), CSSPrimitiveValue::CSS_PX);
   1054             return CSSPrimitiveValue::create(style->paddingBottom());
   1055         case CSSPropertyPaddingLeft:
   1056             if (renderer && renderer->isBox())
   1057                 return CSSPrimitiveValue::create(toRenderBox(renderer)->paddingLeft(false), CSSPrimitiveValue::CSS_PX);
   1058             return CSSPrimitiveValue::create(style->paddingLeft());
   1059         case CSSPropertyPageBreakAfter:
   1060             return CSSPrimitiveValue::create(style->pageBreakAfter());
   1061         case CSSPropertyPageBreakBefore:
   1062             return CSSPrimitiveValue::create(style->pageBreakBefore());
   1063         case CSSPropertyPageBreakInside: {
   1064             EPageBreak pageBreak = style->pageBreakInside();
   1065             ASSERT(pageBreak != PBALWAYS);
   1066             if (pageBreak == PBALWAYS)
   1067                 return 0;
   1068             return CSSPrimitiveValue::create(style->pageBreakInside());
   1069         }
   1070         case CSSPropertyPosition:
   1071 #ifdef ANDROID_LAYOUT
   1072             if (settings && settings->layoutAlgorithm() == Settings::kLayoutSSR)
   1073                 return CSSPrimitiveValue::createIdentifier(CSSValueStatic);
   1074 #endif
   1075             return CSSPrimitiveValue::create(style->position());
   1076         case CSSPropertyRight:
   1077             return getPositionOffsetValue(style.get(), CSSPropertyRight);
   1078         case CSSPropertyTableLayout:
   1079             return CSSPrimitiveValue::create(style->tableLayout());
   1080         case CSSPropertyTextAlign:
   1081             return CSSPrimitiveValue::create(style->textAlign());
   1082         case CSSPropertyTextDecoration:
   1083             return renderTextDecorationFlagsToCSSValue(style->textDecoration());
   1084         case CSSPropertyWebkitTextDecorationsInEffect:
   1085             return renderTextDecorationFlagsToCSSValue(style->textDecorationsInEffect());
   1086         case CSSPropertyWebkitTextFillColor:
   1087             return currentColorOrValidColor(style.get(), style->textFillColor());
   1088         case CSSPropertyTextIndent:
   1089             return CSSPrimitiveValue::create(style->textIndent());
   1090         case CSSPropertyTextShadow:
   1091             return valueForShadow(style->textShadow(), propertyID);
   1092         case CSSPropertyTextRendering:
   1093             return CSSPrimitiveValue::create(style->fontDescription().textRenderingMode());
   1094         case CSSPropertyTextOverflow:
   1095             if (style->textOverflow())
   1096                 return CSSPrimitiveValue::createIdentifier(CSSValueEllipsis);
   1097             return CSSPrimitiveValue::createIdentifier(CSSValueClip);
   1098         case CSSPropertyWebkitTextSecurity:
   1099             return CSSPrimitiveValue::create(style->textSecurity());
   1100         case CSSPropertyWebkitTextSizeAdjust:
   1101             if (style->textSizeAdjust())
   1102                 return CSSPrimitiveValue::createIdentifier(CSSValueAuto);
   1103             return CSSPrimitiveValue::createIdentifier(CSSValueNone);
   1104         case CSSPropertyWebkitTextStrokeColor:
   1105             return currentColorOrValidColor(style.get(), style->textStrokeColor());
   1106         case CSSPropertyWebkitTextStrokeWidth:
   1107             return CSSPrimitiveValue::create(style->textStrokeWidth(), CSSPrimitiveValue::CSS_PX);
   1108         case CSSPropertyTextTransform:
   1109             return CSSPrimitiveValue::create(style->textTransform());
   1110         case CSSPropertyTop:
   1111             return getPositionOffsetValue(style.get(), CSSPropertyTop);
   1112         case CSSPropertyUnicodeBidi:
   1113             return CSSPrimitiveValue::create(style->unicodeBidi());
   1114         case CSSPropertyVerticalAlign:
   1115             switch (style->verticalAlign()) {
   1116                 case BASELINE:
   1117                     return CSSPrimitiveValue::createIdentifier(CSSValueBaseline);
   1118                 case MIDDLE:
   1119                     return CSSPrimitiveValue::createIdentifier(CSSValueMiddle);
   1120                 case SUB:
   1121                     return CSSPrimitiveValue::createIdentifier(CSSValueSub);
   1122                 case SUPER:
   1123                     return CSSPrimitiveValue::createIdentifier(CSSValueSuper);
   1124                 case TEXT_TOP:
   1125                     return CSSPrimitiveValue::createIdentifier(CSSValueTextTop);
   1126                 case TEXT_BOTTOM:
   1127                     return CSSPrimitiveValue::createIdentifier(CSSValueTextBottom);
   1128                 case TOP:
   1129                     return CSSPrimitiveValue::createIdentifier(CSSValueTop);
   1130                 case BOTTOM:
   1131                     return CSSPrimitiveValue::createIdentifier(CSSValueBottom);
   1132                 case BASELINE_MIDDLE:
   1133                     return CSSPrimitiveValue::createIdentifier(CSSValueWebkitBaselineMiddle);
   1134                 case LENGTH:
   1135                     return CSSPrimitiveValue::create(style->verticalAlignLength());
   1136             }
   1137             ASSERT_NOT_REACHED();
   1138             return 0;
   1139         case CSSPropertyVisibility:
   1140 #ifdef ANDROID_LAYOUT
   1141             if (settings && settings->layoutAlgorithm() == Settings::kLayoutSSR)
   1142                 return CSSPrimitiveValue::createIdentifier(CSSValueVisible);
   1143 #endif
   1144             return CSSPrimitiveValue::create(style->visibility());
   1145         case CSSPropertyWhiteSpace:
   1146 #ifdef ANDROID_LAYOUT
   1147             if (settings && settings->layoutAlgorithm() == Settings::kLayoutSSR)
   1148                 switch (style->whiteSpace()) {
   1149                     case NORMAL:
   1150                     case NOWRAP:
   1151                     case KHTML_NOWRAP:
   1152                         return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
   1153                     case PRE:
   1154                     case PRE_WRAP:
   1155                         return CSSPrimitiveValue::createIdentifier(CSSValuePreWrap);
   1156                     case PRE_LINE:
   1157                         return CSSPrimitiveValue::createIdentifier(CSSValuePreLine);
   1158                 }
   1159             else
   1160 #endif
   1161             return CSSPrimitiveValue::create(style->whiteSpace());
   1162         case CSSPropertyWidows:
   1163             return CSSPrimitiveValue::create(style->widows(), CSSPrimitiveValue::CSS_NUMBER);
   1164         case CSSPropertyWidth:
   1165             if (renderer)
   1166                 return CSSPrimitiveValue::create(sizingBox(renderer).width(), CSSPrimitiveValue::CSS_PX);
   1167             return CSSPrimitiveValue::create(style->width());
   1168         case CSSPropertyWordBreak:
   1169             return CSSPrimitiveValue::create(style->wordBreak());
   1170         case CSSPropertyWordSpacing:
   1171             return CSSPrimitiveValue::create(style->wordSpacing(), CSSPrimitiveValue::CSS_PX);
   1172         case CSSPropertyWordWrap:
   1173             return CSSPrimitiveValue::create(style->wordWrap());
   1174         case CSSPropertyWebkitLineBreak:
   1175             return CSSPrimitiveValue::create(style->khtmlLineBreak());
   1176         case CSSPropertyWebkitNbspMode:
   1177             return CSSPrimitiveValue::create(style->nbspMode());
   1178         case CSSPropertyWebkitMatchNearestMailBlockquoteColor:
   1179             return CSSPrimitiveValue::create(style->matchNearestMailBlockquoteColor());
   1180         case CSSPropertyResize:
   1181             return CSSPrimitiveValue::create(style->resize());
   1182         case CSSPropertyWebkitFontSmoothing:
   1183             return CSSPrimitiveValue::create(style->fontDescription().fontSmoothing());
   1184         case CSSPropertyZIndex:
   1185             if (style->hasAutoZIndex())
   1186                 return CSSPrimitiveValue::createIdentifier(CSSValueAuto);
   1187             return CSSPrimitiveValue::create(style->zIndex(), CSSPrimitiveValue::CSS_NUMBER);
   1188         case CSSPropertyZoom:
   1189             return CSSPrimitiveValue::create(style->zoom(), CSSPrimitiveValue::CSS_NUMBER);
   1190         case CSSPropertyWebkitBoxSizing:
   1191             if (style->boxSizing() == CONTENT_BOX)
   1192                 return CSSPrimitiveValue::createIdentifier(CSSValueContentBox);
   1193             return CSSPrimitiveValue::createIdentifier(CSSValueBorderBox);
   1194 #if ENABLE(DASHBOARD_SUPPORT)
   1195         case CSSPropertyWebkitDashboardRegion:
   1196         {
   1197             const Vector<StyleDashboardRegion>& regions = style->dashboardRegions();
   1198             unsigned count = regions.size();
   1199             if (count == 1 && regions[0].type == StyleDashboardRegion::None)
   1200                 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
   1201 
   1202             RefPtr<DashboardRegion> firstRegion;
   1203             DashboardRegion* previousRegion = 0;
   1204             for (unsigned i = 0; i < count; i++) {
   1205                 RefPtr<DashboardRegion> region = DashboardRegion::create();
   1206                 StyleDashboardRegion styleRegion = regions[i];
   1207 
   1208                 region->m_label = styleRegion.label;
   1209                 LengthBox offset = styleRegion.offset;
   1210                 region->setTop(CSSPrimitiveValue::create(offset.top().value(), CSSPrimitiveValue::CSS_PX));
   1211                 region->setRight(CSSPrimitiveValue::create(offset.right().value(), CSSPrimitiveValue::CSS_PX));
   1212                 region->setBottom(CSSPrimitiveValue::create(offset.bottom().value(), CSSPrimitiveValue::CSS_PX));
   1213                 region->setLeft(CSSPrimitiveValue::create(offset.left().value(), CSSPrimitiveValue::CSS_PX));
   1214                 region->m_isRectangle = (styleRegion.type == StyleDashboardRegion::Rectangle);
   1215                 region->m_isCircle = (styleRegion.type == StyleDashboardRegion::Circle);
   1216 
   1217                 if (previousRegion)
   1218                     previousRegion->m_next = region;
   1219                 else
   1220                     firstRegion = region;
   1221                 previousRegion = region.get();
   1222             }
   1223             return CSSPrimitiveValue::create(firstRegion.release());
   1224         }
   1225 #endif
   1226         case CSSPropertyWebkitAnimationDelay:
   1227             return getDelayValue(style->animations());
   1228         case CSSPropertyWebkitAnimationDirection: {
   1229             RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
   1230             const AnimationList* t = style->animations();
   1231             if (t) {
   1232                 for (size_t i = 0; i < t->size(); ++i) {
   1233                     if (t->animation(i)->direction())
   1234                         list->append(CSSPrimitiveValue::createIdentifier(CSSValueAlternate));
   1235                     else
   1236                         list->append(CSSPrimitiveValue::createIdentifier(CSSValueNormal));
   1237                 }
   1238             } else
   1239                 list->append(CSSPrimitiveValue::createIdentifier(CSSValueNormal));
   1240             return list.release();
   1241         }
   1242         case CSSPropertyWebkitAnimationDuration:
   1243             return getDurationValue(style->animations());
   1244         case CSSPropertyWebkitAnimationIterationCount: {
   1245             RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
   1246             const AnimationList* t = style->animations();
   1247             if (t) {
   1248                 for (size_t i = 0; i < t->size(); ++i) {
   1249                     int iterationCount = t->animation(i)->iterationCount();
   1250                     if (iterationCount == Animation::IterationCountInfinite)
   1251                         list->append(CSSPrimitiveValue::createIdentifier(CSSValueInfinite));
   1252                     else
   1253                         list->append(CSSPrimitiveValue::create(iterationCount, CSSPrimitiveValue::CSS_NUMBER));
   1254                 }
   1255             } else
   1256                 list->append(CSSPrimitiveValue::create(Animation::initialAnimationIterationCount(), CSSPrimitiveValue::CSS_NUMBER));
   1257             return list.release();
   1258         }
   1259         case CSSPropertyWebkitAnimationName: {
   1260             RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
   1261             const AnimationList* t = style->animations();
   1262             if (t) {
   1263                 for (size_t i = 0; i < t->size(); ++i) {
   1264                     list->append(CSSPrimitiveValue::create(t->animation(i)->name(), CSSPrimitiveValue::CSS_STRING));
   1265                 }
   1266             } else
   1267                 list->append(CSSPrimitiveValue::createIdentifier(CSSValueNone));
   1268             return list.release();
   1269         }
   1270         case CSSPropertyWebkitAnimationPlayState: {
   1271             RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
   1272             const AnimationList* t = style->animations();
   1273             if (t) {
   1274                 for (size_t i = 0; i < t->size(); ++i) {
   1275                     int prop = t->animation(i)->playState();
   1276                     if (prop == AnimPlayStatePlaying)
   1277                         list->append(CSSPrimitiveValue::createIdentifier(CSSValueRunning));
   1278                     else
   1279                         list->append(CSSPrimitiveValue::createIdentifier(CSSValuePaused));
   1280                 }
   1281             } else
   1282                 list->append(CSSPrimitiveValue::createIdentifier(CSSValueRunning));
   1283             return list.release();
   1284         }
   1285         case CSSPropertyWebkitAnimationTimingFunction:
   1286             return getTimingFunctionValue(style->animations());
   1287         case CSSPropertyWebkitAppearance:
   1288             return CSSPrimitiveValue::create(style->appearance());
   1289         case CSSPropertyWebkitBackfaceVisibility:
   1290             return CSSPrimitiveValue::createIdentifier((style->backfaceVisibility() == BackfaceVisibilityHidden) ? CSSValueHidden : CSSValueVisible);
   1291         case CSSPropertyWebkitBorderImage:
   1292             return valueForNinePieceImage(style->borderImage());
   1293         case CSSPropertyWebkitMaskBoxImage:
   1294             return valueForNinePieceImage(style->maskBoxImage());
   1295         case CSSPropertyWebkitFontSizeDelta:
   1296             // Not a real style property -- used by the editing engine -- so has no computed value.
   1297             break;
   1298         case CSSPropertyWebkitMarginBottomCollapse:
   1299             return CSSPrimitiveValue::create(style->marginBottomCollapse());
   1300         case CSSPropertyWebkitMarginTopCollapse:
   1301             return CSSPrimitiveValue::create(style->marginTopCollapse());
   1302         case CSSPropertyWebkitPerspective:
   1303             if (!style->hasPerspective())
   1304                 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
   1305             return CSSPrimitiveValue::create(style->perspective(), CSSPrimitiveValue::CSS_NUMBER);
   1306         case CSSPropertyWebkitPerspectiveOrigin: {
   1307             RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
   1308             if (renderer) {
   1309                 IntRect box = sizingBox(renderer);
   1310                 list->append(CSSPrimitiveValue::create(style->perspectiveOriginX().calcMinValue(box.width()), CSSPrimitiveValue::CSS_PX));
   1311                 list->append(CSSPrimitiveValue::create(style->perspectiveOriginY().calcMinValue(box.height()), CSSPrimitiveValue::CSS_PX));
   1312             }
   1313             else {
   1314                 list->append(CSSPrimitiveValue::create(style->perspectiveOriginX()));
   1315                 list->append(CSSPrimitiveValue::create(style->perspectiveOriginY()));
   1316             }
   1317             return list.release();
   1318         }
   1319         case CSSPropertyWebkitRtlOrdering:
   1320             if (style->visuallyOrdered())
   1321                 return CSSPrimitiveValue::createIdentifier(CSSValueVisual);
   1322             return CSSPrimitiveValue::createIdentifier(CSSValueLogical);
   1323         case CSSPropertyWebkitUserDrag:
   1324             return CSSPrimitiveValue::create(style->userDrag());
   1325         case CSSPropertyWebkitUserSelect:
   1326             return CSSPrimitiveValue::create(style->userSelect());
   1327         case CSSPropertyBorderBottomLeftRadius:
   1328             return getBorderRadiusCornerValue(style->borderBottomLeftRadius());
   1329         case CSSPropertyBorderBottomRightRadius:
   1330             return getBorderRadiusCornerValue(style->borderBottomRightRadius());
   1331         case CSSPropertyBorderTopLeftRadius:
   1332             return getBorderRadiusCornerValue(style->borderTopLeftRadius());
   1333         case CSSPropertyBorderTopRightRadius:
   1334             return getBorderRadiusCornerValue(style->borderTopRightRadius());
   1335         case CSSPropertyClip: {
   1336             if (!style->hasClip())
   1337                 return CSSPrimitiveValue::createIdentifier(CSSValueAuto);
   1338             RefPtr<Rect> rect = Rect::create();
   1339             rect->setTop(CSSPrimitiveValue::create(style->clip().top().value(), CSSPrimitiveValue::CSS_PX));
   1340             rect->setRight(CSSPrimitiveValue::create(style->clip().right().value(), CSSPrimitiveValue::CSS_PX));
   1341             rect->setBottom(CSSPrimitiveValue::create(style->clip().bottom().value(), CSSPrimitiveValue::CSS_PX));
   1342             rect->setLeft(CSSPrimitiveValue::create(style->clip().left().value(), CSSPrimitiveValue::CSS_PX));
   1343             return CSSPrimitiveValue::create(rect.release());
   1344         }
   1345         case CSSPropertyWebkitTransform:
   1346             return computedTransform(renderer, style.get());
   1347         case CSSPropertyWebkitTransformOrigin: {
   1348             RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
   1349             if (renderer) {
   1350                 IntRect box = sizingBox(renderer);
   1351                 list->append(CSSPrimitiveValue::create(style->transformOriginX().calcMinValue(box.width()), CSSPrimitiveValue::CSS_PX));
   1352                 list->append(CSSPrimitiveValue::create(style->transformOriginY().calcMinValue(box.height()), CSSPrimitiveValue::CSS_PX));
   1353                 if (style->transformOriginZ() != 0)
   1354                     list->append(CSSPrimitiveValue::create(style->transformOriginZ(), CSSPrimitiveValue::CSS_PX));
   1355             } else {
   1356                 list->append(CSSPrimitiveValue::create(style->transformOriginX()));
   1357                 list->append(CSSPrimitiveValue::create(style->transformOriginY()));
   1358                 if (style->transformOriginZ() != 0)
   1359                     list->append(CSSPrimitiveValue::create(style->transformOriginZ(), CSSPrimitiveValue::CSS_PX));
   1360             }
   1361             return list.release();
   1362         }
   1363         case CSSPropertyWebkitTransformStyle:
   1364             return CSSPrimitiveValue::createIdentifier((style->transformStyle3D() == TransformStyle3DPreserve3D) ? CSSValuePreserve3d : CSSValueFlat);
   1365         case CSSPropertyWebkitTransitionDelay:
   1366             return getDelayValue(style->transitions());
   1367         case CSSPropertyWebkitTransitionDuration:
   1368             return getDurationValue(style->transitions());
   1369         case CSSPropertyWebkitTransitionProperty: {
   1370             RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
   1371             const AnimationList* t = style->transitions();
   1372             if (t) {
   1373                 for (size_t i = 0; i < t->size(); ++i) {
   1374                     int prop = t->animation(i)->property();
   1375                     RefPtr<CSSValue> propertyValue;
   1376                     if (prop == cAnimateNone)
   1377                         propertyValue = CSSPrimitiveValue::createIdentifier(CSSValueNone);
   1378                     else if (prop == cAnimateAll)
   1379                         propertyValue = CSSPrimitiveValue::createIdentifier(CSSValueAll);
   1380                     else
   1381                         propertyValue = CSSPrimitiveValue::create(getPropertyName(static_cast<CSSPropertyID>(prop)), CSSPrimitiveValue::CSS_STRING);
   1382                     list->append(propertyValue);
   1383                 }
   1384             } else
   1385                 list->append(CSSPrimitiveValue::createIdentifier(CSSValueAll));
   1386             return list.release();
   1387         }
   1388         case CSSPropertyWebkitTransitionTimingFunction:
   1389             return getTimingFunctionValue(style->transitions());
   1390         case CSSPropertyPointerEvents:
   1391             return CSSPrimitiveValue::create(style->pointerEvents());
   1392         case CSSPropertyWebkitColorCorrection:
   1393             return CSSPrimitiveValue::create(style->colorSpace());
   1394 
   1395         /* Shorthand properties, currently not supported see bug 13658*/
   1396         case CSSPropertyBackground:
   1397         case CSSPropertyBorder:
   1398         case CSSPropertyBorderBottom:
   1399         case CSSPropertyBorderColor:
   1400         case CSSPropertyBorderLeft:
   1401         case CSSPropertyBorderRadius:
   1402         case CSSPropertyBorderRight:
   1403         case CSSPropertyBorderStyle:
   1404         case CSSPropertyBorderTop:
   1405         case CSSPropertyBorderWidth:
   1406         case CSSPropertyFont:
   1407         case CSSPropertyListStyle:
   1408         case CSSPropertyMargin:
   1409         case CSSPropertyPadding:
   1410             break;
   1411 
   1412         /* Unimplemented CSS 3 properties (including CSS3 shorthand properties) */
   1413         case CSSPropertyTextLineThrough:
   1414         case CSSPropertyTextLineThroughColor:
   1415         case CSSPropertyTextLineThroughMode:
   1416         case CSSPropertyTextLineThroughStyle:
   1417         case CSSPropertyTextLineThroughWidth:
   1418         case CSSPropertyTextOverline:
   1419         case CSSPropertyTextOverlineColor:
   1420         case CSSPropertyTextOverlineMode:
   1421         case CSSPropertyTextOverlineStyle:
   1422         case CSSPropertyTextOverlineWidth:
   1423         case CSSPropertyTextUnderline:
   1424         case CSSPropertyTextUnderlineColor:
   1425         case CSSPropertyTextUnderlineMode:
   1426         case CSSPropertyTextUnderlineStyle:
   1427         case CSSPropertyTextUnderlineWidth:
   1428             break;
   1429 
   1430         /* Unimplemented @font-face properties */
   1431         case CSSPropertyFontStretch:
   1432         case CSSPropertySrc:
   1433         case CSSPropertyUnicodeRange:
   1434             break;
   1435 
   1436         /* Other unimplemented properties */
   1437         case CSSPropertyContent: // FIXME: needs implementation, bug 23668
   1438         case CSSPropertyCounterIncrement:
   1439         case CSSPropertyCounterReset:
   1440         case CSSPropertyOutline: // FIXME: needs implementation
   1441         case CSSPropertyOutlineOffset: // FIXME: needs implementation
   1442         case CSSPropertyPage: // for @page
   1443         case CSSPropertyQuotes: // FIXME: needs implementation
   1444         case CSSPropertySize: // for @page
   1445             break;
   1446 
   1447         /* Unimplemented -webkit- properties */
   1448         case CSSPropertyWebkitAnimation:
   1449         case CSSPropertyWebkitBorderRadius:
   1450         case CSSPropertyWebkitColumns:
   1451         case CSSPropertyWebkitColumnRule:
   1452         case CSSPropertyWebkitMarginCollapse:
   1453         case CSSPropertyWebkitMarginStart:
   1454         case CSSPropertyWebkitMarquee:
   1455         case CSSPropertyWebkitMarqueeSpeed:
   1456         case CSSPropertyWebkitMask:
   1457         case CSSPropertyWebkitPaddingStart:
   1458         case CSSPropertyWebkitPerspectiveOriginX:
   1459         case CSSPropertyWebkitPerspectiveOriginY:
   1460         case CSSPropertyWebkitTextStroke:
   1461         case CSSPropertyWebkitTransformOriginX:
   1462         case CSSPropertyWebkitTransformOriginY:
   1463         case CSSPropertyWebkitTransformOriginZ:
   1464         case CSSPropertyWebkitTransition:
   1465         case CSSPropertyWebkitVariableDeclarationBlock:
   1466             break;
   1467 #ifdef ANDROID_CSS_TAP_HIGHLIGHT_COLOR
   1468         case CSSPropertyWebkitTapHighlightColor:
   1469             return CSSPrimitiveValue::createColor(style->tapHighlightColor().rgb());
   1470 #endif
   1471 #if ENABLE(SVG)
   1472         // FIXME: This default case ruins the point of using an enum for
   1473         // properties -- it prevents us from getting a warning when we
   1474         // forget to list a property above.
   1475         default:
   1476             return getSVGPropertyCSSValue(propertyID, DoNotUpdateLayout);
   1477 #endif
   1478     }
   1479 
   1480     logUnimplementedPropertyID(propertyID);
   1481     return 0;
   1482 }
   1483 
   1484 String CSSComputedStyleDeclaration::getPropertyValue(int propertyID) const
   1485 {
   1486     RefPtr<CSSValue> value = getPropertyCSSValue(propertyID);
   1487     if (value)
   1488         return value->cssText();
   1489     return "";
   1490 }
   1491 
   1492 bool CSSComputedStyleDeclaration::getPropertyPriority(int /*propertyID*/) const
   1493 {
   1494     // All computed styles have a priority of false (not "important").
   1495     return false;
   1496 }
   1497 
   1498 String CSSComputedStyleDeclaration::removeProperty(int /*propertyID*/, ExceptionCode& ec)
   1499 {
   1500     ec = NO_MODIFICATION_ALLOWED_ERR;
   1501     return String();
   1502 }
   1503 
   1504 void CSSComputedStyleDeclaration::setProperty(int /*propertyID*/, const String& /*value*/, bool /*important*/, ExceptionCode& ec)
   1505 {
   1506     ec = NO_MODIFICATION_ALLOWED_ERR;
   1507 }
   1508 
   1509 unsigned CSSComputedStyleDeclaration::length() const
   1510 {
   1511     Node* node = m_node.get();
   1512     if (!node)
   1513         return 0;
   1514 
   1515     RenderStyle* style = node->computedStyle();
   1516     if (!style)
   1517         return 0;
   1518 
   1519     return numComputedProperties;
   1520 }
   1521 
   1522 String CSSComputedStyleDeclaration::item(unsigned i) const
   1523 {
   1524     if (i >= length())
   1525         return "";
   1526 
   1527     return getPropertyName(static_cast<CSSPropertyID>(computedProperties[i]));
   1528 }
   1529 
   1530 bool CSSComputedStyleDeclaration::cssPropertyMatches(const CSSProperty* property) const
   1531 {
   1532     if (property->id() == CSSPropertyFontSize && property->value()->isPrimitiveValue() && m_node) {
   1533         m_node->document()->updateLayoutIgnorePendingStylesheets();
   1534         RenderStyle* style = m_node->computedStyle();
   1535         if (style && style->fontDescription().keywordSize()) {
   1536             int sizeValue = cssIdentifierForFontSizeKeyword(style->fontDescription().keywordSize());
   1537             CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(property->value());
   1538             if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_IDENT && primitiveValue->getIdent() == sizeValue)
   1539                 return true;
   1540         }
   1541     }
   1542 
   1543     return CSSStyleDeclaration::cssPropertyMatches(property);
   1544 }
   1545 
   1546 PassRefPtr<CSSMutableStyleDeclaration> CSSComputedStyleDeclaration::copy() const
   1547 {
   1548     return copyPropertiesInSet(computedProperties, numComputedProperties);
   1549 }
   1550 
   1551 PassRefPtr<CSSMutableStyleDeclaration> CSSComputedStyleDeclaration::makeMutable()
   1552 {
   1553     return copy();
   1554 }
   1555 
   1556 } // namespace WebCore
   1557