2 * Copyright (C) 2004 Zack Rusin <zack@kde.org>
3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 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 propertyID = CSSProperty::resolveDirectionAwareProperty(propertyID, style->direction());
695 #ifdef ANDROID_LAYOUT
696 const Settings * settings = node->document()->frame() ? node->document()->frame()->settings() : 0;
699 switch (static_cast<CSSPropertyID>(propertyID)) {
700 case CSSPropertyInvalid:
703 case CSSPropertyBackgroundColor:
704 return CSSPrimitiveValue::createColor(m_allowVisitedStyle? style->visitedDependentColor(CSSPropertyBackgroundColor).rgb() : style->backgroundColor().rgb());
705 case CSSPropertyBackgroundImage:
706 if (style->backgroundImage())
707 return style->backgroundImage()->cssValue();
708 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
709 case CSSPropertyBackgroundSize:
710 case CSSPropertyWebkitBackgroundSize: {
711 EFillSizeType size = style->backgroundSizeType();
713 return CSSPrimitiveValue::createIdentifier(CSSValueContain);
715 return CSSPrimitiveValue::createIdentifier(CSSValueCover);
716 RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
717 list->append(CSSPrimitiveValue::create(style->backgroundSizeLength().width()));
718 list->append(CSSPrimitiveValue::create(style->backgroundSizeLength().height()));
719 return list.release();
721 case CSSPropertyBackgroundRepeat:
722 return fillRepeatToCSSValue(style->backgroundRepeatX(), style->backgroundRepeatY());
723 case CSSPropertyWebkitBackgroundComposite:
724 return CSSPrimitiveValue::create(style->backgroundComposite());
725 case CSSPropertyBackgroundAttachment:
726 return CSSPrimitiveValue::create(style->backgroundAttachment());
727 case CSSPropertyBackgroundClip:
728 case CSSPropertyBackgroundOrigin:
729 case CSSPropertyWebkitBackgroundClip:
730 case CSSPropertyWebkitBackgroundOrigin: {
731 EFillBox box = (propertyID == CSSPropertyWebkitBackgroundClip || propertyID == CSSPropertyBackgroundClip) ? style->backgroundClip() : style->backgroundOrigin();
732 return CSSPrimitiveValue::create(box);
734 case CSSPropertyBackgroundPosition: {
735 RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
737 list->append(CSSPrimitiveValue::create(style->backgroundXPosition()));
738 list->append(CSSPrimitiveValue::create(style->backgroundYPosition()));
740 return list.release();
742 case CSSPropertyBackgroundPositionX:
743 return CSSPrimitiveValue::create(style->backgroundXPosition());
744 case CSSPropertyBackgroundPositionY:
745 return CSSPrimitiveValue::create(style->backgroundYPosition());
746 case CSSPropertyBorderCollapse:
747 if (style->borderCollapse())
748 return CSSPrimitiveValue::createIdentifier(CSSValueCollapse);
749 return CSSPrimitiveValue::createIdentifier(CSSValueSeparate);
750 case CSSPropertyBorderSpacing: {
751 RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
752 list->append(CSSPrimitiveValue::create(style->horizontalBorderSpacing(), CSSPrimitiveValue::CSS_PX));
753 list->append(CSSPrimitiveValue::create(style->verticalBorderSpacing(), CSSPrimitiveValue::CSS_PX));
754 return list.release();
756 case CSSPropertyWebkitBorderHorizontalSpacing:
757 return CSSPrimitiveValue::create(style->horizontalBorderSpacing(), CSSPrimitiveValue::CSS_PX);
758 case CSSPropertyWebkitBorderVerticalSpacing:
759 return CSSPrimitiveValue::create(style->verticalBorderSpacing(), CSSPrimitiveValue::CSS_PX);
760 case CSSPropertyBorderTopColor:
761 return m_allowVisitedStyle ? CSSPrimitiveValue::createColor(style->visitedDependentColor(CSSPropertyBorderTopColor).rgb()) : currentColorOrValidColor(style.get(), style->borderTopColor());
762 case CSSPropertyBorderRightColor:
763 return m_allowVisitedStyle ? CSSPrimitiveValue::createColor(style->visitedDependentColor(CSSPropertyBorderRightColor).rgb()) : currentColorOrValidColor(style.get(), style->borderRightColor());
764 case CSSPropertyBorderBottomColor:
765 return m_allowVisitedStyle ? CSSPrimitiveValue::createColor(style->visitedDependentColor(CSSPropertyBorderBottomColor).rgb()) : currentColorOrValidColor(style.get(), style->borderBottomColor());
766 case CSSPropertyBorderLeftColor:
767 return m_allowVisitedStyle ? CSSPrimitiveValue::createColor(style->visitedDependentColor(CSSPropertyBorderLeftColor).rgb()) : currentColorOrValidColor(style.get(), style->borderLeftColor());
768 case CSSPropertyBorderTopStyle:
769 return CSSPrimitiveValue::create(style->borderTopStyle());
770 case CSSPropertyBorderRightStyle:
771 return CSSPrimitiveValue::create(style->borderRightStyle());
772 case CSSPropertyBorderBottomStyle:
773 return CSSPrimitiveValue::create(style->borderBottomStyle());
774 case CSSPropertyBorderLeftStyle:
775 return CSSPrimitiveValue::create(style->borderLeftStyle());
776 case CSSPropertyBorderTopWidth:
777 return CSSPrimitiveValue::create(style->borderTopWidth(), CSSPrimitiveValue::CSS_PX);
778 case CSSPropertyBorderRightWidth:
779 return CSSPrimitiveValue::create(style->borderRightWidth(), CSSPrimitiveValue::CSS_PX);
780 case CSSPropertyBorderBottomWidth:
781 return CSSPrimitiveValue::create(style->borderBottomWidth(), CSSPrimitiveValue::CSS_PX);
782 case CSSPropertyBorderLeftWidth:
783 return CSSPrimitiveValue::create(style->borderLeftWidth(), CSSPrimitiveValue::CSS_PX);
784 case CSSPropertyBottom:
785 return getPositionOffsetValue(style.get(), CSSPropertyBottom);
786 case CSSPropertyWebkitBoxAlign:
787 return CSSPrimitiveValue::create(style->boxAlign());
788 case CSSPropertyWebkitBoxDirection:
789 return CSSPrimitiveValue::create(style->boxDirection());
790 case CSSPropertyWebkitBoxFlex:
791 return CSSPrimitiveValue::create(style->boxFlex(), CSSPrimitiveValue::CSS_NUMBER);
792 case CSSPropertyWebkitBoxFlexGroup:
793 return CSSPrimitiveValue::create(style->boxFlexGroup(), CSSPrimitiveValue::CSS_NUMBER);
794 case CSSPropertyWebkitBoxLines:
795 return CSSPrimitiveValue::create(style->boxLines());
796 case CSSPropertyWebkitBoxOrdinalGroup:
797 return CSSPrimitiveValue::create(style->boxOrdinalGroup(), CSSPrimitiveValue::CSS_NUMBER);
798 case CSSPropertyWebkitBoxOrient:
799 return CSSPrimitiveValue::create(style->boxOrient());
800 case CSSPropertyWebkitBoxPack: {
801 EBoxAlignment boxPack = style->boxPack();
802 ASSERT(boxPack != BSTRETCH);
803 ASSERT(boxPack != BBASELINE);
804 if (boxPack == BJUSTIFY || boxPack== BBASELINE)
806 return CSSPrimitiveValue::create(boxPack);
808 case CSSPropertyWebkitBoxReflect:
809 return valueForReflection(style->boxReflect());
810 case CSSPropertyWebkitBoxShadow:
811 return valueForShadow(style->boxShadow(), propertyID);
812 case CSSPropertyCaptionSide:
813 return CSSPrimitiveValue::create(style->captionSide());
814 case CSSPropertyClear:
815 return CSSPrimitiveValue::create(style->clear());
816 case CSSPropertyColor:
817 return CSSPrimitiveValue::createColor(m_allowVisitedStyle ? style->visitedDependentColor(CSSPropertyColor).rgb() : style->color().rgb());
818 case CSSPropertyWebkitColumnCount:
819 if (style->hasAutoColumnCount())
820 return CSSPrimitiveValue::createIdentifier(CSSValueAuto);
821 return CSSPrimitiveValue::create(style->columnCount(), CSSPrimitiveValue::CSS_NUMBER);
822 case CSSPropertyWebkitColumnGap:
823 if (style->hasNormalColumnGap())
824 return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
825 return CSSPrimitiveValue::create(style->columnGap(), CSSPrimitiveValue::CSS_NUMBER);
826 case CSSPropertyWebkitColumnRuleColor:
827 return m_allowVisitedStyle ? CSSPrimitiveValue::createColor(style->visitedDependentColor(CSSPropertyOutlineColor).rgb()) : currentColorOrValidColor(style.get(), style->columnRuleColor());
828 case CSSPropertyWebkitColumnRuleStyle:
829 return CSSPrimitiveValue::create(style->columnRuleStyle());
830 case CSSPropertyWebkitColumnRuleWidth:
831 return CSSPrimitiveValue::create(style->columnRuleWidth(), CSSPrimitiveValue::CSS_PX);
832 case CSSPropertyWebkitColumnSpan:
833 if (style->columnSpan())
834 return CSSPrimitiveValue::createIdentifier(CSSValueAll);
835 return CSSPrimitiveValue::create(1, CSSPrimitiveValue::CSS_NUMBER);
836 case CSSPropertyWebkitColumnBreakAfter:
837 return CSSPrimitiveValue::create(style->columnBreakAfter());
838 case CSSPropertyWebkitColumnBreakBefore:
839 return CSSPrimitiveValue::create(style->columnBreakBefore());
840 case CSSPropertyWebkitColumnBreakInside:
841 return CSSPrimitiveValue::create(style->columnBreakInside());
842 case CSSPropertyWebkitColumnWidth:
843 if (style->hasAutoColumnWidth())
844 return CSSPrimitiveValue::createIdentifier(CSSValueAuto);
845 return CSSPrimitiveValue::create(style->columnWidth(), CSSPrimitiveValue::CSS_NUMBER);
846 case CSSPropertyCursor: {
847 RefPtr<CSSValueList> list;
848 CursorList* cursors = style->cursors();
849 if (cursors && cursors->size() > 0) {
850 list = CSSValueList::createCommaSeparated();
851 for (unsigned i = 0; i < cursors->size(); ++i)
852 list->append(CSSPrimitiveValue::create((*cursors)[i].image()->url(), CSSPrimitiveValue::CSS_URI));
854 RefPtr<CSSValue> value = CSSPrimitiveValue::create(style->cursor());
857 return list.release();
859 return value.release();
861 case CSSPropertyDirection:
862 return CSSPrimitiveValue::create(style->direction());
863 case CSSPropertyDisplay:
864 return CSSPrimitiveValue::create(style->display());
865 case CSSPropertyEmptyCells:
866 return CSSPrimitiveValue::create(style->emptyCells());
867 case CSSPropertyFloat:
868 #ifdef ANDROID_LAYOUT
869 if (settings && settings->layoutAlgorithm() == Settings::kLayoutSSR)
870 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
872 return CSSPrimitiveValue::create(style->floating());
873 case CSSPropertyFontFamily: {
874 const FontFamily& firstFamily = style->fontDescription().family();
875 if (!firstFamily.next())
876 return valueForFamily(firstFamily.family());
877 RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
878 for (const FontFamily* family = &firstFamily; family; family = family->next())
879 list->append(valueForFamily(family->family()));
880 return list.release();
882 case CSSPropertyFontSize:
883 return CSSPrimitiveValue::create(style->fontDescription().computedPixelSize(), CSSPrimitiveValue::CSS_PX);
884 case CSSPropertyWebkitBinding:
886 case CSSPropertyFontStyle:
887 if (style->fontDescription().italic())
888 return CSSPrimitiveValue::createIdentifier(CSSValueItalic);
889 return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
890 case CSSPropertyFontVariant:
891 if (style->fontDescription().smallCaps())
892 return CSSPrimitiveValue::createIdentifier(CSSValueSmallCaps);
893 return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
894 case CSSPropertyFontWeight:
895 switch (style->fontDescription().weight()) {
897 return CSSPrimitiveValue::createIdentifier(CSSValue100);
899 return CSSPrimitiveValue::createIdentifier(CSSValue200);
901 return CSSPrimitiveValue::createIdentifier(CSSValue300);
902 case FontWeightNormal:
903 return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
905 return CSSPrimitiveValue::createIdentifier(CSSValue500);
907 return CSSPrimitiveValue::createIdentifier(CSSValue600);
909 return CSSPrimitiveValue::createIdentifier(CSSValueBold);
911 return CSSPrimitiveValue::createIdentifier(CSSValue800);
913 return CSSPrimitiveValue::createIdentifier(CSSValue900);
915 ASSERT_NOT_REACHED();
916 return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
917 case CSSPropertyHeight:
919 return CSSPrimitiveValue::create(sizingBox(renderer).height(), CSSPrimitiveValue::CSS_PX);
920 return CSSPrimitiveValue::create(style->height());
921 case CSSPropertyWebkitHighlight:
922 if (style->highlight() == nullAtom)
923 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
924 return CSSPrimitiveValue::create(style->highlight(), CSSPrimitiveValue::CSS_STRING);
925 case CSSPropertyWebkitHyphens:
926 return CSSPrimitiveValue::create(style->hyphens());
927 case CSSPropertyWebkitHyphenateCharacter:
928 if (style->hyphenationString().isNull())
929 return CSSPrimitiveValue::createIdentifier(CSSValueAuto);
930 return CSSPrimitiveValue::create(style->hyphenationString(), CSSPrimitiveValue::CSS_STRING);
931 case CSSPropertyWebkitHyphenateLocale:
932 if (style->hyphenationLocale().isNull())
933 return CSSPrimitiveValue::createIdentifier(CSSValueAuto);
934 return CSSPrimitiveValue::create(style->hyphenationLocale(), CSSPrimitiveValue::CSS_STRING);
935 case CSSPropertyWebkitBorderFit:
936 if (style->borderFit() == BorderFitBorder)
937 return CSSPrimitiveValue::createIdentifier(CSSValueBorder);
938 return CSSPrimitiveValue::createIdentifier(CSSValueLines);
939 case CSSPropertyLeft:
940 return getPositionOffsetValue(style.get(), CSSPropertyLeft);
941 case CSSPropertyLetterSpacing:
942 if (!style->letterSpacing())
943 return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
944 return CSSPrimitiveValue::create(style->letterSpacing(), CSSPrimitiveValue::CSS_PX);
945 case CSSPropertyWebkitLineClamp:
946 if (style->lineClamp().isNone())
947 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
948 return CSSPrimitiveValue::create(style->lineClamp().value(), style->lineClamp().isPercentage() ? CSSPrimitiveValue::CSS_PERCENTAGE : CSSPrimitiveValue::CSS_NUMBER);
949 case CSSPropertyLineHeight: {
950 Length length = style->lineHeight();
951 if (length.isNegative())
952 return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
953 if (length.isPercent())
954 // This is imperfect, because it doesn't include the zoom factor and the real computation
955 // for how high to be in pixels does include things like minimum font size and the zoom factor.
956 // On the other hand, since font-size doesn't include the zoom factor, we really can't do
958 return CSSPrimitiveValue::create(static_cast<int>(length.percent() * style->fontDescription().specifiedSize()) / 100, CSSPrimitiveValue::CSS_PX);
959 return CSSPrimitiveValue::create(length.value(), CSSPrimitiveValue::CSS_PX);
961 case CSSPropertyListStyleImage:
962 if (style->listStyleImage())
963 return style->listStyleImage()->cssValue();
964 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
965 case CSSPropertyListStylePosition:
966 return CSSPrimitiveValue::create(style->listStylePosition());
967 case CSSPropertyListStyleType:
968 return CSSPrimitiveValue::create(style->listStyleType());
969 case CSSPropertyMarginTop:
970 if (renderer && renderer->isBox())
971 // FIXME: Supposed to return the percentage if percentage was specified.
972 return CSSPrimitiveValue::create(toRenderBox(renderer)->marginTop(), CSSPrimitiveValue::CSS_PX);
973 return CSSPrimitiveValue::create(style->marginTop());
974 case CSSPropertyMarginRight:
975 if (renderer && renderer->isBox())
976 // FIXME: Supposed to return the percentage if percentage was specified.
977 return CSSPrimitiveValue::create(toRenderBox(renderer)->marginRight(), CSSPrimitiveValue::CSS_PX);
978 return CSSPrimitiveValue::create(style->marginRight());
979 case CSSPropertyMarginBottom:
980 if (renderer && renderer->isBox())
981 // FIXME: Supposed to return the percentage if percentage was specified.
982 return CSSPrimitiveValue::create(toRenderBox(renderer)->marginBottom(), CSSPrimitiveValue::CSS_PX);
983 return CSSPrimitiveValue::create(style->marginBottom());
984 case CSSPropertyMarginLeft:
985 if (renderer && renderer->isBox())
986 // FIXME: Supposed to return the percentage if percentage was specified.
987 return CSSPrimitiveValue::create(toRenderBox(renderer)->marginLeft(), CSSPrimitiveValue::CSS_PX);
988 return CSSPrimitiveValue::create(style->marginLeft());
989 case CSSPropertyWebkitMarqueeDirection:
990 return CSSPrimitiveValue::create(style->marqueeDirection());
991 case CSSPropertyWebkitMarqueeIncrement:
992 return CSSPrimitiveValue::create(style->marqueeIncrement());
993 case CSSPropertyWebkitMarqueeRepetition:
994 if (style->marqueeLoopCount() < 0)
995 return CSSPrimitiveValue::createIdentifier(CSSValueInfinite);
996 return CSSPrimitiveValue::create(style->marqueeLoopCount(), CSSPrimitiveValue::CSS_NUMBER);
997 case CSSPropertyWebkitMarqueeStyle:
998 return CSSPrimitiveValue::create(style->marqueeBehavior());
999 case CSSPropertyWebkitMaskImage:
1000 if (style->maskImage())
1001 return style->maskImage()->cssValue();
1002 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
1003 case CSSPropertyWebkitMaskSize: {
1004 EFillSizeType size = style->maskSizeType();
1005 if (size == Contain)
1006 return CSSPrimitiveValue::createIdentifier(CSSValueContain);
1008 return CSSPrimitiveValue::createIdentifier(CSSValueCover);
1009 RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
1010 list->append(CSSPrimitiveValue::create(style->maskSizeLength().width()));
1011 list->append(CSSPrimitiveValue::create(style->maskSizeLength().height()));
1012 return list.release();
1014 case CSSPropertyWebkitMaskRepeat:
1015 return fillRepeatToCSSValue(style->maskRepeatX(), style->maskRepeatY());
1016 case CSSPropertyWebkitMaskAttachment:
1017 return CSSPrimitiveValue::create(style->maskAttachment());
1018 case CSSPropertyWebkitMaskComposite:
1019 return CSSPrimitiveValue::create(style->maskComposite());
1020 case CSSPropertyWebkitMaskClip:
1021 case CSSPropertyWebkitMaskOrigin: {
1022 EFillBox box = (propertyID == CSSPropertyWebkitMaskClip ? style->maskClip() : style->maskOrigin());
1023 return CSSPrimitiveValue::create(box);
1025 case CSSPropertyWebkitMaskPosition: {
1026 RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
1028 list->append(CSSPrimitiveValue::create(style->maskXPosition()));
1029 list->append(CSSPrimitiveValue::create(style->maskYPosition()));
1031 return list.release();
1033 case CSSPropertyWebkitMaskPositionX:
1034 return CSSPrimitiveValue::create(style->maskXPosition());
1035 case CSSPropertyWebkitMaskPositionY:
1036 return CSSPrimitiveValue::create(style->maskYPosition());
1037 case CSSPropertyWebkitUserModify:
1038 return CSSPrimitiveValue::create(style->userModify());
1039 case CSSPropertyMaxHeight: {
1040 const Length& maxHeight = style->maxHeight();
1041 if (maxHeight.isFixed() && maxHeight.value() == undefinedLength)
1042 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
1043 return CSSPrimitiveValue::create(maxHeight);
1045 case CSSPropertyMaxWidth: {
1046 const Length& maxWidth = style->maxWidth();
1047 if (maxWidth.isFixed() && maxWidth.value() == undefinedLength)
1048 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
1049 return CSSPrimitiveValue::create(maxWidth);
1051 case CSSPropertyMinHeight:
1052 return CSSPrimitiveValue::create(style->minHeight());
1053 case CSSPropertyMinWidth:
1054 return CSSPrimitiveValue::create(style->minWidth());
1055 case CSSPropertyOpacity:
1056 return CSSPrimitiveValue::create(style->opacity(), CSSPrimitiveValue::CSS_NUMBER);
1057 case CSSPropertyOrphans:
1058 return CSSPrimitiveValue::create(style->orphans(), CSSPrimitiveValue::CSS_NUMBER);
1059 case CSSPropertyOutlineColor:
1060 return m_allowVisitedStyle ? CSSPrimitiveValue::createColor(style->visitedDependentColor(CSSPropertyOutlineColor).rgb()) : currentColorOrValidColor(style.get(), style->outlineColor());
1061 case CSSPropertyOutlineStyle:
1062 if (style->outlineStyleIsAuto())
1063 return CSSPrimitiveValue::createIdentifier(CSSValueAuto);
1064 return CSSPrimitiveValue::create(style->outlineStyle());
1065 case CSSPropertyOutlineWidth:
1066 return CSSPrimitiveValue::create(style->outlineWidth(), CSSPrimitiveValue::CSS_PX);
1067 case CSSPropertyOverflow:
1068 return CSSPrimitiveValue::create(max(style->overflowX(), style->overflowY()));
1069 case CSSPropertyOverflowX:
1070 return CSSPrimitiveValue::create(style->overflowX());
1071 case CSSPropertyOverflowY:
1072 #ifdef ANDROID_LAYOUT
1073 if (settings && settings->layoutAlgorithm() == Settings::kLayoutSSR)
1074 return CSSPrimitiveValue::createIdentifier(CSSValueVisible);
1076 return CSSPrimitiveValue::create(style->overflowY());
1077 case CSSPropertyPaddingTop:
1078 if (renderer && renderer->isBox())
1079 return CSSPrimitiveValue::create(toRenderBox(renderer)->paddingTop(false), CSSPrimitiveValue::CSS_PX);
1080 return CSSPrimitiveValue::create(style->paddingTop());
1081 case CSSPropertyPaddingRight:
1082 if (renderer && renderer->isBox())
1083 return CSSPrimitiveValue::create(toRenderBox(renderer)->paddingRight(false), CSSPrimitiveValue::CSS_PX);
1084 return CSSPrimitiveValue::create(style->paddingRight());
1085 case CSSPropertyPaddingBottom:
1086 if (renderer && renderer->isBox())
1087 return CSSPrimitiveValue::create(toRenderBox(renderer)->paddingBottom(false), CSSPrimitiveValue::CSS_PX);
1088 return CSSPrimitiveValue::create(style->paddingBottom());
1089 case CSSPropertyPaddingLeft:
1090 if (renderer && renderer->isBox())
1091 return CSSPrimitiveValue::create(toRenderBox(renderer)->paddingLeft(false), CSSPrimitiveValue::CSS_PX);
1092 return CSSPrimitiveValue::create(style->paddingLeft());
1093 case CSSPropertyPageBreakAfter:
1094 return CSSPrimitiveValue::create(style->pageBreakAfter());
1095 case CSSPropertyPageBreakBefore:
1096 return CSSPrimitiveValue::create(style->pageBreakBefore());
1097 case CSSPropertyPageBreakInside: {
1098 EPageBreak pageBreak = style->pageBreakInside();
1099 ASSERT(pageBreak != PBALWAYS);
1100 if (pageBreak == PBALWAYS)
1102 return CSSPrimitiveValue::create(style->pageBreakInside());
1104 case CSSPropertyPosition:
1105 #ifdef ANDROID_LAYOUT
1106 if (settings && settings->layoutAlgorithm() == Settings::kLayoutSSR)
1107 return CSSPrimitiveValue::createIdentifier(CSSValueStatic);
1109 return CSSPrimitiveValue::create(style->position());
1110 case CSSPropertyRight:
1111 return getPositionOffsetValue(style.get(), CSSPropertyRight);
1112 case CSSPropertyTableLayout:
1113 return CSSPrimitiveValue::create(style->tableLayout());
1114 case CSSPropertyTextAlign:
1115 return CSSPrimitiveValue::create(style->textAlign());
1116 case CSSPropertyTextDecoration:
1117 return renderTextDecorationFlagsToCSSValue(style->textDecoration());
1118 case CSSPropertyWebkitTextDecorationsInEffect:
1119 return renderTextDecorationFlagsToCSSValue(style->textDecorationsInEffect());
1120 case CSSPropertyWebkitTextFillColor:
1121 return currentColorOrValidColor(style.get(), style->textFillColor());
1122 case CSSPropertyTextIndent:
1123 return CSSPrimitiveValue::create(style->textIndent());
1124 case CSSPropertyTextShadow:
1125 return valueForShadow(style->textShadow(), propertyID);
1126 case CSSPropertyTextRendering:
1127 return CSSPrimitiveValue::create(style->fontDescription().textRenderingMode());
1128 case CSSPropertyTextOverflow:
1129 if (style->textOverflow())
1130 return CSSPrimitiveValue::createIdentifier(CSSValueEllipsis);
1131 return CSSPrimitiveValue::createIdentifier(CSSValueClip);
1132 case CSSPropertyWebkitTextSecurity:
1133 return CSSPrimitiveValue::create(style->textSecurity());
1134 case CSSPropertyWebkitTextSizeAdjust:
1135 if (style->textSizeAdjust())
1136 return CSSPrimitiveValue::createIdentifier(CSSValueAuto);
1137 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
1138 case CSSPropertyWebkitTextStrokeColor:
1139 return currentColorOrValidColor(style.get(), style->textStrokeColor());
1140 case CSSPropertyWebkitTextStrokeWidth:
1141 return CSSPrimitiveValue::create(style->textStrokeWidth(), CSSPrimitiveValue::CSS_PX);
1142 case CSSPropertyTextTransform:
1143 return CSSPrimitiveValue::create(style->textTransform());
1144 case CSSPropertyTop:
1145 return getPositionOffsetValue(style.get(), CSSPropertyTop);
1146 case CSSPropertyUnicodeBidi:
1147 return CSSPrimitiveValue::create(style->unicodeBidi());
1148 case CSSPropertyVerticalAlign:
1149 switch (style->verticalAlign()) {
1151 return CSSPrimitiveValue::createIdentifier(CSSValueBaseline);
1153 return CSSPrimitiveValue::createIdentifier(CSSValueMiddle);
1155 return CSSPrimitiveValue::createIdentifier(CSSValueSub);
1157 return CSSPrimitiveValue::createIdentifier(CSSValueSuper);
1159 return CSSPrimitiveValue::createIdentifier(CSSValueTextTop);
1161 return CSSPrimitiveValue::createIdentifier(CSSValueTextBottom);
1163 return CSSPrimitiveValue::createIdentifier(CSSValueTop);
1165 return CSSPrimitiveValue::createIdentifier(CSSValueBottom);
1166 case BASELINE_MIDDLE:
1167 return CSSPrimitiveValue::createIdentifier(CSSValueWebkitBaselineMiddle);
1169 return CSSPrimitiveValue::create(style->verticalAlignLength());
1171 ASSERT_NOT_REACHED();
1173 case CSSPropertyVisibility:
1174 #ifdef ANDROID_LAYOUT
1175 if (settings && settings->layoutAlgorithm() == Settings::kLayoutSSR)
1176 return CSSPrimitiveValue::createIdentifier(CSSValueVisible);
1178 return CSSPrimitiveValue::create(style->visibility());
1179 case CSSPropertyWhiteSpace:
1180 #ifdef ANDROID_LAYOUT
1181 if (settings && settings->layoutAlgorithm() == Settings::kLayoutSSR)
1182 switch (style->whiteSpace()) {
1186 return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
1189 return CSSPrimitiveValue::createIdentifier(CSSValuePreWrap);
1191 return CSSPrimitiveValue::createIdentifier(CSSValuePreLine);
1195 return CSSPrimitiveValue::create(style->whiteSpace());
1196 case CSSPropertyWidows:
1197 return CSSPrimitiveValue::create(style->widows(), CSSPrimitiveValue::CSS_NUMBER);
1198 case CSSPropertyWidth:
1200 return CSSPrimitiveValue::create(sizingBox(renderer).width(), CSSPrimitiveValue::CSS_PX);
1201 return CSSPrimitiveValue::create(style->width());
1202 case CSSPropertyWordBreak:
1203 return CSSPrimitiveValue::create(style->wordBreak());
1204 case CSSPropertyWordSpacing:
1205 return CSSPrimitiveValue::create(style->wordSpacing(), CSSPrimitiveValue::CSS_PX);
1206 case CSSPropertyWordWrap:
1207 return CSSPrimitiveValue::create(style->wordWrap());
1208 case CSSPropertyWebkitLineBreak:
1209 return CSSPrimitiveValue::create(style->khtmlLineBreak());
1210 case CSSPropertyWebkitNbspMode:
1211 return CSSPrimitiveValue::create(style->nbspMode());
1212 case CSSPropertyWebkitMatchNearestMailBlockquoteColor:
1213 return CSSPrimitiveValue::create(style->matchNearestMailBlockquoteColor());
1214 case CSSPropertyResize:
1215 return CSSPrimitiveValue::create(style->resize());
1216 case CSSPropertyWebkitFontSmoothing:
1217 return CSSPrimitiveValue::create(style->fontDescription().fontSmoothing());
1218 case CSSPropertyZIndex:
1219 if (style->hasAutoZIndex())
1220 return CSSPrimitiveValue::createIdentifier(CSSValueAuto);
1221 return CSSPrimitiveValue::create(style->zIndex(), CSSPrimitiveValue::CSS_NUMBER);
1222 case CSSPropertyZoom:
1223 return CSSPrimitiveValue::create(style->zoom(), CSSPrimitiveValue::CSS_NUMBER);
1224 case CSSPropertyWebkitBoxSizing:
1225 if (style->boxSizing() == CONTENT_BOX)
1226 return CSSPrimitiveValue::createIdentifier(CSSValueContentBox);
1227 return CSSPrimitiveValue::createIdentifier(CSSValueBorderBox);
1228 #if ENABLE(DASHBOARD_SUPPORT)
1229 case CSSPropertyWebkitDashboardRegion:
1231 const Vector<StyleDashboardRegion>& regions = style->dashboardRegions();
1232 unsigned count = regions.size();
1233 if (count == 1 && regions[0].type == StyleDashboardRegion::None)
1234 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
1236 RefPtr<DashboardRegion> firstRegion;
1237 DashboardRegion* previousRegion = 0;
1238 for (unsigned i = 0; i < count; i++) {
1239 RefPtr<DashboardRegion> region = DashboardRegion::create();
1240 StyleDashboardRegion styleRegion = regions[i];
1242 region->m_label = styleRegion.label;
1243 LengthBox offset = styleRegion.offset;
1244 region->setTop(CSSPrimitiveValue::create(offset.top().value(), CSSPrimitiveValue::CSS_PX));
1245 region->setRight(CSSPrimitiveValue::create(offset.right().value(), CSSPrimitiveValue::CSS_PX));
1246 region->setBottom(CSSPrimitiveValue::create(offset.bottom().value(), CSSPrimitiveValue::CSS_PX));
1247 region->setLeft(CSSPrimitiveValue::create(offset.left().value(), CSSPrimitiveValue::CSS_PX));
1248 region->m_isRectangle = (styleRegion.type == StyleDashboardRegion::Rectangle);
1249 region->m_isCircle = (styleRegion.type == StyleDashboardRegion::Circle);
1252 previousRegion->m_next = region;
1254 firstRegion = region;
1255 previousRegion = region.get();
1257 return CSSPrimitiveValue::create(firstRegion.release());
1260 case CSSPropertyWebkitAnimationDelay:
1261 return getDelayValue(style->animations());
1262 case CSSPropertyWebkitAnimationDirection: {
1263 RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
1264 const AnimationList* t = style->animations();
1266 for (size_t i = 0; i < t->size(); ++i) {
1267 if (t->animation(i)->direction())
1268 list->append(CSSPrimitiveValue::createIdentifier(CSSValueAlternate));
1270 list->append(CSSPrimitiveValue::createIdentifier(CSSValueNormal));
1273 list->append(CSSPrimitiveValue::createIdentifier(CSSValueNormal));
1274 return list.release();
1276 case CSSPropertyWebkitAnimationDuration:
1277 return getDurationValue(style->animations());
1278 case CSSPropertyWebkitAnimationFillMode: {
1279 RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
1280 const AnimationList* t = style->animations();
1282 for (size_t i = 0; i < t->size(); ++i) {
1283 switch (t->animation(i)->fillMode()) {
1284 case AnimationFillModeNone:
1285 list->append(CSSPrimitiveValue::createIdentifier(CSSValueNone));
1287 case AnimationFillModeForwards:
1288 list->append(CSSPrimitiveValue::createIdentifier(CSSValueForwards));
1290 case AnimationFillModeBackwards:
1291 list->append(CSSPrimitiveValue::createIdentifier(CSSValueBackwards));
1293 case AnimationFillModeBoth:
1294 list->append(CSSPrimitiveValue::createIdentifier(CSSValueBoth));
1299 list->append(CSSPrimitiveValue::createIdentifier(CSSValueNone));
1300 return list.release();
1302 case CSSPropertyWebkitAnimationIterationCount: {
1303 RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
1304 const AnimationList* t = style->animations();
1306 for (size_t i = 0; i < t->size(); ++i) {
1307 int iterationCount = t->animation(i)->iterationCount();
1308 if (iterationCount == Animation::IterationCountInfinite)
1309 list->append(CSSPrimitiveValue::createIdentifier(CSSValueInfinite));
1311 list->append(CSSPrimitiveValue::create(iterationCount, CSSPrimitiveValue::CSS_NUMBER));
1314 list->append(CSSPrimitiveValue::create(Animation::initialAnimationIterationCount(), CSSPrimitiveValue::CSS_NUMBER));
1315 return list.release();
1317 case CSSPropertyWebkitAnimationName: {
1318 RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
1319 const AnimationList* t = style->animations();
1321 for (size_t i = 0; i < t->size(); ++i) {
1322 list->append(CSSPrimitiveValue::create(t->animation(i)->name(), CSSPrimitiveValue::CSS_STRING));
1325 list->append(CSSPrimitiveValue::createIdentifier(CSSValueNone));
1326 return list.release();
1328 case CSSPropertyWebkitAnimationPlayState: {
1329 RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
1330 const AnimationList* t = style->animations();
1332 for (size_t i = 0; i < t->size(); ++i) {
1333 int prop = t->animation(i)->playState();
1334 if (prop == AnimPlayStatePlaying)
1335 list->append(CSSPrimitiveValue::createIdentifier(CSSValueRunning));
1337 list->append(CSSPrimitiveValue::createIdentifier(CSSValuePaused));
1340 list->append(CSSPrimitiveValue::createIdentifier(CSSValueRunning));
1341 return list.release();
1343 case CSSPropertyWebkitAnimationTimingFunction:
1344 return getTimingFunctionValue(style->animations());
1345 case CSSPropertyWebkitAppearance:
1346 return CSSPrimitiveValue::create(style->appearance());
1347 case CSSPropertyWebkitBackfaceVisibility:
1348 return CSSPrimitiveValue::createIdentifier((style->backfaceVisibility() == BackfaceVisibilityHidden) ? CSSValueHidden : CSSValueVisible);
1349 case CSSPropertyWebkitBorderImage:
1350 return valueForNinePieceImage(style->borderImage());
1351 case CSSPropertyWebkitMaskBoxImage:
1352 return valueForNinePieceImage(style->maskBoxImage());
1353 case CSSPropertyWebkitFontSizeDelta:
1354 // Not a real style property -- used by the editing engine -- so has no computed value.
1356 case CSSPropertyWebkitMarginBottomCollapse:
1357 return CSSPrimitiveValue::create(style->marginBottomCollapse());
1358 case CSSPropertyWebkitMarginTopCollapse:
1359 return CSSPrimitiveValue::create(style->marginTopCollapse());
1360 case CSSPropertyWebkitPerspective:
1361 if (!style->hasPerspective())
1362 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
1363 return CSSPrimitiveValue::create(style->perspective(), CSSPrimitiveValue::CSS_NUMBER);
1364 case CSSPropertyWebkitPerspectiveOrigin: {
1365 RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
1367 IntRect box = sizingBox(renderer);
1368 list->append(CSSPrimitiveValue::create(style->perspectiveOriginX().calcMinValue(box.width()), CSSPrimitiveValue::CSS_PX));
1369 list->append(CSSPrimitiveValue::create(style->perspectiveOriginY().calcMinValue(box.height()), CSSPrimitiveValue::CSS_PX));
1372 list->append(CSSPrimitiveValue::create(style->perspectiveOriginX()));
1373 list->append(CSSPrimitiveValue::create(style->perspectiveOriginY()));
1375 return list.release();
1377 case CSSPropertyWebkitRtlOrdering:
1378 if (style->visuallyOrdered())
1379 return CSSPrimitiveValue::createIdentifier(CSSValueVisual);
1380 return CSSPrimitiveValue::createIdentifier(CSSValueLogical);
1381 case CSSPropertyWebkitUserDrag:
1382 return CSSPrimitiveValue::create(style->userDrag());
1383 case CSSPropertyWebkitUserSelect:
1384 return CSSPrimitiveValue::create(style->userSelect());
1385 case CSSPropertyBorderBottomLeftRadius:
1386 return getBorderRadiusCornerValue(style->borderBottomLeftRadius());
1387 case CSSPropertyBorderBottomRightRadius:
1388 return getBorderRadiusCornerValue(style->borderBottomRightRadius());
1389 case CSSPropertyBorderTopLeftRadius:
1390 return getBorderRadiusCornerValue(style->borderTopLeftRadius());
1391 case CSSPropertyBorderTopRightRadius:
1392 return getBorderRadiusCornerValue(style->borderTopRightRadius());
1393 case CSSPropertyClip: {
1394 if (!style->hasClip())
1395 return CSSPrimitiveValue::createIdentifier(CSSValueAuto);
1396 RefPtr<Rect> rect = Rect::create();
1397 rect->setTop(CSSPrimitiveValue::create(style->clip().top().value(), CSSPrimitiveValue::CSS_PX));
1398 rect->setRight(CSSPrimitiveValue::create(style->clip().right().value(), CSSPrimitiveValue::CSS_PX));
1399 rect->setBottom(CSSPrimitiveValue::create(style->clip().bottom().value(), CSSPrimitiveValue::CSS_PX));
1400 rect->setLeft(CSSPrimitiveValue::create(style->clip().left().value(), CSSPrimitiveValue::CSS_PX));
1401 return CSSPrimitiveValue::create(rect.release());
1403 case CSSPropertyWebkitTransform:
1404 return computedTransform(renderer, style.get());
1405 case CSSPropertyWebkitTransformOrigin: {
1406 RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
1408 IntRect box = sizingBox(renderer);
1409 list->append(CSSPrimitiveValue::create(style->transformOriginX().calcMinValue(box.width()), CSSPrimitiveValue::CSS_PX));
1410 list->append(CSSPrimitiveValue::create(style->transformOriginY().calcMinValue(box.height()), CSSPrimitiveValue::CSS_PX));
1411 if (style->transformOriginZ() != 0)
1412 list->append(CSSPrimitiveValue::create(style->transformOriginZ(), CSSPrimitiveValue::CSS_PX));
1414 list->append(CSSPrimitiveValue::create(style->transformOriginX()));
1415 list->append(CSSPrimitiveValue::create(style->transformOriginY()));
1416 if (style->transformOriginZ() != 0)
1417 list->append(CSSPrimitiveValue::create(style->transformOriginZ(), CSSPrimitiveValue::CSS_PX));
1419 return list.release();
1421 case CSSPropertyWebkitTransformStyle:
1422 return CSSPrimitiveValue::createIdentifier((style->transformStyle3D() == TransformStyle3DPreserve3D) ? CSSValuePreserve3d : CSSValueFlat);
1423 case CSSPropertyWebkitTransitionDelay:
1424 return getDelayValue(style->transitions());
1425 case CSSPropertyWebkitTransitionDuration:
1426 return getDurationValue(style->transitions());
1427 case CSSPropertyWebkitTransitionProperty: {
1428 RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
1429 const AnimationList* t = style->transitions();
1431 for (size_t i = 0; i < t->size(); ++i) {
1432 int prop = t->animation(i)->property();
1433 RefPtr<CSSValue> propertyValue;
1434 if (prop == cAnimateNone)
1435 propertyValue = CSSPrimitiveValue::createIdentifier(CSSValueNone);
1436 else if (prop == cAnimateAll)
1437 propertyValue = CSSPrimitiveValue::createIdentifier(CSSValueAll);
1439 propertyValue = CSSPrimitiveValue::create(getPropertyName(static_cast<CSSPropertyID>(prop)), CSSPrimitiveValue::CSS_STRING);
1440 list->append(propertyValue);
1443 list->append(CSSPrimitiveValue::createIdentifier(CSSValueAll));
1444 return list.release();
1446 case CSSPropertyWebkitTransitionTimingFunction:
1447 return getTimingFunctionValue(style->transitions());
1448 case CSSPropertyPointerEvents:
1449 return CSSPrimitiveValue::create(style->pointerEvents());
1450 case CSSPropertyWebkitColorCorrection:
1451 return CSSPrimitiveValue::create(style->colorSpace());
1453 /* Shorthand properties, currently not supported see bug 13658*/
1454 case CSSPropertyBackground:
1455 case CSSPropertyBorder:
1456 case CSSPropertyBorderBottom:
1457 case CSSPropertyBorderColor:
1458 case CSSPropertyBorderLeft:
1459 case CSSPropertyBorderRadius:
1460 case CSSPropertyBorderRight:
1461 case CSSPropertyBorderStyle:
1462 case CSSPropertyBorderTop:
1463 case CSSPropertyBorderWidth:
1464 case CSSPropertyFont:
1465 case CSSPropertyListStyle:
1466 case CSSPropertyMargin:
1467 case CSSPropertyPadding:
1470 /* Unimplemented CSS 3 properties (including CSS3 shorthand properties) */
1471 case CSSPropertyTextLineThrough:
1472 case CSSPropertyTextLineThroughColor:
1473 case CSSPropertyTextLineThroughMode:
1474 case CSSPropertyTextLineThroughStyle:
1475 case CSSPropertyTextLineThroughWidth:
1476 case CSSPropertyTextOverline:
1477 case CSSPropertyTextOverlineColor:
1478 case CSSPropertyTextOverlineMode:
1479 case CSSPropertyTextOverlineStyle:
1480 case CSSPropertyTextOverlineWidth:
1481 case CSSPropertyTextUnderline:
1482 case CSSPropertyTextUnderlineColor:
1483 case CSSPropertyTextUnderlineMode:
1484 case CSSPropertyTextUnderlineStyle:
1485 case CSSPropertyTextUnderlineWidth:
1488 /* Directional properties are resolved by resolveDirectionAwareProperty() before the switch. */
1489 case CSSPropertyWebkitBorderEnd:
1490 case CSSPropertyWebkitBorderEndColor:
1491 case CSSPropertyWebkitBorderEndStyle:
1492 case CSSPropertyWebkitBorderEndWidth:
1493 case CSSPropertyWebkitBorderStart:
1494 case CSSPropertyWebkitBorderStartColor:
1495 case CSSPropertyWebkitBorderStartStyle:
1496 case CSSPropertyWebkitBorderStartWidth:
1497 case CSSPropertyWebkitMarginEnd:
1498 case CSSPropertyWebkitMarginStart:
1499 case CSSPropertyWebkitPaddingEnd:
1500 case CSSPropertyWebkitPaddingStart:
1501 ASSERT_NOT_REACHED();
1504 /* Unimplemented @font-face properties */
1505 case CSSPropertyFontStretch:
1506 case CSSPropertySrc:
1507 case CSSPropertyUnicodeRange:
1510 /* Other unimplemented properties */
1511 case CSSPropertyBackgroundRepeatX:
1512 case CSSPropertyBackgroundRepeatY:
1513 case CSSPropertyContent: // FIXME: needs implementation, bug 23668
1514 case CSSPropertyCounterIncrement:
1515 case CSSPropertyCounterReset:
1516 case CSSPropertyOutline: // FIXME: needs implementation
1517 case CSSPropertyOutlineOffset: // FIXME: needs implementation
1518 case CSSPropertyPage: // for @page
1519 case CSSPropertyQuotes: // FIXME: needs implementation
1520 case CSSPropertySize: // for @page
1523 /* Unimplemented -webkit- properties */
1524 case CSSPropertyWebkitAnimation:
1525 case CSSPropertyWebkitBorderRadius:
1526 case CSSPropertyWebkitColumns:
1527 case CSSPropertyWebkitColumnRule:
1528 case CSSPropertyWebkitMarginCollapse:
1529 case CSSPropertyWebkitMarquee:
1530 case CSSPropertyWebkitMarqueeSpeed:
1531 case CSSPropertyWebkitMask:
1532 case CSSPropertyWebkitMaskRepeatX:
1533 case CSSPropertyWebkitMaskRepeatY:
1534 case CSSPropertyWebkitPerspectiveOriginX:
1535 case CSSPropertyWebkitPerspectiveOriginY:
1536 case CSSPropertyWebkitTextStroke:
1537 case CSSPropertyWebkitTransformOriginX:
1538 case CSSPropertyWebkitTransformOriginY:
1539 case CSSPropertyWebkitTransformOriginZ:
1540 case CSSPropertyWebkitTransition:
1541 case CSSPropertyWebkitVariableDeclarationBlock:
1543 #ifdef ANDROID_CSS_TAP_HIGHLIGHT_COLOR
1544 case CSSPropertyWebkitTapHighlightColor:
1545 return CSSPrimitiveValue::createColor(style->tapHighlightColor().rgb());
1548 // FIXME: This default case ruins the point of using an enum for
1549 // properties -- it prevents us from getting a warning when we
1550 // forget to list a property above.
1552 return getSVGPropertyCSSValue(propertyID, DoNotUpdateLayout);
1556 logUnimplementedPropertyID(propertyID);
1560 String CSSComputedStyleDeclaration::getPropertyValue(int propertyID) const
1562 RefPtr<CSSValue> value = getPropertyCSSValue(propertyID);
1564 return value->cssText();
1568 bool CSSComputedStyleDeclaration::getPropertyPriority(int /*propertyID*/) const
1570 // All computed styles have a priority of false (not "important").
1574 String CSSComputedStyleDeclaration::removeProperty(int /*propertyID*/, ExceptionCode& ec)
1576 ec = NO_MODIFICATION_ALLOWED_ERR;
1580 void CSSComputedStyleDeclaration::setProperty(int /*propertyID*/, const String& /*value*/, bool /*important*/, ExceptionCode& ec)
1582 ec = NO_MODIFICATION_ALLOWED_ERR;
1585 unsigned CSSComputedStyleDeclaration::virtualLength() const
1587 Node* node = m_node.get();
1591 RenderStyle* style = node->computedStyle(m_pseudoElementSpecifier);
1595 return numComputedProperties;
1598 String CSSComputedStyleDeclaration::item(unsigned i) const
1603 return getPropertyName(static_cast<CSSPropertyID>(computedProperties[i]));
1606 bool CSSComputedStyleDeclaration::cssPropertyMatches(const CSSProperty* property) const
1608 if (property->id() == CSSPropertyFontSize && property->value()->isPrimitiveValue() && m_node) {
1609 m_node->document()->updateLayoutIgnorePendingStylesheets();
1610 RenderStyle* style = m_node->computedStyle(m_pseudoElementSpecifier);
1611 if (style && style->fontDescription().keywordSize()) {
1612 int sizeValue = cssIdentifierForFontSizeKeyword(style->fontDescription().keywordSize());
1613 CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(property->value());
1614 if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_IDENT && primitiveValue->getIdent() == sizeValue)
1619 return CSSStyleDeclaration::cssPropertyMatches(property);
1622 PassRefPtr<CSSMutableStyleDeclaration> CSSComputedStyleDeclaration::copy() const
1624 return copyPropertiesInSet(computedProperties, numComputedProperties);
1627 PassRefPtr<CSSMutableStyleDeclaration> CSSComputedStyleDeclaration::makeMutable()
1632 } // namespace WebCore