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 "CSSPropertyNames.h"
32 #include "CSSReflectValue.h"
33 #include "CSSTimingFunctionValue.h"
34 #include "CSSValueList.h"
35 #include "CachedImage.h"
37 #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 CSSPropertyBackgroundColor,
59 CSSPropertyBackgroundImage,
60 CSSPropertyBackgroundPosition, // more-specific background-position-x/y are non-standard
61 CSSPropertyBackgroundRepeat,
62 CSSPropertyBorderBottomColor,
63 CSSPropertyBorderBottomStyle,
64 CSSPropertyBorderBottomWidth,
65 CSSPropertyBorderCollapse,
66 CSSPropertyBorderLeftColor,
67 CSSPropertyBorderLeftStyle,
68 CSSPropertyBorderLeftWidth,
69 CSSPropertyBorderRightColor,
70 CSSPropertyBorderRightStyle,
71 CSSPropertyBorderRightWidth,
72 CSSPropertyBorderTopColor,
73 CSSPropertyBorderTopStyle,
74 CSSPropertyBorderTopWidth,
76 CSSPropertyCaptionSide,
83 CSSPropertyEmptyCells,
85 CSSPropertyFontFamily,
88 CSSPropertyFontVariant,
89 CSSPropertyFontWeight,
92 CSSPropertyLetterSpacing,
93 CSSPropertyLineHeight,
94 CSSPropertyListStyleImage,
95 CSSPropertyListStylePosition,
96 CSSPropertyListStyleType,
97 CSSPropertyMarginBottom,
98 CSSPropertyMarginLeft,
99 CSSPropertyMarginRight,
100 CSSPropertyMarginTop,
101 CSSPropertyMaxHeight,
103 CSSPropertyMinHeight,
107 CSSPropertyOutlineColor,
108 CSSPropertyOutlineStyle,
109 CSSPropertyOutlineWidth,
110 CSSPropertyOverflowX,
111 CSSPropertyOverflowY,
112 CSSPropertyPaddingBottom,
113 CSSPropertyPaddingLeft,
114 CSSPropertyPaddingRight,
115 CSSPropertyPaddingTop,
116 CSSPropertyPageBreakAfter,
117 CSSPropertyPageBreakBefore,
118 CSSPropertyPageBreakInside,
119 CSSPropertyPointerEvents,
123 CSSPropertyTableLayout,
124 CSSPropertyTextAlign,
125 CSSPropertyTextDecoration,
126 CSSPropertyTextIndent,
127 CSSPropertyTextShadow,
128 CSSPropertyTextTransform,
130 CSSPropertyUnicodeBidi,
131 CSSPropertyVerticalAlign,
132 CSSPropertyVisibility,
133 CSSPropertyWhiteSpace,
136 CSSPropertyWordBreak,
137 CSSPropertyWordSpacing,
142 CSSPropertyWebkitAnimationDelay,
143 CSSPropertyWebkitAnimationDirection,
144 CSSPropertyWebkitAnimationDuration,
145 CSSPropertyWebkitAnimationIterationCount,
146 CSSPropertyWebkitAnimationName,
147 CSSPropertyWebkitAnimationTimingFunction,
148 CSSPropertyWebkitAppearance,
149 CSSPropertyWebkitBackfaceVisibility,
150 CSSPropertyWebkitBackgroundClip,
151 CSSPropertyWebkitBackgroundComposite,
152 CSSPropertyWebkitBackgroundOrigin,
153 CSSPropertyWebkitBackgroundSize,
154 CSSPropertyWebkitBorderBottomLeftRadius,
155 CSSPropertyWebkitBorderBottomRightRadius,
156 CSSPropertyWebkitBorderFit,
157 CSSPropertyWebkitBorderHorizontalSpacing,
158 CSSPropertyWebkitBorderImage,
159 CSSPropertyWebkitBorderTopLeftRadius,
160 CSSPropertyWebkitBorderTopRightRadius,
161 CSSPropertyWebkitBorderVerticalSpacing,
162 CSSPropertyWebkitBoxAlign,
163 CSSPropertyWebkitBoxDirection,
164 CSSPropertyWebkitBoxFlex,
165 CSSPropertyWebkitBoxFlexGroup,
166 CSSPropertyWebkitBoxLines,
167 CSSPropertyWebkitBoxOrdinalGroup,
168 CSSPropertyWebkitBoxOrient,
169 CSSPropertyWebkitBoxPack,
170 CSSPropertyWebkitBoxReflect,
171 CSSPropertyWebkitBoxShadow,
172 CSSPropertyWebkitBoxSizing,
173 CSSPropertyWebkitColumnBreakAfter,
174 CSSPropertyWebkitColumnBreakBefore,
175 CSSPropertyWebkitColumnBreakInside,
176 CSSPropertyWebkitColumnCount,
177 CSSPropertyWebkitColumnGap,
178 CSSPropertyWebkitColumnRuleColor,
179 CSSPropertyWebkitColumnRuleStyle,
180 CSSPropertyWebkitColumnRuleWidth,
181 CSSPropertyWebkitColumnWidth,
182 #if ENABLE(DASHBOARD_SUPPORT)
183 CSSPropertyWebkitDashboardRegion,
185 CSSPropertyWebkitHighlight,
186 CSSPropertyWebkitLineBreak,
187 CSSPropertyWebkitLineClamp,
188 CSSPropertyWebkitMarginBottomCollapse,
189 CSSPropertyWebkitMarginTopCollapse,
190 CSSPropertyWebkitMarqueeDirection,
191 CSSPropertyWebkitMarqueeIncrement,
192 CSSPropertyWebkitMarqueeRepetition,
193 CSSPropertyWebkitMarqueeStyle,
194 CSSPropertyWebkitMaskAttachment,
195 CSSPropertyWebkitMaskBoxImage,
196 CSSPropertyWebkitMaskClip,
197 CSSPropertyWebkitMaskComposite,
198 CSSPropertyWebkitMaskImage,
199 CSSPropertyWebkitMaskOrigin,
200 CSSPropertyWebkitMaskPosition,
201 CSSPropertyWebkitMaskRepeat,
202 CSSPropertyWebkitMaskSize,
203 CSSPropertyWebkitNbspMode,
204 CSSPropertyWebkitPerspective,
205 CSSPropertyWebkitPerspectiveOrigin,
206 CSSPropertyWebkitRtlOrdering,
207 CSSPropertyWebkitTextDecorationsInEffect,
208 CSSPropertyWebkitTextFillColor,
209 CSSPropertyWebkitTextSecurity,
210 CSSPropertyWebkitTextStrokeColor,
211 CSSPropertyWebkitTextStrokeWidth,
212 CSSPropertyWebkitTransform,
213 CSSPropertyWebkitTransformOrigin,
214 CSSPropertyWebkitTransformStyle,
215 CSSPropertyWebkitTransitionDelay,
216 CSSPropertyWebkitTransitionDuration,
217 CSSPropertyWebkitTransitionProperty,
218 CSSPropertyWebkitTransitionTimingFunction,
219 CSSPropertyWebkitUserDrag,
220 CSSPropertyWebkitUserModify,
221 CSSPropertyWebkitUserSelect
229 CSSPropertyFloodColor,
230 CSSPropertyFloodOpacity,
231 CSSPropertyLightingColor,
232 CSSPropertyStopColor,
233 CSSPropertyStopOpacity,
234 CSSPropertyColorInterpolation,
235 CSSPropertyColorInterpolationFilters,
236 CSSPropertyColorRendering,
238 CSSPropertyFillOpacity,
240 CSSPropertyImageRendering,
241 CSSPropertyMarkerEnd,
242 CSSPropertyMarkerMid,
243 CSSPropertyMarkerStart,
244 CSSPropertyShapeRendering,
246 CSSPropertyStrokeDasharray,
247 CSSPropertyStrokeDashoffset,
248 CSSPropertyStrokeLinecap,
249 CSSPropertyStrokeLinejoin,
250 CSSPropertyStrokeMiterlimit,
251 CSSPropertyStrokeOpacity,
252 CSSPropertyStrokeWidth,
253 CSSPropertyTextRendering,
254 CSSPropertyAlignmentBaseline,
255 CSSPropertyBaselineShift,
256 CSSPropertyDominantBaseline,
258 CSSPropertyTextAnchor,
259 CSSPropertyWritingMode,
260 CSSPropertyGlyphOrientationHorizontal,
261 CSSPropertyGlyphOrientationVertical
263 #ifdef ANDROID_CSS_TAP_HIGHLIGHT_COLOR
265 CSSPropertyWebkitTapHighlightColor
269 const unsigned numComputedProperties = sizeof(computedProperties) / sizeof(computedProperties[0]);
271 static PassRefPtr<CSSValue> valueForShadow(const ShadowData* shadow)
274 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
276 RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
277 for (const ShadowData* s = shadow; s; s = s->next) {
278 RefPtr<CSSPrimitiveValue> x = CSSPrimitiveValue::create(s->x, CSSPrimitiveValue::CSS_PX);
279 RefPtr<CSSPrimitiveValue> y = CSSPrimitiveValue::create(s->y, CSSPrimitiveValue::CSS_PX);
280 RefPtr<CSSPrimitiveValue> blur = CSSPrimitiveValue::create(s->blur, CSSPrimitiveValue::CSS_PX);
281 RefPtr<CSSPrimitiveValue> color = CSSPrimitiveValue::createColor(s->color.rgb());
282 list->prepend(ShadowValue::create(x.release(), y.release(), blur.release(), color.release()));
284 return list.release();
287 static int valueForRepeatRule(int rule)
290 case RepeatImageRule:
291 return CSSValueRepeat;
293 return CSSValueRound;
295 return CSSValueStretch;
299 static PassRefPtr<CSSValue> valueForNinePieceImage(const NinePieceImage& image)
301 if (!image.hasImage())
302 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
305 RefPtr<CSSValue> imageValue;
307 imageValue = image.image()->cssValue();
309 // Create the slices.
310 RefPtr<CSSPrimitiveValue> top;
311 if (image.m_slices.top().isPercent())
312 top = CSSPrimitiveValue::create(image.m_slices.top().value(), CSSPrimitiveValue::CSS_PERCENTAGE);
314 top = CSSPrimitiveValue::create(image.m_slices.top().value(), CSSPrimitiveValue::CSS_NUMBER);
316 RefPtr<CSSPrimitiveValue> right;
317 if (image.m_slices.right().isPercent())
318 right = CSSPrimitiveValue::create(image.m_slices.right().value(), CSSPrimitiveValue::CSS_PERCENTAGE);
320 right = CSSPrimitiveValue::create(image.m_slices.right().value(), CSSPrimitiveValue::CSS_NUMBER);
322 RefPtr<CSSPrimitiveValue> bottom;
323 if (image.m_slices.bottom().isPercent())
324 bottom = CSSPrimitiveValue::create(image.m_slices.bottom().value(), CSSPrimitiveValue::CSS_PERCENTAGE);
326 bottom = CSSPrimitiveValue::create(image.m_slices.bottom().value(), CSSPrimitiveValue::CSS_NUMBER);
328 RefPtr<CSSPrimitiveValue> left;
329 if (image.m_slices.left().isPercent())
330 left = CSSPrimitiveValue::create(image.m_slices.left().value(), CSSPrimitiveValue::CSS_PERCENTAGE);
332 left = CSSPrimitiveValue::create(image.m_slices.left().value(), CSSPrimitiveValue::CSS_NUMBER);
334 RefPtr<Rect> rect = Rect::create();
336 rect->setRight(right);
337 rect->setBottom(bottom);
340 return CSSBorderImageValue::create(imageValue, rect, valueForRepeatRule(image.m_horizontalRule), valueForRepeatRule(image.m_verticalRule));
343 static PassRefPtr<CSSValue> valueForReflection(const StyleReflection* reflection)
346 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
348 RefPtr<CSSPrimitiveValue> offset;
349 if (reflection->offset().isPercent())
350 offset = CSSPrimitiveValue::create(reflection->offset().percent(), CSSPrimitiveValue::CSS_PERCENTAGE);
352 offset = CSSPrimitiveValue::create(reflection->offset().value(), CSSPrimitiveValue::CSS_PX);
354 return CSSReflectValue::create(reflection->direction(), offset.release(), valueForNinePieceImage(reflection->mask()));
357 static PassRefPtr<CSSValue> getPositionOffsetValue(RenderStyle* style, int propertyID)
363 switch (propertyID) {
364 case CSSPropertyLeft:
367 case CSSPropertyRight:
373 case CSSPropertyBottom:
380 if (style->position() == AbsolutePosition || style->position() == FixedPosition)
381 return CSSPrimitiveValue::create(l);
383 if (style->position() == RelativePosition)
384 // FIXME: It's not enough to simply return "auto" values for one offset if the other side is defined.
385 // In other words if left is auto and right is not auto, then left's computed value is negative right().
386 // So we should get the opposite length unit and see if it is auto.
387 return CSSPrimitiveValue::create(l);
389 return CSSPrimitiveValue::createIdentifier(CSSValueAuto);
392 static PassRefPtr<CSSPrimitiveValue> currentColorOrValidColor(RenderStyle* style, const Color& color)
394 if (!color.isValid())
395 return CSSPrimitiveValue::createColor(style->color().rgb());
396 return CSSPrimitiveValue::createColor(color.rgb());
399 static PassRefPtr<CSSValue> getBorderRadiusCornerValue(IntSize radius)
401 if (radius.width() == radius.height())
402 return CSSPrimitiveValue::create(radius.width(), CSSPrimitiveValue::CSS_PX);
404 RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
405 list->append(CSSPrimitiveValue::create(radius.width(), CSSPrimitiveValue::CSS_PX));
406 list->append(CSSPrimitiveValue::create(radius.height(), CSSPrimitiveValue::CSS_PX));
407 return list.release();
410 static IntRect sizingBox(RenderObject* renderer)
412 if (!renderer->isBox())
415 RenderBox* box = toRenderBox(renderer);
416 return box->style()->boxSizing() == CONTENT_BOX ? box->contentBoxRect() : box->borderBoxRect();
419 static inline bool hasCompositedLayer(RenderObject* renderer)
421 return renderer && renderer->hasLayer() && toRenderBoxModelObject(renderer)->layer()->isComposited();
424 static PassRefPtr<CSSValue> computedTransform(RenderObject* renderer, const RenderStyle* style)
426 if (!renderer || style->transform().operations().isEmpty())
427 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
429 IntRect box = sizingBox(renderer);
431 TransformationMatrix transform;
432 style->applyTransform(transform, box.size(), RenderStyle::ExcludeTransformOrigin);
433 // Note that this does not flatten to an affine transform if ENABLE(3D_RENDERING) is off, by design.
435 RefPtr<WebKitCSSTransformValue> transformVal;
437 // FIXME: Need to print out individual functions (https://bugs.webkit.org/show_bug.cgi?id=23924)
438 if (transform.isAffine()) {
439 transformVal = WebKitCSSTransformValue::create(WebKitCSSTransformValue::MatrixTransformOperation);
441 transformVal->append(CSSPrimitiveValue::create(transform.a(), CSSPrimitiveValue::CSS_NUMBER));
442 transformVal->append(CSSPrimitiveValue::create(transform.b(), CSSPrimitiveValue::CSS_NUMBER));
443 transformVal->append(CSSPrimitiveValue::create(transform.c(), CSSPrimitiveValue::CSS_NUMBER));
444 transformVal->append(CSSPrimitiveValue::create(transform.d(), CSSPrimitiveValue::CSS_NUMBER));
445 transformVal->append(CSSPrimitiveValue::create(transform.e(), CSSPrimitiveValue::CSS_NUMBER));
446 transformVal->append(CSSPrimitiveValue::create(transform.f(), CSSPrimitiveValue::CSS_NUMBER));
448 transformVal = WebKitCSSTransformValue::create(WebKitCSSTransformValue::Matrix3DTransformOperation);
450 transformVal->append(CSSPrimitiveValue::create(transform.m11(), CSSPrimitiveValue::CSS_NUMBER));
451 transformVal->append(CSSPrimitiveValue::create(transform.m12(), CSSPrimitiveValue::CSS_NUMBER));
452 transformVal->append(CSSPrimitiveValue::create(transform.m13(), CSSPrimitiveValue::CSS_NUMBER));
453 transformVal->append(CSSPrimitiveValue::create(transform.m14(), CSSPrimitiveValue::CSS_NUMBER));
455 transformVal->append(CSSPrimitiveValue::create(transform.m21(), CSSPrimitiveValue::CSS_NUMBER));
456 transformVal->append(CSSPrimitiveValue::create(transform.m22(), CSSPrimitiveValue::CSS_NUMBER));
457 transformVal->append(CSSPrimitiveValue::create(transform.m23(), CSSPrimitiveValue::CSS_NUMBER));
458 transformVal->append(CSSPrimitiveValue::create(transform.m24(), CSSPrimitiveValue::CSS_NUMBER));
460 transformVal->append(CSSPrimitiveValue::create(transform.m31(), CSSPrimitiveValue::CSS_NUMBER));
461 transformVal->append(CSSPrimitiveValue::create(transform.m32(), CSSPrimitiveValue::CSS_NUMBER));
462 transformVal->append(CSSPrimitiveValue::create(transform.m33(), CSSPrimitiveValue::CSS_NUMBER));
463 transformVal->append(CSSPrimitiveValue::create(transform.m34(), CSSPrimitiveValue::CSS_NUMBER));
465 transformVal->append(CSSPrimitiveValue::create(transform.m41(), CSSPrimitiveValue::CSS_NUMBER));
466 transformVal->append(CSSPrimitiveValue::create(transform.m42(), CSSPrimitiveValue::CSS_NUMBER));
467 transformVal->append(CSSPrimitiveValue::create(transform.m43(), CSSPrimitiveValue::CSS_NUMBER));
468 transformVal->append(CSSPrimitiveValue::create(transform.m44(), CSSPrimitiveValue::CSS_NUMBER));
471 RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
472 list->append(transformVal);
474 return list.release();
477 static PassRefPtr<CSSValue> getDelayValue(const AnimationList* animList)
479 RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
481 for (size_t i = 0; i < animList->size(); ++i)
482 list->append(CSSPrimitiveValue::create(animList->animation(i)->delay(), CSSPrimitiveValue::CSS_S));
484 // Note that initialAnimationDelay() is used for both transitions and animations
485 list->append(CSSPrimitiveValue::create(Animation::initialAnimationDelay(), CSSPrimitiveValue::CSS_S));
487 return list.release();
490 static PassRefPtr<CSSValue> getDurationValue(const AnimationList* animList)
492 RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
494 for (size_t i = 0; i < animList->size(); ++i)
495 list->append(CSSPrimitiveValue::create(animList->animation(i)->duration(), CSSPrimitiveValue::CSS_S));
497 // Note that initialAnimationDuration() is used for both transitions and animations
498 list->append(CSSPrimitiveValue::create(Animation::initialAnimationDuration(), CSSPrimitiveValue::CSS_S));
500 return list.release();
503 static PassRefPtr<CSSValue> getTimingFunctionValue(const AnimationList* animList)
505 RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
507 for (size_t i = 0; i < animList->size(); ++i) {
508 const TimingFunction& tf = animList->animation(i)->timingFunction();
509 list->append(CSSTimingFunctionValue::create(tf.x1(), tf.y1(), tf.x2(), tf.y2()));
512 // Note that initialAnimationTimingFunction() is used for both transitions and animations
513 const TimingFunction& tf = Animation::initialAnimationTimingFunction();
514 list->append(CSSTimingFunctionValue::create(tf.x1(), tf.y1(), tf.x2(), tf.y2()));
516 return list.release();
519 CSSComputedStyleDeclaration::CSSComputedStyleDeclaration(PassRefPtr<Node> n)
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();
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::getPropertyCSSValue(int propertyID) const
576 return getPropertyCSSValue(propertyID, UpdateLayout);
579 static int identifierForFamily(const AtomicString& family)
581 DEFINE_STATIC_LOCAL(AtomicString, cursiveFamily, ("-webkit-cursive"));
582 DEFINE_STATIC_LOCAL(AtomicString, fantasyFamily, ("-webkit-fantasy"));
583 DEFINE_STATIC_LOCAL(AtomicString, monospaceFamily, ("-webkit-monospace"));
584 DEFINE_STATIC_LOCAL(AtomicString, sansSerifFamily, ("-webkit-sans-serif"));
585 DEFINE_STATIC_LOCAL(AtomicString, serifFamily, ("-webkit-serif"));
586 if (family == cursiveFamily)
587 return CSSValueCursive;
588 if (family == fantasyFamily)
589 return CSSValueFantasy;
590 if (family == monospaceFamily)
591 return CSSValueMonospace;
592 if (family == sansSerifFamily)
593 return CSSValueSansSerif;
594 if (family == serifFamily)
595 return CSSValueSerif;
599 static PassRefPtr<CSSPrimitiveValue> valueForFamily(const AtomicString& family)
601 if (int familyIdentifier = identifierForFamily(family))
602 return CSSPrimitiveValue::createIdentifier(familyIdentifier);
603 return CSSPrimitiveValue::create(family.string(), CSSPrimitiveValue::CSS_STRING);
606 PassRefPtr<CSSValue> CSSComputedStyleDeclaration::getPropertyCSSValue(int propertyID, EUpdateLayout updateLayout) const
608 Node* node = m_node.get();
612 // Make sure our layout is up to date before we allow a query on these attributes.
614 node->document()->updateLayoutIgnorePendingStylesheets();
616 RenderObject* renderer = node->renderer();
618 RefPtr<RenderStyle> style;
619 if (renderer && hasCompositedLayer(renderer) && AnimationController::supportsAcceleratedAnimationOfProperty(static_cast<CSSPropertyID>(propertyID)))
620 style = renderer->animation()->getAnimatedStyleForRenderer(renderer);
622 style = node->computedStyle();
626 #ifdef ANDROID_LAYOUT
627 const Settings * settings = node->document()->frame() ? node->document()->frame()->settings() : 0;
630 switch (static_cast<CSSPropertyID>(propertyID)) {
631 case CSSPropertyInvalid:
634 case CSSPropertyBackgroundColor:
635 return CSSPrimitiveValue::createColor(style->backgroundColor().rgb());
636 case CSSPropertyBackgroundImage:
637 if (style->backgroundImage())
638 return style->backgroundImage()->cssValue();
639 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
640 case CSSPropertyWebkitBackgroundSize: {
641 RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
642 list->append(CSSPrimitiveValue::create(style->backgroundSize().width()));
643 list->append(CSSPrimitiveValue::create(style->backgroundSize().height()));
644 return list.release();
646 case CSSPropertyBackgroundRepeat:
647 return CSSPrimitiveValue::create(style->backgroundRepeat());
648 case CSSPropertyWebkitBackgroundComposite:
649 return CSSPrimitiveValue::create(style->backgroundComposite());
650 case CSSPropertyBackgroundAttachment:
651 if (style->backgroundAttachment())
652 return CSSPrimitiveValue::createIdentifier(CSSValueScroll);
653 return CSSPrimitiveValue::createIdentifier(CSSValueFixed);
654 case CSSPropertyWebkitBackgroundClip:
655 case CSSPropertyWebkitBackgroundOrigin: {
656 EFillBox box = (propertyID == CSSPropertyWebkitBackgroundClip ? style->backgroundClip() : style->backgroundOrigin());
657 return CSSPrimitiveValue::create(box);
659 case CSSPropertyBackgroundPosition: {
660 RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
662 list->append(CSSPrimitiveValue::create(style->backgroundXPosition()));
663 list->append(CSSPrimitiveValue::create(style->backgroundYPosition()));
665 return list.release();
667 case CSSPropertyBackgroundPositionX:
668 return CSSPrimitiveValue::create(style->backgroundXPosition());
669 case CSSPropertyBackgroundPositionY:
670 return CSSPrimitiveValue::create(style->backgroundYPosition());
671 case CSSPropertyBorderCollapse:
672 if (style->borderCollapse())
673 return CSSPrimitiveValue::createIdentifier(CSSValueCollapse);
674 return CSSPrimitiveValue::createIdentifier(CSSValueSeparate);
675 case CSSPropertyBorderSpacing: {
676 RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
677 list->append(CSSPrimitiveValue::create(style->horizontalBorderSpacing(), CSSPrimitiveValue::CSS_PX));
678 list->append(CSSPrimitiveValue::create(style->verticalBorderSpacing(), CSSPrimitiveValue::CSS_PX));
679 return list.release();
681 case CSSPropertyWebkitBorderHorizontalSpacing:
682 return CSSPrimitiveValue::create(style->horizontalBorderSpacing(), CSSPrimitiveValue::CSS_PX);
683 case CSSPropertyWebkitBorderVerticalSpacing:
684 return CSSPrimitiveValue::create(style->verticalBorderSpacing(), CSSPrimitiveValue::CSS_PX);
685 case CSSPropertyBorderTopColor:
686 return currentColorOrValidColor(style.get(), style->borderTopColor());
687 case CSSPropertyBorderRightColor:
688 return currentColorOrValidColor(style.get(), style->borderRightColor());
689 case CSSPropertyBorderBottomColor:
690 return currentColorOrValidColor(style.get(), style->borderBottomColor());
691 case CSSPropertyBorderLeftColor:
692 return currentColorOrValidColor(style.get(), style->borderLeftColor());
693 case CSSPropertyBorderTopStyle:
694 return CSSPrimitiveValue::create(style->borderTopStyle());
695 case CSSPropertyBorderRightStyle:
696 return CSSPrimitiveValue::create(style->borderRightStyle());
697 case CSSPropertyBorderBottomStyle:
698 return CSSPrimitiveValue::create(style->borderBottomStyle());
699 case CSSPropertyBorderLeftStyle:
700 return CSSPrimitiveValue::create(style->borderLeftStyle());
701 case CSSPropertyBorderTopWidth:
702 return CSSPrimitiveValue::create(style->borderTopWidth(), CSSPrimitiveValue::CSS_PX);
703 case CSSPropertyBorderRightWidth:
704 return CSSPrimitiveValue::create(style->borderRightWidth(), CSSPrimitiveValue::CSS_PX);
705 case CSSPropertyBorderBottomWidth:
706 return CSSPrimitiveValue::create(style->borderBottomWidth(), CSSPrimitiveValue::CSS_PX);
707 case CSSPropertyBorderLeftWidth:
708 return CSSPrimitiveValue::create(style->borderLeftWidth(), CSSPrimitiveValue::CSS_PX);
709 case CSSPropertyBottom:
710 return getPositionOffsetValue(style.get(), CSSPropertyBottom);
711 case CSSPropertyWebkitBoxAlign:
712 return CSSPrimitiveValue::create(style->boxAlign());
713 case CSSPropertyWebkitBoxDirection:
714 return CSSPrimitiveValue::create(style->boxDirection());
715 case CSSPropertyWebkitBoxFlex:
716 return CSSPrimitiveValue::create(style->boxFlex(), CSSPrimitiveValue::CSS_NUMBER);
717 case CSSPropertyWebkitBoxFlexGroup:
718 return CSSPrimitiveValue::create(style->boxFlexGroup(), CSSPrimitiveValue::CSS_NUMBER);
719 case CSSPropertyWebkitBoxLines:
720 return CSSPrimitiveValue::create(style->boxLines());
721 case CSSPropertyWebkitBoxOrdinalGroup:
722 return CSSPrimitiveValue::create(style->boxOrdinalGroup(), CSSPrimitiveValue::CSS_NUMBER);
723 case CSSPropertyWebkitBoxOrient:
724 return CSSPrimitiveValue::create(style->boxOrient());
725 case CSSPropertyWebkitBoxPack: {
726 EBoxAlignment boxPack = style->boxPack();
727 ASSERT(boxPack != BSTRETCH);
728 ASSERT(boxPack != BBASELINE);
729 if (boxPack == BJUSTIFY || boxPack== BBASELINE)
731 return CSSPrimitiveValue::create(boxPack);
733 case CSSPropertyWebkitBoxReflect:
734 return valueForReflection(style->boxReflect());
735 case CSSPropertyWebkitBoxShadow:
736 return valueForShadow(style->boxShadow());
737 case CSSPropertyCaptionSide:
738 return CSSPrimitiveValue::create(style->captionSide());
739 case CSSPropertyClear:
740 return CSSPrimitiveValue::create(style->clear());
741 case CSSPropertyColor:
742 return CSSPrimitiveValue::createColor(style->color().rgb());
743 case CSSPropertyWebkitColumnCount:
744 if (style->hasAutoColumnCount())
745 return CSSPrimitiveValue::createIdentifier(CSSValueAuto);
746 return CSSPrimitiveValue::create(style->columnCount(), CSSPrimitiveValue::CSS_NUMBER);
747 case CSSPropertyWebkitColumnGap:
748 if (style->hasNormalColumnGap())
749 return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
750 return CSSPrimitiveValue::create(style->columnGap(), CSSPrimitiveValue::CSS_NUMBER);
751 case CSSPropertyWebkitColumnRuleColor:
752 return currentColorOrValidColor(style.get(), style->columnRuleColor());
753 case CSSPropertyWebkitColumnRuleStyle:
754 return CSSPrimitiveValue::create(style->columnRuleStyle());
755 case CSSPropertyWebkitColumnRuleWidth:
756 return CSSPrimitiveValue::create(style->columnRuleWidth(), CSSPrimitiveValue::CSS_PX);
757 case CSSPropertyWebkitColumnBreakAfter:
758 return CSSPrimitiveValue::create(style->columnBreakAfter());
759 case CSSPropertyWebkitColumnBreakBefore:
760 return CSSPrimitiveValue::create(style->columnBreakBefore());
761 case CSSPropertyWebkitColumnBreakInside:
762 return CSSPrimitiveValue::create(style->columnBreakInside());
763 case CSSPropertyWebkitColumnWidth:
764 if (style->hasAutoColumnWidth())
765 return CSSPrimitiveValue::createIdentifier(CSSValueAuto);
766 return CSSPrimitiveValue::create(style->columnWidth(), CSSPrimitiveValue::CSS_NUMBER);
767 case CSSPropertyCursor: {
768 RefPtr<CSSValueList> list;
769 CursorList* cursors = style->cursors();
770 if (cursors && cursors->size() > 0) {
771 list = CSSValueList::createCommaSeparated();
772 for (unsigned i = 0; i < cursors->size(); ++i)
773 list->append(CSSPrimitiveValue::create((*cursors)[i].cursorImage->url(), CSSPrimitiveValue::CSS_URI));
775 RefPtr<CSSValue> value = CSSPrimitiveValue::create(style->cursor());
778 return list.release();
780 return value.release();
782 case CSSPropertyDirection:
783 return CSSPrimitiveValue::create(style->direction());
784 case CSSPropertyDisplay:
785 return CSSPrimitiveValue::create(style->display());
786 case CSSPropertyEmptyCells:
787 return CSSPrimitiveValue::create(style->emptyCells());
788 case CSSPropertyFloat:
789 #ifdef ANDROID_LAYOUT
790 if (settings && settings->layoutAlgorithm() == Settings::kLayoutSSR)
791 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
793 return CSSPrimitiveValue::create(style->floating());
794 case CSSPropertyFontFamily: {
795 const FontFamily& firstFamily = style->fontDescription().family();
796 if (!firstFamily.next())
797 return valueForFamily(firstFamily.family());
798 RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
799 for (const FontFamily* family = &firstFamily; family; family = family->next())
800 list->append(valueForFamily(family->family()));
801 return list.release();
803 case CSSPropertyFontSize:
804 return CSSPrimitiveValue::create(style->fontDescription().computedPixelSize(), CSSPrimitiveValue::CSS_PX);
805 case CSSPropertyWebkitBinding:
807 case CSSPropertyFontStyle:
808 if (style->fontDescription().italic())
809 return CSSPrimitiveValue::createIdentifier(CSSValueItalic);
810 return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
811 case CSSPropertyFontVariant:
812 if (style->fontDescription().smallCaps())
813 return CSSPrimitiveValue::createIdentifier(CSSValueSmallCaps);
814 return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
815 case CSSPropertyFontWeight:
816 switch (style->fontDescription().weight()) {
818 return CSSPrimitiveValue::createIdentifier(CSSValue100);
820 return CSSPrimitiveValue::createIdentifier(CSSValue200);
822 return CSSPrimitiveValue::createIdentifier(CSSValue300);
823 case FontWeightNormal:
824 return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
826 return CSSPrimitiveValue::createIdentifier(CSSValue500);
828 return CSSPrimitiveValue::createIdentifier(CSSValue600);
830 return CSSPrimitiveValue::createIdentifier(CSSValueBold);
832 return CSSPrimitiveValue::createIdentifier(CSSValue800);
834 return CSSPrimitiveValue::createIdentifier(CSSValue900);
836 ASSERT_NOT_REACHED();
837 return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
838 case CSSPropertyHeight:
840 return CSSPrimitiveValue::create(sizingBox(renderer).height(), CSSPrimitiveValue::CSS_PX);
841 return CSSPrimitiveValue::create(style->height());
842 case CSSPropertyWebkitHighlight:
843 if (style->highlight() == nullAtom)
844 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
845 return CSSPrimitiveValue::create(style->highlight(), CSSPrimitiveValue::CSS_STRING);
846 case CSSPropertyWebkitBorderFit:
847 if (style->borderFit() == BorderFitBorder)
848 return CSSPrimitiveValue::createIdentifier(CSSValueBorder);
849 return CSSPrimitiveValue::createIdentifier(CSSValueLines);
850 case CSSPropertyLeft:
851 return getPositionOffsetValue(style.get(), CSSPropertyLeft);
852 case CSSPropertyLetterSpacing:
853 if (!style->letterSpacing())
854 return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
855 return CSSPrimitiveValue::create(style->letterSpacing(), CSSPrimitiveValue::CSS_PX);
856 case CSSPropertyWebkitLineClamp:
857 if (style->lineClamp() == -1)
858 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
859 return CSSPrimitiveValue::create(style->lineClamp(), CSSPrimitiveValue::CSS_PERCENTAGE);
860 case CSSPropertyLineHeight: {
861 Length length = style->lineHeight();
862 if (length.isNegative())
863 return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
864 if (length.isPercent())
865 // This is imperfect, because it doesn't include the zoom factor and the real computation
866 // for how high to be in pixels does include things like minimum font size and the zoom factor.
867 // On the other hand, since font-size doesn't include the zoom factor, we really can't do
869 return CSSPrimitiveValue::create(static_cast<int>(length.percent() * style->fontDescription().specifiedSize()) / 100, CSSPrimitiveValue::CSS_PX);
870 return CSSPrimitiveValue::create(length.value(), CSSPrimitiveValue::CSS_PX);
872 case CSSPropertyListStyleImage:
873 if (style->listStyleImage())
874 return style->listStyleImage()->cssValue();
875 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
876 case CSSPropertyListStylePosition:
877 return CSSPrimitiveValue::create(style->listStylePosition());
878 case CSSPropertyListStyleType:
879 return CSSPrimitiveValue::create(style->listStyleType());
880 case CSSPropertyMarginTop:
881 if (renderer && renderer->isBox())
882 // FIXME: Supposed to return the percentage if percentage was specified.
883 return CSSPrimitiveValue::create(toRenderBox(renderer)->marginTop(), CSSPrimitiveValue::CSS_PX);
884 return CSSPrimitiveValue::create(style->marginTop());
885 case CSSPropertyMarginRight:
886 if (renderer && renderer->isBox())
887 // FIXME: Supposed to return the percentage if percentage was specified.
888 return CSSPrimitiveValue::create(toRenderBox(renderer)->marginRight(), CSSPrimitiveValue::CSS_PX);
889 return CSSPrimitiveValue::create(style->marginRight());
890 case CSSPropertyMarginBottom:
891 if (renderer && renderer->isBox())
892 // FIXME: Supposed to return the percentage if percentage was specified.
893 return CSSPrimitiveValue::create(toRenderBox(renderer)->marginBottom(), CSSPrimitiveValue::CSS_PX);
894 return CSSPrimitiveValue::create(style->marginBottom());
895 case CSSPropertyMarginLeft:
896 if (renderer && renderer->isBox())
897 // FIXME: Supposed to return the percentage if percentage was specified.
898 return CSSPrimitiveValue::create(toRenderBox(renderer)->marginLeft(), CSSPrimitiveValue::CSS_PX);
899 return CSSPrimitiveValue::create(style->marginLeft());
900 case CSSPropertyWebkitMarqueeDirection:
901 return CSSPrimitiveValue::create(style->marqueeDirection());
902 case CSSPropertyWebkitMarqueeIncrement:
903 return CSSPrimitiveValue::create(style->marqueeIncrement());
904 case CSSPropertyWebkitMarqueeRepetition:
905 if (style->marqueeLoopCount() < 0)
906 return CSSPrimitiveValue::createIdentifier(CSSValueInfinite);
907 return CSSPrimitiveValue::create(style->marqueeLoopCount(), CSSPrimitiveValue::CSS_NUMBER);
908 case CSSPropertyWebkitMarqueeStyle:
909 return CSSPrimitiveValue::create(style->marqueeBehavior());
910 case CSSPropertyWebkitMaskImage:
911 if (style->maskImage())
912 return style->maskImage()->cssValue();
913 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
914 case CSSPropertyWebkitMaskSize: {
915 RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
916 list->append(CSSPrimitiveValue::create(style->maskSize().width()));
917 list->append(CSSPrimitiveValue::create(style->maskSize().height()));
918 return list.release();
920 case CSSPropertyWebkitMaskRepeat:
921 return CSSPrimitiveValue::create(style->maskRepeat());
922 case CSSPropertyWebkitMaskAttachment:
923 if (style->maskAttachment())
924 return CSSPrimitiveValue::createIdentifier(CSSValueScroll);
925 return CSSPrimitiveValue::createIdentifier(CSSValueFixed);
926 case CSSPropertyWebkitMaskComposite:
927 return CSSPrimitiveValue::create(style->maskComposite());
928 case CSSPropertyWebkitMaskClip:
929 case CSSPropertyWebkitMaskOrigin: {
930 EFillBox box = (propertyID == CSSPropertyWebkitMaskClip ? style->maskClip() : style->maskOrigin());
931 return CSSPrimitiveValue::create(box);
933 case CSSPropertyWebkitMaskPosition: {
934 RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
936 list->append(CSSPrimitiveValue::create(style->maskXPosition()));
937 list->append(CSSPrimitiveValue::create(style->maskYPosition()));
939 return list.release();
941 case CSSPropertyWebkitMaskPositionX:
942 return CSSPrimitiveValue::create(style->maskXPosition());
943 case CSSPropertyWebkitMaskPositionY:
944 return CSSPrimitiveValue::create(style->maskYPosition());
945 case CSSPropertyWebkitUserModify:
946 return CSSPrimitiveValue::create(style->userModify());
947 case CSSPropertyMaxHeight: {
948 const Length& maxHeight = style->maxHeight();
949 if (maxHeight.isFixed() && maxHeight.value() == undefinedLength)
950 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
951 return CSSPrimitiveValue::create(maxHeight);
953 case CSSPropertyMaxWidth: {
954 const Length& maxWidth = style->maxWidth();
955 if (maxWidth.isFixed() && maxWidth.value() == undefinedLength)
956 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
957 return CSSPrimitiveValue::create(maxWidth);
959 case CSSPropertyMinHeight:
960 return CSSPrimitiveValue::create(style->minHeight());
961 case CSSPropertyMinWidth:
962 return CSSPrimitiveValue::create(style->minWidth());
963 case CSSPropertyOpacity:
964 return CSSPrimitiveValue::create(style->opacity(), CSSPrimitiveValue::CSS_NUMBER);
965 case CSSPropertyOrphans:
966 return CSSPrimitiveValue::create(style->orphans(), CSSPrimitiveValue::CSS_NUMBER);
967 case CSSPropertyOutlineColor:
968 return currentColorOrValidColor(style.get(), style->outlineColor());
969 case CSSPropertyOutlineStyle:
970 if (style->outlineStyleIsAuto())
971 return CSSPrimitiveValue::createIdentifier(CSSValueAuto);
972 return CSSPrimitiveValue::create(style->outlineStyle());
973 case CSSPropertyOutlineWidth:
974 return CSSPrimitiveValue::create(style->outlineWidth(), CSSPrimitiveValue::CSS_PX);
975 case CSSPropertyOverflow:
976 return CSSPrimitiveValue::create(max(style->overflowX(), style->overflowY()));
977 case CSSPropertyOverflowX:
978 return CSSPrimitiveValue::create(style->overflowX());
979 case CSSPropertyOverflowY:
980 #ifdef ANDROID_LAYOUT
981 if (settings && settings->layoutAlgorithm() == Settings::kLayoutSSR)
982 return CSSPrimitiveValue::createIdentifier(CSSValueVisible);
984 return CSSPrimitiveValue::create(style->overflowY());
985 case CSSPropertyPaddingTop:
986 if (renderer && renderer->isBox())
987 return CSSPrimitiveValue::create(toRenderBox(renderer)->paddingTop(false), CSSPrimitiveValue::CSS_PX);
988 return CSSPrimitiveValue::create(style->paddingTop());
989 case CSSPropertyPaddingRight:
990 if (renderer && renderer->isBox())
991 return CSSPrimitiveValue::create(toRenderBox(renderer)->paddingRight(false), CSSPrimitiveValue::CSS_PX);
992 return CSSPrimitiveValue::create(style->paddingRight());
993 case CSSPropertyPaddingBottom:
994 if (renderer && renderer->isBox())
995 return CSSPrimitiveValue::create(toRenderBox(renderer)->paddingBottom(false), CSSPrimitiveValue::CSS_PX);
996 return CSSPrimitiveValue::create(style->paddingBottom());
997 case CSSPropertyPaddingLeft:
998 if (renderer && renderer->isBox())
999 return CSSPrimitiveValue::create(toRenderBox(renderer)->paddingLeft(false), CSSPrimitiveValue::CSS_PX);
1000 return CSSPrimitiveValue::create(style->paddingLeft());
1001 case CSSPropertyPageBreakAfter:
1002 return CSSPrimitiveValue::create(style->pageBreakAfter());
1003 case CSSPropertyPageBreakBefore:
1004 return CSSPrimitiveValue::create(style->pageBreakBefore());
1005 case CSSPropertyPageBreakInside: {
1006 EPageBreak pageBreak = style->pageBreakInside();
1007 ASSERT(pageBreak != PBALWAYS);
1008 if (pageBreak == PBALWAYS)
1010 return CSSPrimitiveValue::create(style->pageBreakInside());
1012 case CSSPropertyPosition:
1013 #ifdef ANDROID_LAYOUT
1014 if (settings && settings->layoutAlgorithm() == Settings::kLayoutSSR)
1015 return CSSPrimitiveValue::createIdentifier(CSSValueStatic);
1017 return CSSPrimitiveValue::create(style->position());
1018 case CSSPropertyRight:
1019 return getPositionOffsetValue(style.get(), CSSPropertyRight);
1020 case CSSPropertyTableLayout:
1021 return CSSPrimitiveValue::create(style->tableLayout());
1022 case CSSPropertyTextAlign:
1023 return CSSPrimitiveValue::create(style->textAlign());
1024 case CSSPropertyTextDecoration: {
1026 if (style->textDecoration() & UNDERLINE)
1027 string += "underline";
1028 if (style->textDecoration() & OVERLINE) {
1029 if (string.length())
1031 string += "overline";
1033 if (style->textDecoration() & LINE_THROUGH) {
1034 if (string.length())
1036 string += "line-through";
1038 if (style->textDecoration() & BLINK) {
1039 if (string.length())
1043 if (!string.length())
1044 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
1045 return CSSPrimitiveValue::create(string, CSSPrimitiveValue::CSS_STRING);
1047 case CSSPropertyWebkitTextDecorationsInEffect: {
1049 if (style->textDecorationsInEffect() & UNDERLINE)
1050 string += "underline";
1051 if (style->textDecorationsInEffect() & OVERLINE) {
1052 if (string.length())
1054 string += "overline";
1056 if (style->textDecorationsInEffect() & LINE_THROUGH) {
1057 if (string.length())
1059 string += "line-through";
1061 if (style->textDecorationsInEffect() & BLINK) {
1062 if (string.length())
1066 if (!string.length())
1067 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
1068 return CSSPrimitiveValue::create(string, CSSPrimitiveValue::CSS_STRING);
1070 case CSSPropertyWebkitTextFillColor:
1071 return currentColorOrValidColor(style.get(), style->textFillColor());
1072 case CSSPropertyTextIndent:
1073 return CSSPrimitiveValue::create(style->textIndent());
1074 case CSSPropertyTextShadow:
1075 return valueForShadow(style->textShadow());
1076 case CSSPropertyWebkitTextSecurity:
1077 return CSSPrimitiveValue::create(style->textSecurity());
1078 case CSSPropertyWebkitTextSizeAdjust:
1079 if (style->textSizeAdjust())
1080 return CSSPrimitiveValue::createIdentifier(CSSValueAuto);
1081 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
1082 case CSSPropertyWebkitTextStrokeColor:
1083 return currentColorOrValidColor(style.get(), style->textStrokeColor());
1084 case CSSPropertyWebkitTextStrokeWidth:
1085 return CSSPrimitiveValue::create(style->textStrokeWidth(), CSSPrimitiveValue::CSS_PX);
1086 case CSSPropertyTextTransform:
1087 return CSSPrimitiveValue::create(style->textTransform());
1088 case CSSPropertyTop:
1089 return getPositionOffsetValue(style.get(), CSSPropertyTop);
1090 case CSSPropertyUnicodeBidi:
1091 return CSSPrimitiveValue::create(style->unicodeBidi());
1092 case CSSPropertyVerticalAlign:
1093 switch (style->verticalAlign()) {
1095 return CSSPrimitiveValue::createIdentifier(CSSValueBaseline);
1097 return CSSPrimitiveValue::createIdentifier(CSSValueMiddle);
1099 return CSSPrimitiveValue::createIdentifier(CSSValueSub);
1101 return CSSPrimitiveValue::createIdentifier(CSSValueSuper);
1103 return CSSPrimitiveValue::createIdentifier(CSSValueTextTop);
1105 return CSSPrimitiveValue::createIdentifier(CSSValueTextBottom);
1107 return CSSPrimitiveValue::createIdentifier(CSSValueTop);
1109 return CSSPrimitiveValue::createIdentifier(CSSValueBottom);
1110 case BASELINE_MIDDLE:
1111 return CSSPrimitiveValue::createIdentifier(CSSValueWebkitBaselineMiddle);
1113 return CSSPrimitiveValue::create(style->verticalAlignLength());
1115 ASSERT_NOT_REACHED();
1117 case CSSPropertyVisibility:
1118 #ifdef ANDROID_LAYOUT
1119 if (settings && settings->layoutAlgorithm() == Settings::kLayoutSSR)
1120 return CSSPrimitiveValue::createIdentifier(CSSValueVisible);
1122 return CSSPrimitiveValue::create(style->visibility());
1123 case CSSPropertyWhiteSpace:
1124 #ifdef ANDROID_LAYOUT
1125 if (settings && settings->layoutAlgorithm() == Settings::kLayoutSSR)
1126 switch (style->whiteSpace()) {
1130 return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
1133 return CSSPrimitiveValue::createIdentifier(CSSValuePreWrap);
1135 return CSSPrimitiveValue::createIdentifier(CSSValuePreLine);
1139 return CSSPrimitiveValue::create(style->whiteSpace());
1140 case CSSPropertyWidows:
1141 return CSSPrimitiveValue::create(style->widows(), CSSPrimitiveValue::CSS_NUMBER);
1142 case CSSPropertyWidth:
1144 return CSSPrimitiveValue::create(sizingBox(renderer).width(), CSSPrimitiveValue::CSS_PX);
1145 return CSSPrimitiveValue::create(style->width());
1146 case CSSPropertyWordBreak:
1147 return CSSPrimitiveValue::create(style->wordBreak());
1148 case CSSPropertyWordSpacing:
1149 return CSSPrimitiveValue::create(style->wordSpacing(), CSSPrimitiveValue::CSS_PX);
1150 case CSSPropertyWordWrap:
1151 return CSSPrimitiveValue::create(style->wordWrap());
1152 case CSSPropertyWebkitLineBreak:
1153 return CSSPrimitiveValue::create(style->khtmlLineBreak());
1154 case CSSPropertyWebkitNbspMode:
1155 return CSSPrimitiveValue::create(style->nbspMode());
1156 case CSSPropertyWebkitMatchNearestMailBlockquoteColor:
1157 return CSSPrimitiveValue::create(style->matchNearestMailBlockquoteColor());
1158 case CSSPropertyResize:
1159 return CSSPrimitiveValue::create(style->resize());
1160 case CSSPropertyZIndex:
1161 if (style->hasAutoZIndex())
1162 return CSSPrimitiveValue::createIdentifier(CSSValueAuto);
1163 return CSSPrimitiveValue::create(style->zIndex(), CSSPrimitiveValue::CSS_NUMBER);
1164 case CSSPropertyZoom:
1165 return CSSPrimitiveValue::create(style->zoom(), CSSPrimitiveValue::CSS_NUMBER);
1166 case CSSPropertyWebkitBoxSizing:
1167 if (style->boxSizing() == CONTENT_BOX)
1168 return CSSPrimitiveValue::createIdentifier(CSSValueContentBox);
1169 return CSSPrimitiveValue::createIdentifier(CSSValueBorderBox);
1170 #if ENABLE(DASHBOARD_SUPPORT)
1171 case CSSPropertyWebkitDashboardRegion:
1173 const Vector<StyleDashboardRegion>& regions = style->dashboardRegions();
1174 unsigned count = regions.size();
1175 if (count == 1 && regions[0].type == StyleDashboardRegion::None)
1176 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
1178 RefPtr<DashboardRegion> firstRegion;
1179 DashboardRegion* previousRegion = 0;
1180 for (unsigned i = 0; i < count; i++) {
1181 RefPtr<DashboardRegion> region = DashboardRegion::create();
1182 StyleDashboardRegion styleRegion = regions[i];
1184 region->m_label = styleRegion.label;
1185 LengthBox offset = styleRegion.offset;
1186 region->setTop(CSSPrimitiveValue::create(offset.top().value(), CSSPrimitiveValue::CSS_PX));
1187 region->setRight(CSSPrimitiveValue::create(offset.right().value(), CSSPrimitiveValue::CSS_PX));
1188 region->setBottom(CSSPrimitiveValue::create(offset.bottom().value(), CSSPrimitiveValue::CSS_PX));
1189 region->setLeft(CSSPrimitiveValue::create(offset.left().value(), CSSPrimitiveValue::CSS_PX));
1190 region->m_isRectangle = (styleRegion.type == StyleDashboardRegion::Rectangle);
1191 region->m_isCircle = (styleRegion.type == StyleDashboardRegion::Circle);
1194 previousRegion->m_next = region;
1196 firstRegion = region;
1197 previousRegion = region.get();
1199 return CSSPrimitiveValue::create(firstRegion.release());
1202 case CSSPropertyWebkitAnimationDelay:
1203 return getDelayValue(style->animations());
1204 case CSSPropertyWebkitAnimationDirection: {
1205 RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
1206 const AnimationList* t = style->animations();
1208 for (size_t i = 0; i < t->size(); ++i) {
1209 if (t->animation(i)->direction())
1210 list->append(CSSPrimitiveValue::createIdentifier(CSSValueAlternate));
1212 list->append(CSSPrimitiveValue::createIdentifier(CSSValueNormal));
1215 list->append(CSSPrimitiveValue::createIdentifier(CSSValueNormal));
1216 return list.release();
1218 case CSSPropertyWebkitAnimationDuration:
1219 return getDurationValue(style->animations());
1220 case CSSPropertyWebkitAnimationIterationCount: {
1221 RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
1222 const AnimationList* t = style->animations();
1224 for (size_t i = 0; i < t->size(); ++i) {
1225 int iterationCount = t->animation(i)->iterationCount();
1226 if (iterationCount == Animation::IterationCountInfinite)
1227 list->append(CSSPrimitiveValue::createIdentifier(CSSValueInfinite));
1229 list->append(CSSPrimitiveValue::create(iterationCount, CSSPrimitiveValue::CSS_NUMBER));
1232 list->append(CSSPrimitiveValue::create(Animation::initialAnimationIterationCount(), CSSPrimitiveValue::CSS_NUMBER));
1233 return list.release();
1235 case CSSPropertyWebkitAnimationName: {
1236 RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
1237 const AnimationList* t = style->animations();
1239 for (size_t i = 0; i < t->size(); ++i) {
1240 list->append(CSSPrimitiveValue::create(t->animation(i)->name(), CSSPrimitiveValue::CSS_STRING));
1243 list->append(CSSPrimitiveValue::createIdentifier(CSSValueNone));
1244 return list.release();
1246 case CSSPropertyWebkitAnimationTimingFunction:
1247 return getTimingFunctionValue(style->animations());
1248 case CSSPropertyWebkitAppearance:
1249 return CSSPrimitiveValue::create(style->appearance());
1250 case CSSPropertyWebkitBackfaceVisibility:
1251 return CSSPrimitiveValue::createIdentifier((style->backfaceVisibility() == BackfaceVisibilityHidden) ? CSSValueHidden : CSSValueVisible);
1252 case CSSPropertyWebkitBorderImage:
1253 return valueForNinePieceImage(style->borderImage());
1254 case CSSPropertyWebkitMaskBoxImage:
1255 return valueForNinePieceImage(style->maskBoxImage());
1256 case CSSPropertyWebkitFontSizeDelta:
1257 // Not a real style property -- used by the editing engine -- so has no computed value.
1259 case CSSPropertyWebkitMarginBottomCollapse:
1260 return CSSPrimitiveValue::create(style->marginBottomCollapse());
1261 case CSSPropertyWebkitMarginTopCollapse:
1262 return CSSPrimitiveValue::create(style->marginTopCollapse());
1263 case CSSPropertyWebkitPerspective:
1264 if (!style->hasPerspective())
1265 return CSSPrimitiveValue::createIdentifier(CSSValueNone);
1266 return CSSPrimitiveValue::create(style->perspective(), CSSPrimitiveValue::CSS_NUMBER);
1267 case CSSPropertyWebkitPerspectiveOrigin: {
1268 RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
1270 IntRect box = sizingBox(renderer);
1271 list->append(CSSPrimitiveValue::create(style->perspectiveOriginX().calcMinValue(box.width()), CSSPrimitiveValue::CSS_PX));
1272 list->append(CSSPrimitiveValue::create(style->perspectiveOriginY().calcMinValue(box.height()), CSSPrimitiveValue::CSS_PX));
1275 list->append(CSSPrimitiveValue::create(style->perspectiveOriginX()));
1276 list->append(CSSPrimitiveValue::create(style->perspectiveOriginY()));
1278 return list.release();
1280 case CSSPropertyWebkitRtlOrdering:
1281 if (style->visuallyOrdered())
1282 return CSSPrimitiveValue::createIdentifier(CSSValueVisual);
1283 return CSSPrimitiveValue::createIdentifier(CSSValueLogical);
1284 case CSSPropertyWebkitUserDrag:
1285 return CSSPrimitiveValue::create(style->userDrag());
1286 case CSSPropertyWebkitUserSelect:
1287 return CSSPrimitiveValue::create(style->userSelect());
1288 case CSSPropertyWebkitBorderBottomLeftRadius:
1289 return getBorderRadiusCornerValue(style->borderBottomLeftRadius());
1290 case CSSPropertyWebkitBorderBottomRightRadius:
1291 return getBorderRadiusCornerValue(style->borderBottomRightRadius());
1292 case CSSPropertyWebkitBorderTopLeftRadius:
1293 return getBorderRadiusCornerValue(style->borderTopLeftRadius());
1294 case CSSPropertyWebkitBorderTopRightRadius:
1295 return getBorderRadiusCornerValue(style->borderTopRightRadius());
1296 case CSSPropertyClip: {
1297 if (!style->hasClip())
1298 return CSSPrimitiveValue::createIdentifier(CSSValueAuto);
1299 RefPtr<Rect> rect = Rect::create();
1300 rect->setTop(CSSPrimitiveValue::create(style->clip().top().value(), CSSPrimitiveValue::CSS_PX));
1301 rect->setRight(CSSPrimitiveValue::create(style->clip().right().value(), CSSPrimitiveValue::CSS_PX));
1302 rect->setBottom(CSSPrimitiveValue::create(style->clip().bottom().value(), CSSPrimitiveValue::CSS_PX));
1303 rect->setLeft(CSSPrimitiveValue::create(style->clip().left().value(), CSSPrimitiveValue::CSS_PX));
1304 return CSSPrimitiveValue::create(rect.release());
1306 case CSSPropertyWebkitTransform:
1307 return computedTransform(renderer, style.get());
1308 case CSSPropertyWebkitTransformOrigin: {
1309 RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
1311 IntRect box = sizingBox(renderer);
1312 list->append(CSSPrimitiveValue::create(style->transformOriginX().calcMinValue(box.width()), CSSPrimitiveValue::CSS_PX));
1313 list->append(CSSPrimitiveValue::create(style->transformOriginY().calcMinValue(box.height()), CSSPrimitiveValue::CSS_PX));
1314 if (style->transformOriginZ() != 0)
1315 list->append(CSSPrimitiveValue::create(style->transformOriginZ(), CSSPrimitiveValue::CSS_PX));
1317 list->append(CSSPrimitiveValue::create(style->transformOriginX()));
1318 list->append(CSSPrimitiveValue::create(style->transformOriginY()));
1319 if (style->transformOriginZ() != 0)
1320 list->append(CSSPrimitiveValue::create(style->transformOriginZ(), CSSPrimitiveValue::CSS_PX));
1322 return list.release();
1324 case CSSPropertyWebkitTransformStyle:
1325 return CSSPrimitiveValue::createIdentifier((style->transformStyle3D() == TransformStyle3DPreserve3D) ? CSSValuePreserve3d : CSSValueFlat);
1326 case CSSPropertyWebkitTransitionDelay:
1327 return getDelayValue(style->transitions());
1328 case CSSPropertyWebkitTransitionDuration:
1329 return getDurationValue(style->transitions());
1330 case CSSPropertyWebkitTransitionProperty: {
1331 RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
1332 const AnimationList* t = style->transitions();
1334 for (size_t i = 0; i < t->size(); ++i) {
1335 int prop = t->animation(i)->property();
1336 RefPtr<CSSValue> propertyValue;
1337 if (prop == cAnimateNone)
1338 propertyValue = CSSPrimitiveValue::createIdentifier(CSSValueNone);
1339 else if (prop == cAnimateAll)
1340 propertyValue = CSSPrimitiveValue::createIdentifier(CSSValueAll);
1342 propertyValue = CSSPrimitiveValue::create(getPropertyName(static_cast<CSSPropertyID>(prop)), CSSPrimitiveValue::CSS_STRING);
1343 list->append(propertyValue);
1346 list->append(CSSPrimitiveValue::createIdentifier(CSSValueAll));
1347 return list.release();
1349 case CSSPropertyWebkitTransitionTimingFunction:
1350 return getTimingFunctionValue(style->transitions());
1351 case CSSPropertyPointerEvents:
1352 return CSSPrimitiveValue::create(style->pointerEvents());
1354 /* Shorthand properties, currently not supported see bug 13658*/
1355 case CSSPropertyBackground:
1356 case CSSPropertyBorder:
1357 case CSSPropertyBorderBottom:
1358 case CSSPropertyBorderColor:
1359 case CSSPropertyBorderLeft:
1360 case CSSPropertyBorderRight:
1361 case CSSPropertyBorderStyle:
1362 case CSSPropertyBorderTop:
1363 case CSSPropertyBorderWidth:
1364 case CSSPropertyFont:
1365 case CSSPropertyListStyle:
1366 case CSSPropertyMargin:
1367 case CSSPropertyPadding:
1370 /* Unimplemented CSS 3 properties (including CSS3 shorthand properties) */
1371 case CSSPropertyTextLineThrough:
1372 case CSSPropertyTextLineThroughColor:
1373 case CSSPropertyTextLineThroughMode:
1374 case CSSPropertyTextLineThroughStyle:
1375 case CSSPropertyTextLineThroughWidth:
1376 case CSSPropertyTextOverflow:
1377 case CSSPropertyTextOverline:
1378 case CSSPropertyTextOverlineColor:
1379 case CSSPropertyTextOverlineMode:
1380 case CSSPropertyTextOverlineStyle:
1381 case CSSPropertyTextOverlineWidth:
1382 case CSSPropertyTextUnderline:
1383 case CSSPropertyTextUnderlineColor:
1384 case CSSPropertyTextUnderlineMode:
1385 case CSSPropertyTextUnderlineStyle:
1386 case CSSPropertyTextUnderlineWidth:
1389 /* Unimplemented @font-face properties */
1390 case CSSPropertyFontStretch:
1391 case CSSPropertySrc:
1392 case CSSPropertyUnicodeRange:
1395 /* Other unimplemented properties */
1396 case CSSPropertyContent: // FIXME: needs implementation, bug 23668
1397 case CSSPropertyCounterIncrement:
1398 case CSSPropertyCounterReset:
1399 case CSSPropertyOutline: // FIXME: needs implementation
1400 case CSSPropertyOutlineOffset: // FIXME: needs implementation
1401 case CSSPropertyPage: // for @page
1402 case CSSPropertyQuotes: // FIXME: needs implementation
1403 case CSSPropertySize: // for @page
1406 /* Unimplemented -webkit- properties */
1407 case CSSPropertyWebkitAnimation:
1408 case CSSPropertyWebkitBorderRadius:
1409 case CSSPropertyWebkitColumns:
1410 case CSSPropertyWebkitColumnRule:
1411 case CSSPropertyWebkitMarginCollapse:
1412 case CSSPropertyWebkitMarginStart:
1413 case CSSPropertyWebkitMarquee:
1414 case CSSPropertyWebkitMarqueeSpeed:
1415 case CSSPropertyWebkitMask:
1416 case CSSPropertyWebkitPaddingStart:
1417 case CSSPropertyWebkitPerspectiveOriginX:
1418 case CSSPropertyWebkitPerspectiveOriginY:
1419 case CSSPropertyWebkitTextStroke:
1420 case CSSPropertyWebkitTransformOriginX:
1421 case CSSPropertyWebkitTransformOriginY:
1422 case CSSPropertyWebkitTransformOriginZ:
1423 case CSSPropertyWebkitTransition:
1424 case CSSPropertyWebkitVariableDeclarationBlock:
1426 #ifdef ANDROID_CSS_TAP_HIGHLIGHT_COLOR
1427 case CSSPropertyWebkitTapHighlightColor:
1428 return CSSPrimitiveValue::createColor(style->tapHighlightColor().rgb());
1431 // FIXME: This default case ruins the point of using an enum for
1432 // properties -- it prevents us from getting a warning when we
1433 // forget to list a property above.
1435 return getSVGPropertyCSSValue(propertyID, DoNotUpdateLayout);
1439 LOG_ERROR("unimplemented propertyID: %d", propertyID);
1443 String CSSComputedStyleDeclaration::getPropertyValue(int propertyID) const
1445 RefPtr<CSSValue> value = getPropertyCSSValue(propertyID);
1447 return value->cssText();
1451 bool CSSComputedStyleDeclaration::getPropertyPriority(int /*propertyID*/) const
1453 // All computed styles have a priority of false (not "important").
1457 String CSSComputedStyleDeclaration::removeProperty(int /*propertyID*/, ExceptionCode& ec)
1459 ec = NO_MODIFICATION_ALLOWED_ERR;
1463 void CSSComputedStyleDeclaration::setProperty(int /*propertyID*/, const String& /*value*/, bool /*important*/, ExceptionCode& ec)
1465 ec = NO_MODIFICATION_ALLOWED_ERR;
1468 unsigned CSSComputedStyleDeclaration::length() const
1470 Node* node = m_node.get();
1474 RenderStyle* style = node->computedStyle();
1478 return numComputedProperties;
1481 String CSSComputedStyleDeclaration::item(unsigned i) const
1486 return getPropertyName(static_cast<CSSPropertyID>(computedProperties[i]));
1489 // This is the list of properties we want to copy in the copyInheritableProperties() function.
1490 // It is the intersection of the list of inherited CSS properties and the
1491 // properties for which we have a computed implementation in this file.
1492 static const int inheritableProperties[] = {
1493 CSSPropertyBorderCollapse,
1495 CSSPropertyFontFamily,
1496 CSSPropertyFontSize,
1497 CSSPropertyFontStyle,
1498 CSSPropertyFontVariant,
1499 CSSPropertyFontWeight,
1500 CSSPropertyLetterSpacing,
1501 CSSPropertyLineHeight,
1503 CSSPropertyTextAlign,
1504 CSSPropertyTextIndent,
1505 CSSPropertyTextTransform,
1506 CSSPropertyWhiteSpace,
1508 CSSPropertyWordSpacing,
1509 CSSPropertyWebkitBorderHorizontalSpacing,
1510 CSSPropertyWebkitBorderVerticalSpacing,
1511 CSSPropertyWebkitTextDecorationsInEffect,
1512 CSSPropertyWebkitTextFillColor,
1513 CSSPropertyWebkitTextSizeAdjust,
1514 CSSPropertyWebkitTextStrokeColor,
1515 CSSPropertyWebkitTextStrokeWidth,
1516 #ifdef ANDROID_CSS_TAP_HIGHLIGHT_COLOR
1517 CSSPropertyWebkitTapHighlightColor,
1521 static const unsigned numInheritableProperties = sizeof(inheritableProperties) / sizeof(inheritableProperties[0]);
1523 void CSSComputedStyleDeclaration::removeComputedInheritablePropertiesFrom(CSSMutableStyleDeclaration* declaration)
1525 declaration->removePropertiesInSet(inheritableProperties, numInheritableProperties);
1528 PassRefPtr<CSSMutableStyleDeclaration> CSSComputedStyleDeclaration::copyInheritableProperties() const
1530 RefPtr<CSSMutableStyleDeclaration> style = copyPropertiesInSet(inheritableProperties, numInheritableProperties);
1531 if (style && m_node && m_node->computedStyle()) {
1532 // If a node's text fill color is invalid, then its children use
1533 // their font-color as their text fill color (they don't
1534 // inherit it). Likewise for stroke color.
1535 ExceptionCode ec = 0;
1536 if (!m_node->computedStyle()->textFillColor().isValid())
1537 style->removeProperty(CSSPropertyWebkitTextFillColor, ec);
1538 if (!m_node->computedStyle()->textStrokeColor().isValid())
1539 style->removeProperty(CSSPropertyWebkitTextStrokeColor, ec);
1541 if (int keywordSize = m_node->computedStyle()->fontDescription().keywordSize())
1542 style->setProperty(CSSPropertyFontSize, cssIdentifierForFontSizeKeyword(keywordSize));
1544 return style.release();
1547 PassRefPtr<CSSMutableStyleDeclaration> CSSComputedStyleDeclaration::copy() const
1549 return copyPropertiesInSet(computedProperties, numComputedProperties);
1552 PassRefPtr<CSSMutableStyleDeclaration> CSSComputedStyleDeclaration::makeMutable()
1557 } // namespace WebCore