2 * Copyright (C) 2004 Zack Rusin <zack@kde.org>
3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
4 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org>
5 * Copyright (C) 2007 Nicholas Shanks <webkit@nickshanks.com>
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.
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.
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
24 #include "CSSComputedStyleDeclaration.h"
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 "CSSSelector.h"
35 #include "CSSTimingFunctionValue.h"
36 #include "CSSValueList.h"
38 #include "ExceptionCode.h"
40 #include "RenderBox.h"
41 #include "RenderLayer.h"
42 #include "ShadowValue.h"
47 #include "WebKitCSSTransformValue.h"
49 #if ENABLE(DASHBOARD_SUPPORT)
50 #include "DashboardRegion.h"
55 // List of all properties we know how to compute, omitting shorthands.
56 static const int computedProperties[] = {
57 CSSPropertyBackgroundAttachment,
58 CSSPropertyBackgroundClip,
59 CSSPropertyBackgroundColor,
60 CSSPropertyBackgroundImage,
61 CSSPropertyBackgroundOrigin,
62 CSSPropertyBackgroundPosition, // more-specific background-position-x/y are non-standard
63 CSSPropertyBackgroundRepeat,
64 CSSPropertyBackgroundSize,
65 CSSPropertyBorderBottomColor,
66 CSSPropertyBorderBottomLeftRadius,
67 CSSPropertyBorderBottomRightRadius,
68 CSSPropertyBorderBottomStyle,
69 CSSPropertyBorderBottomWidth,
70 CSSPropertyBorderCollapse,
71 CSSPropertyBorderLeftColor,
72 CSSPropertyBorderLeftStyle,
73 CSSPropertyBorderLeftWidth,
74 CSSPropertyBorderRightColor,
75 CSSPropertyBorderRightStyle,
76 CSSPropertyBorderRightWidth,
77 CSSPropertyBorderTopColor,
78 CSSPropertyBorderTopLeftRadius,
79 CSSPropertyBorderTopRightRadius,
80 CSSPropertyBorderTopStyle,
81 CSSPropertyBorderTopWidth,
83 CSSPropertyCaptionSide,
90 CSSPropertyEmptyCells,
92 CSSPropertyFontFamily,
95 CSSPropertyFontVariant,
96 CSSPropertyFontWeight,
99 CSSPropertyLetterSpacing,
100 CSSPropertyLineHeight,
101 CSSPropertyListStyleImage,
102 CSSPropertyListStylePosition,
103 CSSPropertyListStyleType,
104 CSSPropertyMarginBottom,
105 CSSPropertyMarginLeft,
106 CSSPropertyMarginRight,
107 CSSPropertyMarginTop,
108 CSSPropertyMaxHeight,
110 CSSPropertyMinHeight,
114 CSSPropertyOutlineColor,
115 CSSPropertyOutlineStyle,
116 CSSPropertyOutlineWidth,
117 CSSPropertyOverflowX,
118 CSSPropertyOverflowY,
119 CSSPropertyPaddingBottom,
120 CSSPropertyPaddingLeft,
121 CSSPropertyPaddingRight,
122 CSSPropertyPaddingTop,
123 CSSPropertyPageBreakAfter,
124 CSSPropertyPageBreakBefore,
125 CSSPropertyPageBreakInside,
126 CSSPropertyPointerEvents,
130 CSSPropertyTableLayout,
131 CSSPropertyTextAlign,
132 CSSPropertyTextDecoration,
133 CSSPropertyTextIndent,
134 CSSPropertyTextRendering,
135 CSSPropertyTextShadow,
136 CSSPropertyTextOverflow,
137 CSSPropertyTextTransform,
139 CSSPropertyUnicodeBidi,
140 CSSPropertyVerticalAlign,
141 CSSPropertyVisibility,
142 CSSPropertyWhiteSpace,
145 CSSPropertyWordBreak,
146 CSSPropertyWordSpacing,
151 CSSPropertyWebkitAnimationDelay,
152 CSSPropertyWebkitAnimationDirection,
153 CSSPropertyWebkitAnimationDuration,
154 CSSPropertyWebkitAnimationFillMode,
155 CSSPropertyWebkitAnimationIterationCount,
156 CSSPropertyWebkitAnimationName,
157 CSSPropertyWebkitAnimationPlayState,
158 CSSPropertyWebkitAnimationTimingFunction,
159 CSSPropertyWebkitAppearance,
160 CSSPropertyWebkitBackfaceVisibility,
161 CSSPropertyWebkitBackgroundClip,
162 CSSPropertyWebkitBackgroundComposite,
163 CSSPropertyWebkitBackgroundOrigin,
164 CSSPropertyWebkitBackgroundSize,
165 CSSPropertyWebkitBorderFit,
166 CSSPropertyWebkitBorderHorizontalSpacing,
167 CSSPropertyWebkitBorderImage,
168 CSSPropertyWebkitBorderVerticalSpacing,
169 CSSPropertyWebkitBoxAlign,
170 CSSPropertyWebkitBoxDirection,
171 CSSPropertyWebkitBoxFlex,
172 CSSPropertyWebkitBoxFlexGroup,
173 CSSPropertyWebkitBoxLines,
174 CSSPropertyWebkitBoxOrdinalGroup,
175 CSSPropertyWebkitBoxOrient,
176 CSSPropertyWebkitBoxPack,
177 CSSPropertyWebkitBoxReflect,
178 CSSPropertyWebkitBoxShadow,
179 CSSPropertyWebkitBoxSizing,
180 CSSPropertyWebkitColorCorrection,
181 CSSPropertyWebkitColumnBreakAfter,
182 CSSPropertyWebkitColumnBreakBefore,
183 CSSPropertyWebkitColumnBreakInside,
184 CSSPropertyWebkitColumnCount,
185 CSSPropertyWebkitColumnGap,
186 CSSPropertyWebkitColumnRuleColor,
187 CSSPropertyWebkitColumnRuleStyle,
188 CSSPropertyWebkitColumnRuleWidth,
189 CSSPropertyWebkitColumnSpan,
190 CSSPropertyWebkitColumnWidth,
191 #if ENABLE(DASHBOARD_SUPPORT)
192 CSSPropertyWebkitDashboardRegion,
194 CSSPropertyWebkitFontSmoothing,
195 CSSPropertyWebkitHighlight,
196 CSSPropertyWebkitLineBreak,
197 CSSPropertyWebkitLineClamp,
198 CSSPropertyWebkitMarginBottomCollapse,
199 CSSPropertyWebkitMarginTopCollapse,
200 CSSPropertyWebkitMarqueeDirection,
201 CSSPropertyWebkitMarqueeIncrement,
202 CSSPropertyWebkitMarqueeRepetition,
203 CSSPropertyWebkitMarqueeStyle,
204 CSSPropertyWebkitMaskAttachment,
205 CSSPropertyWebkitMaskBoxImage,
206 CSSPropertyWebkitMaskClip,
207 CSSPropertyWebkitMaskComposite,
208 CSSPropertyWebkitMaskImage,
209 CSSPropertyWebkitMaskOrigin,
210 CSSPropertyWebkitMaskPosition,
211 CSSPropertyWebkitMaskRepeat,
212 CSSPropertyWebkitMaskSize,
213 CSSPropertyWebkitNbspMode,
214 CSSPropertyWebkitPerspective,
215 CSSPropertyWebkitPerspectiveOrigin,
216 CSSPropertyWebkitRtlOrdering,
217 CSSPropertyWebkitTextDecorationsInEffect,
218 CSSPropertyWebkitTextFillColor,
219 CSSPropertyWebkitTextSecurity,
220 CSSPropertyWebkitTextStrokeColor,
221 CSSPropertyWebkitTextStrokeWidth,
222 CSSPropertyWebkitTransform,
223 CSSPropertyWebkitTransformOrigin,
224 CSSPropertyWebkitTransformStyle,
225 CSSPropertyWebkitTransitionDelay,
226 CSSPropertyWebkitTransitionDuration,
227 CSSPropertyWebkitTransitionProperty,
228 CSSPropertyWebkitTransitionTimingFunction,
229 CSSPropertyWebkitUserDrag,
230 CSSPropertyWebkitUserModify,
231 CSSPropertyWebkitUserSelect
239 CSSPropertyFloodColor,
240 CSSPropertyFloodOpacity,
241 CSSPropertyLightingColor,
242 CSSPropertyStopColor,
243 CSSPropertyStopOpacity,
244 CSSPropertyColorInterpolation,
245 CSSPropertyColorInterpolationFilters,
246 CSSPropertyColorRendering,
248 CSSPropertyFillOpacity,
250 CSSPropertyImageRendering,
251 CSSPropertyMarkerEnd,
252 CSSPropertyMarkerMid,
253 CSSPropertyMarkerStart,
254 CSSPropertyShapeRendering,
256 CSSPropertyStrokeDasharray,
257 CSSPropertyStrokeDashoffset,
258 CSSPropertyStrokeLinecap,
259 CSSPropertyStrokeLinejoin,
260 CSSPropertyStrokeMiterlimit,
261 CSSPropertyStrokeOpacity,
262 CSSPropertyStrokeWidth,
263 CSSPropertyAlignmentBaseline,
264 CSSPropertyBaselineShift,
265 CSSPropertyDominantBaseline,
267 CSSPropertyTextAnchor,
268 CSSPropertyWritingMode,
269 CSSPropertyGlyphOrientationHorizontal,
270 CSSPropertyGlyphOrientationVertical,
271 CSSPropertyWebkitSvgShadow,
272 CSSPropertyVectorEffect
274 #ifdef ANDROID_CSS_TAP_HIGHLIGHT_COLOR
276 CSSPropertyWebkitTapHighlightColor
280 const unsigned numComputedProperties = sizeof(computedProperties) / sizeof(computedProperties[0]);
282 static int valueForRepeatRule(int rule)
285 case RepeatImageRule:
286 return CSSValueRepeat;
288 return CSSValueRound;
290 return CSSValueStretch;
294 static PassRefPtr<CSSValue> valueForNinePieceImage(const NinePieceImage& image)
296 if (!image.hasImage())
297 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
300 RefPtr<CSSValue> imageValue;
302 imageValue = image.image()->cssValue();
304 // Create the slices.
305 RefPtr<CSSPrimitiveValue> top;
306 if (image.slices().top().isPercent())
307 top = CSSPrimitiveValue::create(image.slices().top().value(), CSSPrimitiveValue::CSS_PERCENTAGE);
309 top = CSSPrimitiveValue::create(image.slices().top().value(), CSSPrimitiveValue::CSS_NUMBER);
311 RefPtr<CSSPrimitiveValue> right;
312 if (image.slices().right().isPercent())
313 right = CSSPrimitiveValue::create(image.slices().right().value(), CSSPrimitiveValue::CSS_PERCENTAGE);
315 right = CSSPrimitiveValue::create(image.slices().right().value(), CSSPrimitiveValue::CSS_NUMBER);
317 RefPtr<CSSPrimitiveValue> bottom;
318 if (image.slices().bottom().isPercent())
319 bottom = CSSPrimitiveValue::create(image.slices().bottom().value(), CSSPrimitiveValue::CSS_PERCENTAGE);
321 bottom = CSSPrimitiveValue::create(image.slices().bottom().value(), CSSPrimitiveValue::CSS_NUMBER);
323 RefPtr<CSSPrimitiveValue> left;
324 if (image.slices().left().isPercent())
325 left = CSSPrimitiveValue::create(image.slices().left().value(), CSSPrimitiveValue::CSS_PERCENTAGE);
327 left = CSSPrimitiveValue::create(image.slices().left().value(), CSSPrimitiveValue::CSS_NUMBER);
329 RefPtr<Rect> rect = Rect::create();
331 rect->setRight(right);
332 rect->setBottom(bottom);
335 return CSSBorderImageValue::create(imageValue, rect, valueForRepeatRule(image.horizontalRule()), valueForRepeatRule(image.verticalRule()));
338 static PassRefPtr<CSSValue> valueForReflection(const StyleReflection* reflection)
341 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
343 RefPtr<CSSPrimitiveValue> offset;
344 if (reflection->offset().isPercent())
345 offset = CSSPrimitiveValue::create(reflection->offset().percent(), CSSPrimitiveValue::CSS_PERCENTAGE);
347 offset = CSSPrimitiveValue::create(reflection->offset().value(), CSSPrimitiveValue::CSS_PX);
349 return CSSReflectValue::create(reflection->direction(), offset.release(), valueForNinePieceImage(reflection->mask()));
352 static PassRefPtr<CSSValue> getPositionOffsetValue(RenderStyle* style, int propertyID)
358 switch (propertyID) {
359 case CSSPropertyLeft:
362 case CSSPropertyRight:
368 case CSSPropertyBottom:
375 if (style->position() == AbsolutePosition || style->position() == FixedPosition)
376 return CSSPrimitiveValue::create(l);
378 if (style->position() == RelativePosition)
379 // FIXME: It's not enough to simply return "auto" values for one offset if the other side is defined.
380 // In other words if left is auto and right is not auto, then left's computed value is negative right().
381 // So we should get the opposite length unit and see if it is auto.
382 return CSSPrimitiveValue::create(l);
384 return CSSPrimitiveValue::createIdentifier(CSSValueAuto);
387 PassRefPtr<CSSPrimitiveValue> CSSComputedStyleDeclaration::currentColorOrValidColor(RenderStyle* style, const Color& color) const
389 // This function does NOT look at visited information, so that computed style doesn't expose that.
390 if (!color.isValid())
391 return CSSPrimitiveValue::createColor(style->color().rgb());
392 return CSSPrimitiveValue::createColor(color.rgb());
395 static PassRefPtr<CSSValue> getBorderRadiusCornerValue(IntSize radius)
397 if (radius.width() == radius.height())
398 return CSSPrimitiveValue::create(radius.width(), CSSPrimitiveValue::CSS_PX);
400 RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
401 list->append(CSSPrimitiveValue::create(radius.width(), CSSPrimitiveValue::CSS_PX));
402 list->append(CSSPrimitiveValue::create(radius.height(), CSSPrimitiveValue::CSS_PX));
403 return list.release();
406 static IntRect sizingBox(RenderObject* renderer)
408 if (!renderer->isBox())
411 RenderBox* box = toRenderBox(renderer);
412 return box->style()->boxSizing() == CONTENT_BOX ? box->contentBoxRect() : box->borderBoxRect();
415 static inline bool hasCompositedLayer(RenderObject* renderer)
417 return renderer && renderer->hasLayer() && toRenderBoxModelObject(renderer)->layer()->isComposited();
420 static PassRefPtr<CSSValue> computedTransform(RenderObject* renderer, const RenderStyle* style)
422 if (!renderer || style->transform().operations().isEmpty())
423 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
425 IntRect box = sizingBox(renderer);
427 TransformationMatrix transform;
428 style->applyTransform(transform, box.size(), RenderStyle::ExcludeTransformOrigin);
429 // Note that this does not flatten to an affine transform if ENABLE(3D_RENDERING) is off, by design.
431 RefPtr<WebKitCSSTransformValue> transformVal;
433 // FIXME: Need to print out individual functions (https://bugs.webkit.org/show_bug.cgi?id=23924)
434 if (transform.isAffine()) {
435 transformVal = WebKitCSSTransformValue::create(WebKitCSSTransformValue::MatrixTransformOperation);
437 transformVal->append(CSSPrimitiveValue::create(transform.a(), CSSPrimitiveValue::CSS_NUMBER));
438 transformVal->append(CSSPrimitiveValue::create(transform.b(), CSSPrimitiveValue::CSS_NUMBER));
439 transformVal->append(CSSPrimitiveValue::create(transform.c(), CSSPrimitiveValue::CSS_NUMBER));
440 transformVal->append(CSSPrimitiveValue::create(transform.d(), CSSPrimitiveValue::CSS_NUMBER));
441 transformVal->append(CSSPrimitiveValue::create(transform.e(), CSSPrimitiveValue::CSS_NUMBER));
442 transformVal->append(CSSPrimitiveValue::create(transform.f(), CSSPrimitiveValue::CSS_NUMBER));
444 transformVal = WebKitCSSTransformValue::create(WebKitCSSTransformValue::Matrix3DTransformOperation);
446 transformVal->append(CSSPrimitiveValue::create(transform.m11(), CSSPrimitiveValue::CSS_NUMBER));
447 transformVal->append(CSSPrimitiveValue::create(transform.m12(), CSSPrimitiveValue::CSS_NUMBER));
448 transformVal->append(CSSPrimitiveValue::create(transform.m13(), CSSPrimitiveValue::CSS_NUMBER));
449 transformVal->append(CSSPrimitiveValue::create(transform.m14(), CSSPrimitiveValue::CSS_NUMBER));
451 transformVal->append(CSSPrimitiveValue::create(transform.m21(), CSSPrimitiveValue::CSS_NUMBER));
452 transformVal->append(CSSPrimitiveValue::create(transform.m22(), CSSPrimitiveValue::CSS_NUMBER));
453 transformVal->append(CSSPrimitiveValue::create(transform.m23(), CSSPrimitiveValue::CSS_NUMBER));
454 transformVal->append(CSSPrimitiveValue::create(transform.m24(), CSSPrimitiveValue::CSS_NUMBER));
456 transformVal->append(CSSPrimitiveValue::create(transform.m31(), CSSPrimitiveValue::CSS_NUMBER));
457 transformVal->append(CSSPrimitiveValue::create(transform.m32(), CSSPrimitiveValue::CSS_NUMBER));
458 transformVal->append(CSSPrimitiveValue::create(transform.m33(), CSSPrimitiveValue::CSS_NUMBER));
459 transformVal->append(CSSPrimitiveValue::create(transform.m34(), CSSPrimitiveValue::CSS_NUMBER));
461 transformVal->append(CSSPrimitiveValue::create(transform.m41(), CSSPrimitiveValue::CSS_NUMBER));
462 transformVal->append(CSSPrimitiveValue::create(transform.m42(), CSSPrimitiveValue::CSS_NUMBER));
463 transformVal->append(CSSPrimitiveValue::create(transform.m43(), CSSPrimitiveValue::CSS_NUMBER));
464 transformVal->append(CSSPrimitiveValue::create(transform.m44(), CSSPrimitiveValue::CSS_NUMBER));
467 RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
468 list->append(transformVal);
470 return list.release();
473 static PassRefPtr<CSSValue> getDelayValue(const AnimationList* animList)
475 RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
477 for (size_t i = 0; i < animList->size(); ++i)
478 list->append(CSSPrimitiveValue::create(animList->animation(i)->delay(), CSSPrimitiveValue::CSS_S));
480 // Note that initialAnimationDelay() is used for both transitions and animations
481 list->append(CSSPrimitiveValue::create(Animation::initialAnimationDelay(), CSSPrimitiveValue::CSS_S));
483 return list.release();
486 static PassRefPtr<CSSValue> getDurationValue(const AnimationList* animList)
488 RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
490 for (size_t i = 0; i < animList->size(); ++i)
491 list->append(CSSPrimitiveValue::create(animList->animation(i)->duration(), CSSPrimitiveValue::CSS_S));
493 // Note that initialAnimationDuration() is used for both transitions and animations
494 list->append(CSSPrimitiveValue::create(Animation::initialAnimationDuration(), CSSPrimitiveValue::CSS_S));
496 return list.release();
499 static PassRefPtr<CSSValue> getTimingFunctionValue(const AnimationList* animList)
501 RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
503 for (size_t i = 0; i < animList->size(); ++i) {
504 const TimingFunction& tf = animList->animation(i)->timingFunction();
505 list->append(CSSTimingFunctionValue::create(tf.x1(), tf.y1(), tf.x2(), tf.y2()));
508 // Note that initialAnimationTimingFunction() is used for both transitions and animations
509 const TimingFunction& tf = Animation::initialAnimationTimingFunction();
510 list->append(CSSTimingFunctionValue::create(tf.x1(), tf.y1(), tf.x2(), tf.y2()));
512 return list.release();
515 CSSComputedStyleDeclaration::CSSComputedStyleDeclaration(PassRefPtr<Node> n, bool allowVisitedStyle, const String& pseudoElementName)
517 , m_allowVisitedStyle(allowVisitedStyle)
519 unsigned nameWithoutColonsStart = pseudoElementName[0] == ':' ? (pseudoElementName[1] == ':' ? 2 : 1) : 0;
520 m_pseudoElementSpecifier = CSSSelector::pseudoId(CSSSelector::parsePseudoType(
521 AtomicString(pseudoElementName.substring(nameWithoutColonsStart))));
524 CSSComputedStyleDeclaration::~CSSComputedStyleDeclaration()
528 String CSSComputedStyleDeclaration::cssText() const
532 for (unsigned i = 0; i < numComputedProperties; i++) {
535 result += getPropertyName(static_cast<CSSPropertyID>(computedProperties[i]));
537 result += getPropertyValue(computedProperties[i]);
544 void CSSComputedStyleDeclaration::setCssText(const String&, ExceptionCode& ec)
546 ec = NO_MODIFICATION_ALLOWED_ERR;
549 static int cssIdentifierForFontSizeKeyword(int keywordSize)
551 ASSERT_ARG(keywordSize, keywordSize);
552 ASSERT_ARG(keywordSize, keywordSize <= 8);
553 return CSSValueXxSmall + keywordSize - 1;
556 PassRefPtr<CSSValue> CSSComputedStyleDeclaration::getFontSizeCSSValuePreferringKeyword() const
558 Node* node = m_node.get();
562 node->document()->updateLayoutIgnorePendingStylesheets();
564 RefPtr<RenderStyle> style = node->computedStyle(m_pseudoElementSpecifier);
568 if (int keywordSize = style->fontDescription().keywordSize())
569 return CSSPrimitiveValue::createIdentifier(cssIdentifierForFontSizeKeyword(keywordSize));
571 return CSSPrimitiveValue::create(style->fontDescription().computedPixelSize(), CSSPrimitiveValue::CSS_PX);
574 PassRefPtr<CSSValue> CSSComputedStyleDeclaration::valueForShadow(const ShadowData* shadow, int id) const
577 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
579 CSSPropertyID propertyID = static_cast<CSSPropertyID>(id);
581 RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
582 for (const ShadowData* s = shadow; s; s = s->next()) {
583 RefPtr<CSSPrimitiveValue> x = CSSPrimitiveValue::create(s->x(), CSSPrimitiveValue::CSS_PX);
584 RefPtr<CSSPrimitiveValue> y = CSSPrimitiveValue::create(s->y(), CSSPrimitiveValue::CSS_PX);
585 RefPtr<CSSPrimitiveValue> blur = CSSPrimitiveValue::create(s->blur(), CSSPrimitiveValue::CSS_PX);
586 RefPtr<CSSPrimitiveValue> spread = propertyID == CSSPropertyTextShadow ? 0 : CSSPrimitiveValue::create(s->spread(), CSSPrimitiveValue::CSS_PX);
587 RefPtr<CSSPrimitiveValue> style = propertyID == CSSPropertyTextShadow || s->style() == Normal ? 0 : CSSPrimitiveValue::createIdentifier(CSSValueInset);
588 RefPtr<CSSPrimitiveValue> color = CSSPrimitiveValue::createColor(s->color().rgb());
589 list->prepend(ShadowValue::create(x.release(), y.release(), blur.release(), spread.release(), style.release(), color.release()));
591 return list.release();
594 PassRefPtr<CSSValue> CSSComputedStyleDeclaration::getPropertyCSSValue(int propertyID) const
596 return getPropertyCSSValue(propertyID, UpdateLayout);
599 static int identifierForFamily(const AtomicString& family)
601 DEFINE_STATIC_LOCAL(AtomicString, cursiveFamily, ("-webkit-cursive"));
602 DEFINE_STATIC_LOCAL(AtomicString, fantasyFamily, ("-webkit-fantasy"));
603 DEFINE_STATIC_LOCAL(AtomicString, monospaceFamily, ("-webkit-monospace"));
604 DEFINE_STATIC_LOCAL(AtomicString, sansSerifFamily, ("-webkit-sans-serif"));
605 DEFINE_STATIC_LOCAL(AtomicString, serifFamily, ("-webkit-serif"));
606 if (family == cursiveFamily)
607 return CSSValueCursive;
608 if (family == fantasyFamily)
609 return CSSValueFantasy;
610 if (family == monospaceFamily)
611 return CSSValueMonospace;
612 if (family == sansSerifFamily)
613 return CSSValueSansSerif;
614 if (family == serifFamily)
615 return CSSValueSerif;
619 static PassRefPtr<CSSPrimitiveValue> valueForFamily(const AtomicString& family)
621 if (int familyIdentifier = identifierForFamily(family))
622 return CSSPrimitiveValue::createIdentifier(familyIdentifier);
623 return CSSPrimitiveValue::create(family.string(), CSSPrimitiveValue::CSS_STRING);
626 static PassRefPtr<CSSValue> renderTextDecorationFlagsToCSSValue(int textDecoration)
628 RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
629 if (textDecoration & UNDERLINE)
630 list->append(CSSPrimitiveValue::createIdentifier(CSSValueUnderline));
631 if (textDecoration & OVERLINE)
632 list->append(CSSPrimitiveValue::createIdentifier(CSSValueOverline));
633 if (textDecoration & LINE_THROUGH)
634 list->append(CSSPrimitiveValue::createIdentifier(CSSValueLineThrough));
635 if (textDecoration & BLINK)
636 list->append(CSSPrimitiveValue::createIdentifier(CSSValueBlink));
639 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
643 static PassRefPtr<CSSValue> fillRepeatToCSSValue(EFillRepeat xRepeat, EFillRepeat yRepeat)
645 // For backwards compatibility, if both values are equal, just return one of them. And
646 // if the two values are equivalent to repeat-x or repeat-y, just return the shorthand.
647 if (xRepeat == yRepeat)
648 return CSSPrimitiveValue::create(xRepeat);
649 if (xRepeat == RepeatFill && yRepeat == NoRepeatFill)
650 return CSSPrimitiveValue::createIdentifier(CSSValueRepeatX);
651 if (xRepeat == NoRepeatFill && yRepeat == RepeatFill)
652 return CSSPrimitiveValue::createIdentifier(CSSValueRepeatY);
654 RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
655 list->append(CSSPrimitiveValue::create(xRepeat));
656 list->append(CSSPrimitiveValue::create(yRepeat));
657 return list.release();
660 static void logUnimplementedPropertyID(int propertyID)
662 DEFINE_STATIC_LOCAL(HashSet<int>, propertyIDSet, ());
663 if (!propertyIDSet.add(propertyID).second)
666 LOG_ERROR("WebKit does not yet implement getComputedStyle for '%s'.", getPropertyName(static_cast<CSSPropertyID>(propertyID)));
669 PassRefPtr<CSSValue> CSSComputedStyleDeclaration::getPropertyCSSValue(int propertyID, EUpdateLayout updateLayout) const
671 Node* node = m_node.get();
675 // Make sure our layout is up to date before we allow a query on these attributes.
677 node->document()->updateLayoutIgnorePendingStylesheets();
679 RenderObject* renderer = node->renderer();
681 RefPtr<RenderStyle> style;
682 if (renderer && hasCompositedLayer(renderer) && AnimationController::supportsAcceleratedAnimationOfProperty(static_cast<CSSPropertyID>(propertyID))) {
683 style = renderer->animation()->getAnimatedStyleForRenderer(renderer);
684 if (m_pseudoElementSpecifier) {
685 // FIXME: This cached pseudo style will only exist if the animation has been run at least once.
686 style = style->getCachedPseudoStyle(m_pseudoElementSpecifier);
689 style = node->computedStyle(m_pseudoElementSpecifier);
694 #ifdef ANDROID_LAYOUT
695 const Settings * settings = node->document()->frame() ? node->document()->frame()->settings() : 0;
698 switch (static_cast<CSSPropertyID>(propertyID)) {
699 case CSSPropertyInvalid:
702 case CSSPropertyBackgroundColor:
703 return CSSPrimitiveValue::createColor(m_allowVisitedStyle? style->visitedDependentColor(CSSPropertyBackgroundColor).rgb() : style->backgroundColor().rgb());
704 case CSSPropertyBackgroundImage:
705 if (style->backgroundImage())
706 return style->backgroundImage()->cssValue();
707 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
708 case CSSPropertyBackgroundSize:
709 case CSSPropertyWebkitBackgroundSize: {
710 EFillSizeType size = style->backgroundSizeType();
712 return CSSPrimitiveValue::createIdentifier(CSSValueContain);
714 return CSSPrimitiveValue::createIdentifier(CSSValueCover);
715 RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
716 list->append(CSSPrimitiveValue::create(style->backgroundSizeLength().width()));
717 list->append(CSSPrimitiveValue::create(style->backgroundSizeLength().height()));
718 return list.release();
720 case CSSPropertyBackgroundRepeat:
721 return fillRepeatToCSSValue(style->backgroundRepeatX(), style->backgroundRepeatY());
722 case CSSPropertyWebkitBackgroundComposite:
723 return CSSPrimitiveValue::create(style->backgroundComposite());
724 case CSSPropertyBackgroundAttachment:
725 return CSSPrimitiveValue::create(style->backgroundAttachment());
726 case CSSPropertyBackgroundClip:
727 case CSSPropertyBackgroundOrigin:
728 case CSSPropertyWebkitBackgroundClip:
729 case CSSPropertyWebkitBackgroundOrigin: {
730 EFillBox box = (propertyID == CSSPropertyWebkitBackgroundClip || propertyID == CSSPropertyBackgroundClip) ? style->backgroundClip() : style->backgroundOrigin();
731 return CSSPrimitiveValue::create(box);
733 case CSSPropertyBackgroundPosition: {
734 RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
736 list->append(CSSPrimitiveValue::create(style->backgroundXPosition()));
737 list->append(CSSPrimitiveValue::create(style->backgroundYPosition()));
739 return list.release();
741 case CSSPropertyBackgroundPositionX:
742 return CSSPrimitiveValue::create(style->backgroundXPosition());
743 case CSSPropertyBackgroundPositionY:
744 return CSSPrimitiveValue::create(style->backgroundYPosition());
745 case CSSPropertyBorderCollapse:
746 if (style->borderCollapse())
747 return CSSPrimitiveValue::createIdentifier(CSSValueCollapse);
748 return CSSPrimitiveValue::createIdentifier(CSSValueSeparate);
749 case CSSPropertyBorderSpacing: {
750 RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
751 list->append(CSSPrimitiveValue::create(style->horizontalBorderSpacing(), CSSPrimitiveValue::CSS_PX));
752 list->append(CSSPrimitiveValue::create(style->verticalBorderSpacing(), CSSPrimitiveValue::CSS_PX));
753 return list.release();
755 case CSSPropertyWebkitBorderHorizontalSpacing:
756 return CSSPrimitiveValue::create(style->horizontalBorderSpacing(), CSSPrimitiveValue::CSS_PX);
757 case CSSPropertyWebkitBorderVerticalSpacing:
758 return CSSPrimitiveValue::create(style->verticalBorderSpacing(), CSSPrimitiveValue::CSS_PX);
759 case CSSPropertyBorderTopColor:
760 return m_allowVisitedStyle ? CSSPrimitiveValue::createColor(style->visitedDependentColor(CSSPropertyBorderTopColor).rgb()) : currentColorOrValidColor(style.get(), style->borderTopColor());
761 case CSSPropertyBorderRightColor:
762 return m_allowVisitedStyle ? CSSPrimitiveValue::createColor(style->visitedDependentColor(CSSPropertyBorderRightColor).rgb()) : currentColorOrValidColor(style.get(), style->borderRightColor());
763 case CSSPropertyBorderBottomColor:
764 return m_allowVisitedStyle ? CSSPrimitiveValue::createColor(style->visitedDependentColor(CSSPropertyBorderBottomColor).rgb()) : currentColorOrValidColor(style.get(), style->borderBottomColor());
765 case CSSPropertyBorderLeftColor:
766 return m_allowVisitedStyle ? CSSPrimitiveValue::createColor(style->visitedDependentColor(CSSPropertyBorderLeftColor).rgb()) : currentColorOrValidColor(style.get(), style->borderLeftColor());
767 case CSSPropertyBorderTopStyle:
768 return CSSPrimitiveValue::create(style->borderTopStyle());
769 case CSSPropertyBorderRightStyle:
770 return CSSPrimitiveValue::create(style->borderRightStyle());
771 case CSSPropertyBorderBottomStyle:
772 return CSSPrimitiveValue::create(style->borderBottomStyle());
773 case CSSPropertyBorderLeftStyle:
774 return CSSPrimitiveValue::create(style->borderLeftStyle());
775 case CSSPropertyBorderTopWidth:
776 return CSSPrimitiveValue::create(style->borderTopWidth(), CSSPrimitiveValue::CSS_PX);
777 case CSSPropertyBorderRightWidth:
778 return CSSPrimitiveValue::create(style->borderRightWidth(), CSSPrimitiveValue::CSS_PX);
779 case CSSPropertyBorderBottomWidth:
780 return CSSPrimitiveValue::create(style->borderBottomWidth(), CSSPrimitiveValue::CSS_PX);
781 case CSSPropertyBorderLeftWidth:
782 return CSSPrimitiveValue::create(style->borderLeftWidth(), CSSPrimitiveValue::CSS_PX);
783 case CSSPropertyBottom:
784 return getPositionOffsetValue(style.get(), CSSPropertyBottom);
785 case CSSPropertyWebkitBoxAlign:
786 return CSSPrimitiveValue::create(style->boxAlign());
787 case CSSPropertyWebkitBoxDirection:
788 return CSSPrimitiveValue::create(style->boxDirection());
789 case CSSPropertyWebkitBoxFlex:
790 return CSSPrimitiveValue::create(style->boxFlex(), CSSPrimitiveValue::CSS_NUMBER);
791 case CSSPropertyWebkitBoxFlexGroup:
792 return CSSPrimitiveValue::create(style->boxFlexGroup(), CSSPrimitiveValue::CSS_NUMBER);
793 case CSSPropertyWebkitBoxLines:
794 return CSSPrimitiveValue::create(style->boxLines());
795 case CSSPropertyWebkitBoxOrdinalGroup:
796 return CSSPrimitiveValue::create(style->boxOrdinalGroup(), CSSPrimitiveValue::CSS_NUMBER);
797 case CSSPropertyWebkitBoxOrient:
798 return CSSPrimitiveValue::create(style->boxOrient());
799 case CSSPropertyWebkitBoxPack: {
800 EBoxAlignment boxPack = style->boxPack();
801 ASSERT(boxPack != BSTRETCH);
802 ASSERT(boxPack != BBASELINE);
803 if (boxPack == BJUSTIFY || boxPack== BBASELINE)
805 return CSSPrimitiveValue::create(boxPack);
807 case CSSPropertyWebkitBoxReflect:
808 return valueForReflection(style->boxReflect());
809 case CSSPropertyWebkitBoxShadow:
810 return valueForShadow(style->boxShadow(), propertyID);
811 case CSSPropertyCaptionSide:
812 return CSSPrimitiveValue::create(style->captionSide());
813 case CSSPropertyClear:
814 return CSSPrimitiveValue::create(style->clear());
815 case CSSPropertyColor:
816 return CSSPrimitiveValue::createColor(m_allowVisitedStyle ? style->visitedDependentColor(CSSPropertyColor).rgb() : style->color().rgb());
817 case CSSPropertyWebkitColumnCount:
818 if (style->hasAutoColumnCount())
819 return CSSPrimitiveValue::createIdentifier(CSSValueAuto);
820 return CSSPrimitiveValue::create(style->columnCount(), CSSPrimitiveValue::CSS_NUMBER);
821 case CSSPropertyWebkitColumnGap:
822 if (style->hasNormalColumnGap())
823 return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
824 return CSSPrimitiveValue::create(style->columnGap(), CSSPrimitiveValue::CSS_NUMBER);
825 case CSSPropertyWebkitColumnRuleColor:
826 return m_allowVisitedStyle ? CSSPrimitiveValue::createColor(style->visitedDependentColor(CSSPropertyOutlineColor).rgb()) : currentColorOrValidColor(style.get(), style->columnRuleColor());
827 case CSSPropertyWebkitColumnRuleStyle:
828 return CSSPrimitiveValue::create(style->columnRuleStyle());
829 case CSSPropertyWebkitColumnRuleWidth:
830 return CSSPrimitiveValue::create(style->columnRuleWidth(), CSSPrimitiveValue::CSS_PX);
831 case CSSPropertyWebkitColumnSpan:
832 if (style->columnSpan())
833 return CSSPrimitiveValue::createIdentifier(CSSValueAll);
834 return CSSPrimitiveValue::create(1, CSSPrimitiveValue::CSS_NUMBER);
835 case CSSPropertyWebkitColumnBreakAfter:
836 return CSSPrimitiveValue::create(style->columnBreakAfter());
837 case CSSPropertyWebkitColumnBreakBefore:
838 return CSSPrimitiveValue::create(style->columnBreakBefore());
839 case CSSPropertyWebkitColumnBreakInside:
840 return CSSPrimitiveValue::create(style->columnBreakInside());
841 case CSSPropertyWebkitColumnWidth:
842 if (style->hasAutoColumnWidth())
843 return CSSPrimitiveValue::createIdentifier(CSSValueAuto);
844 return CSSPrimitiveValue::create(style->columnWidth(), CSSPrimitiveValue::CSS_NUMBER);
845 case CSSPropertyCursor: {
846 RefPtr<CSSValueList> list;
847 CursorList* cursors = style->cursors();
848 if (cursors && cursors->size() > 0) {
849 list = CSSValueList::createCommaSeparated();
850 for (unsigned i = 0; i < cursors->size(); ++i)
851 list->append(CSSPrimitiveValue::create((*cursors)[i].image()->url(), CSSPrimitiveValue::CSS_URI));
853 RefPtr<CSSValue> value = CSSPrimitiveValue::create(style->cursor());
856 return list.release();
858 return value.release();
860 case CSSPropertyDirection:
861 return CSSPrimitiveValue::create(style->direction());
862 case CSSPropertyDisplay:
863 return CSSPrimitiveValue::create(style->display());
864 case CSSPropertyEmptyCells:
865 return CSSPrimitiveValue::create(style->emptyCells());
866 case CSSPropertyFloat:
867 #ifdef ANDROID_LAYOUT
868 if (settings && settings->layoutAlgorithm() == Settings::kLayoutSSR)
869 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
871 return CSSPrimitiveValue::create(style->floating());
872 case CSSPropertyFontFamily: {
873 const FontFamily& firstFamily = style->fontDescription().family();
874 if (!firstFamily.next())
875 return valueForFamily(firstFamily.family());
876 RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
877 for (const FontFamily* family = &firstFamily; family; family = family->next())
878 list->append(valueForFamily(family->family()));
879 return list.release();
881 case CSSPropertyFontSize:
882 return CSSPrimitiveValue::create(style->fontDescription().computedPixelSize(), CSSPrimitiveValue::CSS_PX);
883 case CSSPropertyWebkitBinding:
885 case CSSPropertyFontStyle:
886 if (style->fontDescription().italic())
887 return CSSPrimitiveValue::createIdentifier(CSSValueItalic);
888 return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
889 case CSSPropertyFontVariant:
890 if (style->fontDescription().smallCaps())
891 return CSSPrimitiveValue::createIdentifier(CSSValueSmallCaps);
892 return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
893 case CSSPropertyFontWeight:
894 switch (style->fontDescription().weight()) {
896 return CSSPrimitiveValue::createIdentifier(CSSValue100);
898 return CSSPrimitiveValue::createIdentifier(CSSValue200);
900 return CSSPrimitiveValue::createIdentifier(CSSValue300);
901 case FontWeightNormal:
902 return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
904 return CSSPrimitiveValue::createIdentifier(CSSValue500);
906 return CSSPrimitiveValue::createIdentifier(CSSValue600);
908 return CSSPrimitiveValue::createIdentifier(CSSValueBold);
910 return CSSPrimitiveValue::createIdentifier(CSSValue800);
912 return CSSPrimitiveValue::createIdentifier(CSSValue900);
914 ASSERT_NOT_REACHED();
915 return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
916 case CSSPropertyHeight:
918 return CSSPrimitiveValue::create(sizingBox(renderer).height(), CSSPrimitiveValue::CSS_PX);
919 return CSSPrimitiveValue::create(style->height());
920 case CSSPropertyWebkitHighlight:
921 if (style->highlight() == nullAtom)
922 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
923 return CSSPrimitiveValue::create(style->highlight(), CSSPrimitiveValue::CSS_STRING);
924 case CSSPropertyWebkitBorderFit:
925 if (style->borderFit() == BorderFitBorder)
926 return CSSPrimitiveValue::createIdentifier(CSSValueBorder);
927 return CSSPrimitiveValue::createIdentifier(CSSValueLines);
928 case CSSPropertyLeft:
929 return getPositionOffsetValue(style.get(), CSSPropertyLeft);
930 case CSSPropertyLetterSpacing:
931 if (!style->letterSpacing())
932 return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
933 return CSSPrimitiveValue::create(style->letterSpacing(), CSSPrimitiveValue::CSS_PX);
934 case CSSPropertyWebkitLineClamp:
935 if (style->lineClamp().isNone())
936 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
937 return CSSPrimitiveValue::create(style->lineClamp().value(), style->lineClamp().isPercentage() ? CSSPrimitiveValue::CSS_PERCENTAGE : CSSPrimitiveValue::CSS_NUMBER);
938 case CSSPropertyLineHeight: {
939 Length length = style->lineHeight();
940 if (length.isNegative())
941 return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
942 if (length.isPercent())
943 // This is imperfect, because it doesn't include the zoom factor and the real computation
944 // for how high to be in pixels does include things like minimum font size and the zoom factor.
945 // On the other hand, since font-size doesn't include the zoom factor, we really can't do
947 return CSSPrimitiveValue::create(static_cast<int>(length.percent() * style->fontDescription().specifiedSize()) / 100, CSSPrimitiveValue::CSS_PX);
948 return CSSPrimitiveValue::create(length.value(), CSSPrimitiveValue::CSS_PX);
950 case CSSPropertyListStyleImage:
951 if (style->listStyleImage())
952 return style->listStyleImage()->cssValue();
953 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
954 case CSSPropertyListStylePosition:
955 return CSSPrimitiveValue::create(style->listStylePosition());
956 case CSSPropertyListStyleType:
957 return CSSPrimitiveValue::create(style->listStyleType());
958 case CSSPropertyMarginTop:
959 if (renderer && renderer->isBox())
960 // FIXME: Supposed to return the percentage if percentage was specified.
961 return CSSPrimitiveValue::create(toRenderBox(renderer)->marginTop(), CSSPrimitiveValue::CSS_PX);
962 return CSSPrimitiveValue::create(style->marginTop());
963 case CSSPropertyMarginRight:
964 if (renderer && renderer->isBox())
965 // FIXME: Supposed to return the percentage if percentage was specified.
966 return CSSPrimitiveValue::create(toRenderBox(renderer)->marginRight(), CSSPrimitiveValue::CSS_PX);
967 return CSSPrimitiveValue::create(style->marginRight());
968 case CSSPropertyMarginBottom:
969 if (renderer && renderer->isBox())
970 // FIXME: Supposed to return the percentage if percentage was specified.
971 return CSSPrimitiveValue::create(toRenderBox(renderer)->marginBottom(), CSSPrimitiveValue::CSS_PX);
972 return CSSPrimitiveValue::create(style->marginBottom());
973 case CSSPropertyMarginLeft:
974 if (renderer && renderer->isBox())
975 // FIXME: Supposed to return the percentage if percentage was specified.
976 return CSSPrimitiveValue::create(toRenderBox(renderer)->marginLeft(), CSSPrimitiveValue::CSS_PX);
977 return CSSPrimitiveValue::create(style->marginLeft());
978 case CSSPropertyWebkitMarqueeDirection:
979 return CSSPrimitiveValue::create(style->marqueeDirection());
980 case CSSPropertyWebkitMarqueeIncrement:
981 return CSSPrimitiveValue::create(style->marqueeIncrement());
982 case CSSPropertyWebkitMarqueeRepetition:
983 if (style->marqueeLoopCount() < 0)
984 return CSSPrimitiveValue::createIdentifier(CSSValueInfinite);
985 return CSSPrimitiveValue::create(style->marqueeLoopCount(), CSSPrimitiveValue::CSS_NUMBER);
986 case CSSPropertyWebkitMarqueeStyle:
987 return CSSPrimitiveValue::create(style->marqueeBehavior());
988 case CSSPropertyWebkitMaskImage:
989 if (style->maskImage())
990 return style->maskImage()->cssValue();
991 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
992 case CSSPropertyWebkitMaskSize: {
993 EFillSizeType size = style->maskSizeType();
995 return CSSPrimitiveValue::createIdentifier(CSSValueContain);
997 return CSSPrimitiveValue::createIdentifier(CSSValueCover);
998 RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
999 list->append(CSSPrimitiveValue::create(style->maskSizeLength().width()));
1000 list->append(CSSPrimitiveValue::create(style->maskSizeLength().height()));
1001 return list.release();
1003 case CSSPropertyWebkitMaskRepeat:
1004 return fillRepeatToCSSValue(style->maskRepeatX(), style->maskRepeatY());
1005 case CSSPropertyWebkitMaskAttachment:
1006 return CSSPrimitiveValue::create(style->maskAttachment());
1007 case CSSPropertyWebkitMaskComposite:
1008 return CSSPrimitiveValue::create(style->maskComposite());
1009 case CSSPropertyWebkitMaskClip:
1010 case CSSPropertyWebkitMaskOrigin: {
1011 EFillBox box = (propertyID == CSSPropertyWebkitMaskClip ? style->maskClip() : style->maskOrigin());
1012 return CSSPrimitiveValue::create(box);
1014 case CSSPropertyWebkitMaskPosition: {
1015 RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
1017 list->append(CSSPrimitiveValue::create(style->maskXPosition()));
1018 list->append(CSSPrimitiveValue::create(style->maskYPosition()));
1020 return list.release();
1022 case CSSPropertyWebkitMaskPositionX:
1023 return CSSPrimitiveValue::create(style->maskXPosition());
1024 case CSSPropertyWebkitMaskPositionY:
1025 return CSSPrimitiveValue::create(style->maskYPosition());
1026 case CSSPropertyWebkitUserModify:
1027 return CSSPrimitiveValue::create(style->userModify());
1028 case CSSPropertyMaxHeight: {
1029 const Length& maxHeight = style->maxHeight();
1030 if (maxHeight.isFixed() && maxHeight.value() == undefinedLength)
1031 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
1032 return CSSPrimitiveValue::create(maxHeight);
1034 case CSSPropertyMaxWidth: {
1035 const Length& maxWidth = style->maxWidth();
1036 if (maxWidth.isFixed() && maxWidth.value() == undefinedLength)
1037 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
1038 return CSSPrimitiveValue::create(maxWidth);
1040 case CSSPropertyMinHeight:
1041 return CSSPrimitiveValue::create(style->minHeight());
1042 case CSSPropertyMinWidth:
1043 return CSSPrimitiveValue::create(style->minWidth());
1044 case CSSPropertyOpacity:
1045 return CSSPrimitiveValue::create(style->opacity(), CSSPrimitiveValue::CSS_NUMBER);
1046 case CSSPropertyOrphans:
1047 return CSSPrimitiveValue::create(style->orphans(), CSSPrimitiveValue::CSS_NUMBER);
1048 case CSSPropertyOutlineColor:
1049 return m_allowVisitedStyle ? CSSPrimitiveValue::createColor(style->visitedDependentColor(CSSPropertyOutlineColor).rgb()) : currentColorOrValidColor(style.get(), style->outlineColor());
1050 case CSSPropertyOutlineStyle:
1051 if (style->outlineStyleIsAuto())
1052 return CSSPrimitiveValue::createIdentifier(CSSValueAuto);
1053 return CSSPrimitiveValue::create(style->outlineStyle());
1054 case CSSPropertyOutlineWidth:
1055 return CSSPrimitiveValue::create(style->outlineWidth(), CSSPrimitiveValue::CSS_PX);
1056 case CSSPropertyOverflow:
1057 return CSSPrimitiveValue::create(max(style->overflowX(), style->overflowY()));
1058 case CSSPropertyOverflowX:
1059 return CSSPrimitiveValue::create(style->overflowX());
1060 case CSSPropertyOverflowY:
1061 #ifdef ANDROID_LAYOUT
1062 if (settings && settings->layoutAlgorithm() == Settings::kLayoutSSR)
1063 return CSSPrimitiveValue::createIdentifier(CSSValueVisible);
1065 return CSSPrimitiveValue::create(style->overflowY());
1066 case CSSPropertyPaddingTop:
1067 if (renderer && renderer->isBox())
1068 return CSSPrimitiveValue::create(toRenderBox(renderer)->paddingTop(false), CSSPrimitiveValue::CSS_PX);
1069 return CSSPrimitiveValue::create(style->paddingTop());
1070 case CSSPropertyPaddingRight:
1071 if (renderer && renderer->isBox())
1072 return CSSPrimitiveValue::create(toRenderBox(renderer)->paddingRight(false), CSSPrimitiveValue::CSS_PX);
1073 return CSSPrimitiveValue::create(style->paddingRight());
1074 case CSSPropertyPaddingBottom:
1075 if (renderer && renderer->isBox())
1076 return CSSPrimitiveValue::create(toRenderBox(renderer)->paddingBottom(false), CSSPrimitiveValue::CSS_PX);
1077 return CSSPrimitiveValue::create(style->paddingBottom());
1078 case CSSPropertyPaddingLeft:
1079 if (renderer && renderer->isBox())
1080 return CSSPrimitiveValue::create(toRenderBox(renderer)->paddingLeft(false), CSSPrimitiveValue::CSS_PX);
1081 return CSSPrimitiveValue::create(style->paddingLeft());
1082 case CSSPropertyPageBreakAfter:
1083 return CSSPrimitiveValue::create(style->pageBreakAfter());
1084 case CSSPropertyPageBreakBefore:
1085 return CSSPrimitiveValue::create(style->pageBreakBefore());
1086 case CSSPropertyPageBreakInside: {
1087 EPageBreak pageBreak = style->pageBreakInside();
1088 ASSERT(pageBreak != PBALWAYS);
1089 if (pageBreak == PBALWAYS)
1091 return CSSPrimitiveValue::create(style->pageBreakInside());
1093 case CSSPropertyPosition:
1094 #ifdef ANDROID_LAYOUT
1095 if (settings && settings->layoutAlgorithm() == Settings::kLayoutSSR)
1096 return CSSPrimitiveValue::createIdentifier(CSSValueStatic);
1098 return CSSPrimitiveValue::create(style->position());
1099 case CSSPropertyRight:
1100 return getPositionOffsetValue(style.get(), CSSPropertyRight);
1101 case CSSPropertyTableLayout:
1102 return CSSPrimitiveValue::create(style->tableLayout());
1103 case CSSPropertyTextAlign:
1104 return CSSPrimitiveValue::create(style->textAlign());
1105 case CSSPropertyTextDecoration:
1106 return renderTextDecorationFlagsToCSSValue(style->textDecoration());
1107 case CSSPropertyWebkitTextDecorationsInEffect:
1108 return renderTextDecorationFlagsToCSSValue(style->textDecorationsInEffect());
1109 case CSSPropertyWebkitTextFillColor:
1110 return currentColorOrValidColor(style.get(), style->textFillColor());
1111 case CSSPropertyTextIndent:
1112 return CSSPrimitiveValue::create(style->textIndent());
1113 case CSSPropertyTextShadow:
1114 return valueForShadow(style->textShadow(), propertyID);
1115 case CSSPropertyTextRendering:
1116 return CSSPrimitiveValue::create(style->fontDescription().textRenderingMode());
1117 case CSSPropertyTextOverflow:
1118 if (style->textOverflow())
1119 return CSSPrimitiveValue::createIdentifier(CSSValueEllipsis);
1120 return CSSPrimitiveValue::createIdentifier(CSSValueClip);
1121 case CSSPropertyWebkitTextSecurity:
1122 return CSSPrimitiveValue::create(style->textSecurity());
1123 case CSSPropertyWebkitTextSizeAdjust:
1124 if (style->textSizeAdjust())
1125 return CSSPrimitiveValue::createIdentifier(CSSValueAuto);
1126 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
1127 case CSSPropertyWebkitTextStrokeColor:
1128 return currentColorOrValidColor(style.get(), style->textStrokeColor());
1129 case CSSPropertyWebkitTextStrokeWidth:
1130 return CSSPrimitiveValue::create(style->textStrokeWidth(), CSSPrimitiveValue::CSS_PX);
1131 case CSSPropertyTextTransform:
1132 return CSSPrimitiveValue::create(style->textTransform());
1133 case CSSPropertyTop:
1134 return getPositionOffsetValue(style.get(), CSSPropertyTop);
1135 case CSSPropertyUnicodeBidi:
1136 return CSSPrimitiveValue::create(style->unicodeBidi());
1137 case CSSPropertyVerticalAlign:
1138 switch (style->verticalAlign()) {
1140 return CSSPrimitiveValue::createIdentifier(CSSValueBaseline);
1142 return CSSPrimitiveValue::createIdentifier(CSSValueMiddle);
1144 return CSSPrimitiveValue::createIdentifier(CSSValueSub);
1146 return CSSPrimitiveValue::createIdentifier(CSSValueSuper);
1148 return CSSPrimitiveValue::createIdentifier(CSSValueTextTop);
1150 return CSSPrimitiveValue::createIdentifier(CSSValueTextBottom);
1152 return CSSPrimitiveValue::createIdentifier(CSSValueTop);
1154 return CSSPrimitiveValue::createIdentifier(CSSValueBottom);
1155 case BASELINE_MIDDLE:
1156 return CSSPrimitiveValue::createIdentifier(CSSValueWebkitBaselineMiddle);
1158 return CSSPrimitiveValue::create(style->verticalAlignLength());
1160 ASSERT_NOT_REACHED();
1162 case CSSPropertyVisibility:
1163 #ifdef ANDROID_LAYOUT
1164 if (settings && settings->layoutAlgorithm() == Settings::kLayoutSSR)
1165 return CSSPrimitiveValue::createIdentifier(CSSValueVisible);
1167 return CSSPrimitiveValue::create(style->visibility());
1168 case CSSPropertyWhiteSpace:
1169 #ifdef ANDROID_LAYOUT
1170 if (settings && settings->layoutAlgorithm() == Settings::kLayoutSSR)
1171 switch (style->whiteSpace()) {
1175 return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
1178 return CSSPrimitiveValue::createIdentifier(CSSValuePreWrap);
1180 return CSSPrimitiveValue::createIdentifier(CSSValuePreLine);
1184 return CSSPrimitiveValue::create(style->whiteSpace());
1185 case CSSPropertyWidows:
1186 return CSSPrimitiveValue::create(style->widows(), CSSPrimitiveValue::CSS_NUMBER);
1187 case CSSPropertyWidth:
1189 return CSSPrimitiveValue::create(sizingBox(renderer).width(), CSSPrimitiveValue::CSS_PX);
1190 return CSSPrimitiveValue::create(style->width());
1191 case CSSPropertyWordBreak:
1192 return CSSPrimitiveValue::create(style->wordBreak());
1193 case CSSPropertyWordSpacing:
1194 return CSSPrimitiveValue::create(style->wordSpacing(), CSSPrimitiveValue::CSS_PX);
1195 case CSSPropertyWordWrap:
1196 return CSSPrimitiveValue::create(style->wordWrap());
1197 case CSSPropertyWebkitLineBreak:
1198 return CSSPrimitiveValue::create(style->khtmlLineBreak());
1199 case CSSPropertyWebkitNbspMode:
1200 return CSSPrimitiveValue::create(style->nbspMode());
1201 case CSSPropertyWebkitMatchNearestMailBlockquoteColor:
1202 return CSSPrimitiveValue::create(style->matchNearestMailBlockquoteColor());
1203 case CSSPropertyResize:
1204 return CSSPrimitiveValue::create(style->resize());
1205 case CSSPropertyWebkitFontSmoothing:
1206 return CSSPrimitiveValue::create(style->fontDescription().fontSmoothing());
1207 case CSSPropertyZIndex:
1208 if (style->hasAutoZIndex())
1209 return CSSPrimitiveValue::createIdentifier(CSSValueAuto);
1210 return CSSPrimitiveValue::create(style->zIndex(), CSSPrimitiveValue::CSS_NUMBER);
1211 case CSSPropertyZoom:
1212 return CSSPrimitiveValue::create(style->zoom(), CSSPrimitiveValue::CSS_NUMBER);
1213 case CSSPropertyWebkitBoxSizing:
1214 if (style->boxSizing() == CONTENT_BOX)
1215 return CSSPrimitiveValue::createIdentifier(CSSValueContentBox);
1216 return CSSPrimitiveValue::createIdentifier(CSSValueBorderBox);
1217 #if ENABLE(DASHBOARD_SUPPORT)
1218 case CSSPropertyWebkitDashboardRegion:
1220 const Vector<StyleDashboardRegion>& regions = style->dashboardRegions();
1221 unsigned count = regions.size();
1222 if (count == 1 && regions[0].type == StyleDashboardRegion::None)
1223 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
1225 RefPtr<DashboardRegion> firstRegion;
1226 DashboardRegion* previousRegion = 0;
1227 for (unsigned i = 0; i < count; i++) {
1228 RefPtr<DashboardRegion> region = DashboardRegion::create();
1229 StyleDashboardRegion styleRegion = regions[i];
1231 region->m_label = styleRegion.label;
1232 LengthBox offset = styleRegion.offset;
1233 region->setTop(CSSPrimitiveValue::create(offset.top().value(), CSSPrimitiveValue::CSS_PX));
1234 region->setRight(CSSPrimitiveValue::create(offset.right().value(), CSSPrimitiveValue::CSS_PX));
1235 region->setBottom(CSSPrimitiveValue::create(offset.bottom().value(), CSSPrimitiveValue::CSS_PX));
1236 region->setLeft(CSSPrimitiveValue::create(offset.left().value(), CSSPrimitiveValue::CSS_PX));
1237 region->m_isRectangle = (styleRegion.type == StyleDashboardRegion::Rectangle);
1238 region->m_isCircle = (styleRegion.type == StyleDashboardRegion::Circle);
1241 previousRegion->m_next = region;
1243 firstRegion = region;
1244 previousRegion = region.get();
1246 return CSSPrimitiveValue::create(firstRegion.release());
1249 case CSSPropertyWebkitAnimationDelay:
1250 return getDelayValue(style->animations());
1251 case CSSPropertyWebkitAnimationDirection: {
1252 RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
1253 const AnimationList* t = style->animations();
1255 for (size_t i = 0; i < t->size(); ++i) {
1256 if (t->animation(i)->direction())
1257 list->append(CSSPrimitiveValue::createIdentifier(CSSValueAlternate));
1259 list->append(CSSPrimitiveValue::createIdentifier(CSSValueNormal));
1262 list->append(CSSPrimitiveValue::createIdentifier(CSSValueNormal));
1263 return list.release();
1265 case CSSPropertyWebkitAnimationDuration:
1266 return getDurationValue(style->animations());
1267 case CSSPropertyWebkitAnimationFillMode: {
1268 RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
1269 const AnimationList* t = style->animations();
1271 for (size_t i = 0; i < t->size(); ++i) {
1272 switch (t->animation(i)->fillMode()) {
1273 case AnimationFillModeNone:
1274 list->append(CSSPrimitiveValue::createIdentifier(CSSValueNone));
1276 case AnimationFillModeForwards:
1277 list->append(CSSPrimitiveValue::createIdentifier(CSSValueForwards));
1279 case AnimationFillModeBackwards:
1280 list->append(CSSPrimitiveValue::createIdentifier(CSSValueBackwards));
1282 case AnimationFillModeBoth:
1283 list->append(CSSPrimitiveValue::createIdentifier(CSSValueBoth));
1288 list->append(CSSPrimitiveValue::createIdentifier(CSSValueNone));
1289 return list.release();
1291 case CSSPropertyWebkitAnimationIterationCount: {
1292 RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
1293 const AnimationList* t = style->animations();
1295 for (size_t i = 0; i < t->size(); ++i) {
1296 int iterationCount = t->animation(i)->iterationCount();
1297 if (iterationCount == Animation::IterationCountInfinite)
1298 list->append(CSSPrimitiveValue::createIdentifier(CSSValueInfinite));
1300 list->append(CSSPrimitiveValue::create(iterationCount, CSSPrimitiveValue::CSS_NUMBER));
1303 list->append(CSSPrimitiveValue::create(Animation::initialAnimationIterationCount(), CSSPrimitiveValue::CSS_NUMBER));
1304 return list.release();
1306 case CSSPropertyWebkitAnimationName: {
1307 RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
1308 const AnimationList* t = style->animations();
1310 for (size_t i = 0; i < t->size(); ++i) {
1311 list->append(CSSPrimitiveValue::create(t->animation(i)->name(), CSSPrimitiveValue::CSS_STRING));
1314 list->append(CSSPrimitiveValue::createIdentifier(CSSValueNone));
1315 return list.release();
1317 case CSSPropertyWebkitAnimationPlayState: {
1318 RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
1319 const AnimationList* t = style->animations();
1321 for (size_t i = 0; i < t->size(); ++i) {
1322 int prop = t->animation(i)->playState();
1323 if (prop == AnimPlayStatePlaying)
1324 list->append(CSSPrimitiveValue::createIdentifier(CSSValueRunning));
1326 list->append(CSSPrimitiveValue::createIdentifier(CSSValuePaused));
1329 list->append(CSSPrimitiveValue::createIdentifier(CSSValueRunning));
1330 return list.release();
1332 case CSSPropertyWebkitAnimationTimingFunction:
1333 return getTimingFunctionValue(style->animations());
1334 case CSSPropertyWebkitAppearance:
1335 return CSSPrimitiveValue::create(style->appearance());
1336 case CSSPropertyWebkitBackfaceVisibility:
1337 return CSSPrimitiveValue::createIdentifier((style->backfaceVisibility() == BackfaceVisibilityHidden) ? CSSValueHidden : CSSValueVisible);
1338 case CSSPropertyWebkitBorderImage:
1339 return valueForNinePieceImage(style->borderImage());
1340 case CSSPropertyWebkitMaskBoxImage:
1341 return valueForNinePieceImage(style->maskBoxImage());
1342 case CSSPropertyWebkitFontSizeDelta:
1343 // Not a real style property -- used by the editing engine -- so has no computed value.
1345 case CSSPropertyWebkitMarginBottomCollapse:
1346 return CSSPrimitiveValue::create(style->marginBottomCollapse());
1347 case CSSPropertyWebkitMarginTopCollapse:
1348 return CSSPrimitiveValue::create(style->marginTopCollapse());
1349 case CSSPropertyWebkitPerspective:
1350 if (!style->hasPerspective())
1351 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
1352 return CSSPrimitiveValue::create(style->perspective(), CSSPrimitiveValue::CSS_NUMBER);
1353 case CSSPropertyWebkitPerspectiveOrigin: {
1354 RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
1356 IntRect box = sizingBox(renderer);
1357 list->append(CSSPrimitiveValue::create(style->perspectiveOriginX().calcMinValue(box.width()), CSSPrimitiveValue::CSS_PX));
1358 list->append(CSSPrimitiveValue::create(style->perspectiveOriginY().calcMinValue(box.height()), CSSPrimitiveValue::CSS_PX));
1361 list->append(CSSPrimitiveValue::create(style->perspectiveOriginX()));
1362 list->append(CSSPrimitiveValue::create(style->perspectiveOriginY()));
1364 return list.release();
1366 case CSSPropertyWebkitRtlOrdering:
1367 if (style->visuallyOrdered())
1368 return CSSPrimitiveValue::createIdentifier(CSSValueVisual);
1369 return CSSPrimitiveValue::createIdentifier(CSSValueLogical);
1370 case CSSPropertyWebkitUserDrag:
1371 return CSSPrimitiveValue::create(style->userDrag());
1372 case CSSPropertyWebkitUserSelect:
1373 return CSSPrimitiveValue::create(style->userSelect());
1374 case CSSPropertyBorderBottomLeftRadius:
1375 return getBorderRadiusCornerValue(style->borderBottomLeftRadius());
1376 case CSSPropertyBorderBottomRightRadius:
1377 return getBorderRadiusCornerValue(style->borderBottomRightRadius());
1378 case CSSPropertyBorderTopLeftRadius:
1379 return getBorderRadiusCornerValue(style->borderTopLeftRadius());
1380 case CSSPropertyBorderTopRightRadius:
1381 return getBorderRadiusCornerValue(style->borderTopRightRadius());
1382 case CSSPropertyClip: {
1383 if (!style->hasClip())
1384 return CSSPrimitiveValue::createIdentifier(CSSValueAuto);
1385 RefPtr<Rect> rect = Rect::create();
1386 rect->setTop(CSSPrimitiveValue::create(style->clip().top().value(), CSSPrimitiveValue::CSS_PX));
1387 rect->setRight(CSSPrimitiveValue::create(style->clip().right().value(), CSSPrimitiveValue::CSS_PX));
1388 rect->setBottom(CSSPrimitiveValue::create(style->clip().bottom().value(), CSSPrimitiveValue::CSS_PX));
1389 rect->setLeft(CSSPrimitiveValue::create(style->clip().left().value(), CSSPrimitiveValue::CSS_PX));
1390 return CSSPrimitiveValue::create(rect.release());
1392 case CSSPropertyWebkitTransform:
1393 return computedTransform(renderer, style.get());
1394 case CSSPropertyWebkitTransformOrigin: {
1395 RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
1397 IntRect box = sizingBox(renderer);
1398 list->append(CSSPrimitiveValue::create(style->transformOriginX().calcMinValue(box.width()), CSSPrimitiveValue::CSS_PX));
1399 list->append(CSSPrimitiveValue::create(style->transformOriginY().calcMinValue(box.height()), CSSPrimitiveValue::CSS_PX));
1400 if (style->transformOriginZ() != 0)
1401 list->append(CSSPrimitiveValue::create(style->transformOriginZ(), CSSPrimitiveValue::CSS_PX));
1403 list->append(CSSPrimitiveValue::create(style->transformOriginX()));
1404 list->append(CSSPrimitiveValue::create(style->transformOriginY()));
1405 if (style->transformOriginZ() != 0)
1406 list->append(CSSPrimitiveValue::create(style->transformOriginZ(), CSSPrimitiveValue::CSS_PX));
1408 return list.release();
1410 case CSSPropertyWebkitTransformStyle:
1411 return CSSPrimitiveValue::createIdentifier((style->transformStyle3D() == TransformStyle3DPreserve3D) ? CSSValuePreserve3d : CSSValueFlat);
1412 case CSSPropertyWebkitTransitionDelay:
1413 return getDelayValue(style->transitions());
1414 case CSSPropertyWebkitTransitionDuration:
1415 return getDurationValue(style->transitions());
1416 case CSSPropertyWebkitTransitionProperty: {
1417 RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
1418 const AnimationList* t = style->transitions();
1420 for (size_t i = 0; i < t->size(); ++i) {
1421 int prop = t->animation(i)->property();
1422 RefPtr<CSSValue> propertyValue;
1423 if (prop == cAnimateNone)
1424 propertyValue = CSSPrimitiveValue::createIdentifier(CSSValueNone);
1425 else if (prop == cAnimateAll)
1426 propertyValue = CSSPrimitiveValue::createIdentifier(CSSValueAll);
1428 propertyValue = CSSPrimitiveValue::create(getPropertyName(static_cast<CSSPropertyID>(prop)), CSSPrimitiveValue::CSS_STRING);
1429 list->append(propertyValue);
1432 list->append(CSSPrimitiveValue::createIdentifier(CSSValueAll));
1433 return list.release();
1435 case CSSPropertyWebkitTransitionTimingFunction:
1436 return getTimingFunctionValue(style->transitions());
1437 case CSSPropertyPointerEvents:
1438 return CSSPrimitiveValue::create(style->pointerEvents());
1439 case CSSPropertyWebkitColorCorrection:
1440 return CSSPrimitiveValue::create(style->colorSpace());
1442 /* Shorthand properties, currently not supported see bug 13658*/
1443 case CSSPropertyBackground:
1444 case CSSPropertyBorder:
1445 case CSSPropertyBorderBottom:
1446 case CSSPropertyBorderColor:
1447 case CSSPropertyBorderLeft:
1448 case CSSPropertyBorderRadius:
1449 case CSSPropertyBorderRight:
1450 case CSSPropertyBorderStyle:
1451 case CSSPropertyBorderTop:
1452 case CSSPropertyBorderWidth:
1453 case CSSPropertyFont:
1454 case CSSPropertyListStyle:
1455 case CSSPropertyMargin:
1456 case CSSPropertyPadding:
1459 /* Unimplemented CSS 3 properties (including CSS3 shorthand properties) */
1460 case CSSPropertyTextLineThrough:
1461 case CSSPropertyTextLineThroughColor:
1462 case CSSPropertyTextLineThroughMode:
1463 case CSSPropertyTextLineThroughStyle:
1464 case CSSPropertyTextLineThroughWidth:
1465 case CSSPropertyTextOverline:
1466 case CSSPropertyTextOverlineColor:
1467 case CSSPropertyTextOverlineMode:
1468 case CSSPropertyTextOverlineStyle:
1469 case CSSPropertyTextOverlineWidth:
1470 case CSSPropertyTextUnderline:
1471 case CSSPropertyTextUnderlineColor:
1472 case CSSPropertyTextUnderlineMode:
1473 case CSSPropertyTextUnderlineStyle:
1474 case CSSPropertyTextUnderlineWidth:
1477 /* Unimplemented @font-face properties */
1478 case CSSPropertyFontStretch:
1479 case CSSPropertySrc:
1480 case CSSPropertyUnicodeRange:
1483 /* Other unimplemented properties */
1484 case CSSPropertyBackgroundRepeatX:
1485 case CSSPropertyBackgroundRepeatY:
1486 case CSSPropertyContent: // FIXME: needs implementation, bug 23668
1487 case CSSPropertyCounterIncrement:
1488 case CSSPropertyCounterReset:
1489 case CSSPropertyOutline: // FIXME: needs implementation
1490 case CSSPropertyOutlineOffset: // FIXME: needs implementation
1491 case CSSPropertyPage: // for @page
1492 case CSSPropertyQuotes: // FIXME: needs implementation
1493 case CSSPropertySize: // for @page
1496 /* Unimplemented -webkit- properties */
1497 case CSSPropertyWebkitAnimation:
1498 case CSSPropertyWebkitBorderRadius:
1499 case CSSPropertyWebkitColumns:
1500 case CSSPropertyWebkitColumnRule:
1501 case CSSPropertyWebkitMarginCollapse:
1502 case CSSPropertyWebkitMarginStart:
1503 case CSSPropertyWebkitMarquee:
1504 case CSSPropertyWebkitMarqueeSpeed:
1505 case CSSPropertyWebkitMask:
1506 case CSSPropertyWebkitMaskRepeatX:
1507 case CSSPropertyWebkitMaskRepeatY:
1508 case CSSPropertyWebkitPaddingStart:
1509 case CSSPropertyWebkitPerspectiveOriginX:
1510 case CSSPropertyWebkitPerspectiveOriginY:
1511 case CSSPropertyWebkitTextStroke:
1512 case CSSPropertyWebkitTransformOriginX:
1513 case CSSPropertyWebkitTransformOriginY:
1514 case CSSPropertyWebkitTransformOriginZ:
1515 case CSSPropertyWebkitTransition:
1516 case CSSPropertyWebkitVariableDeclarationBlock:
1518 #ifdef ANDROID_CSS_TAP_HIGHLIGHT_COLOR
1519 case CSSPropertyWebkitTapHighlightColor:
1520 return CSSPrimitiveValue::createColor(style->tapHighlightColor().rgb());
1523 // FIXME: This default case ruins the point of using an enum for
1524 // properties -- it prevents us from getting a warning when we
1525 // forget to list a property above.
1527 return getSVGPropertyCSSValue(propertyID, DoNotUpdateLayout);
1531 logUnimplementedPropertyID(propertyID);
1535 String CSSComputedStyleDeclaration::getPropertyValue(int propertyID) const
1537 RefPtr<CSSValue> value = getPropertyCSSValue(propertyID);
1539 return value->cssText();
1543 bool CSSComputedStyleDeclaration::getPropertyPriority(int /*propertyID*/) const
1545 // All computed styles have a priority of false (not "important").
1549 String CSSComputedStyleDeclaration::removeProperty(int /*propertyID*/, ExceptionCode& ec)
1551 ec = NO_MODIFICATION_ALLOWED_ERR;
1555 void CSSComputedStyleDeclaration::setProperty(int /*propertyID*/, const String& /*value*/, bool /*important*/, ExceptionCode& ec)
1557 ec = NO_MODIFICATION_ALLOWED_ERR;
1560 unsigned CSSComputedStyleDeclaration::virtualLength() const
1562 Node* node = m_node.get();
1566 RenderStyle* style = node->computedStyle(m_pseudoElementSpecifier);
1570 return numComputedProperties;
1573 String CSSComputedStyleDeclaration::item(unsigned i) const
1578 return getPropertyName(static_cast<CSSPropertyID>(computedProperties[i]));
1581 bool CSSComputedStyleDeclaration::cssPropertyMatches(const CSSProperty* property) const
1583 if (property->id() == CSSPropertyFontSize && property->value()->isPrimitiveValue() && m_node) {
1584 m_node->document()->updateLayoutIgnorePendingStylesheets();
1585 RenderStyle* style = m_node->computedStyle(m_pseudoElementSpecifier);
1586 if (style && style->fontDescription().keywordSize()) {
1587 int sizeValue = cssIdentifierForFontSizeKeyword(style->fontDescription().keywordSize());
1588 CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(property->value());
1589 if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_IDENT && primitiveValue->getIdent() == sizeValue)
1594 return CSSStyleDeclaration::cssPropertyMatches(property);
1597 PassRefPtr<CSSMutableStyleDeclaration> CSSComputedStyleDeclaration::copy() const
1599 return copyPropertiesInSet(computedProperties, numComputedProperties);
1602 PassRefPtr<CSSMutableStyleDeclaration> CSSComputedStyleDeclaration::makeMutable()
1607 } // namespace WebCore