summaryrefslogtreecommitdiffstats
path: root/WebCore/css/CSSComputedStyleDeclaration.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/css/CSSComputedStyleDeclaration.cpp')
-rw-r--r--WebCore/css/CSSComputedStyleDeclaration.cpp1362
1 files changed, 1362 insertions, 0 deletions
diff --git a/WebCore/css/CSSComputedStyleDeclaration.cpp b/WebCore/css/CSSComputedStyleDeclaration.cpp
new file mode 100644
index 0000000..83d662a
--- /dev/null
+++ b/WebCore/css/CSSComputedStyleDeclaration.cpp
@@ -0,0 +1,1362 @@
+/*
+ * Copyright (C) 2004 Zack Rusin <zack@kde.org>
+ * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org>
+ * Copyright (C) 2007 Nicholas Shanks <webkit@nickshanks.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ */
+
+#include "config.h"
+#include "CSSComputedStyleDeclaration.h"
+
+#include "CSSBorderImageValue.h"
+#include "CSSMutableStyleDeclaration.h"
+#include "CSSPrimitiveValue.h"
+#include "CSSPrimitiveValueMappings.h"
+#include "CSSPropertyNames.h"
+#include "CSSReflectValue.h"
+#include "CSSTimingFunctionValue.h"
+#include "CSSValueList.h"
+#include "CachedImage.h"
+#include "Document.h"
+#include "ExceptionCode.h"
+#include "Pair.h"
+#include "Rect.h"
+#include "RenderObject.h"
+#include "ShadowValue.h"
+#ifdef ANDROID_LAYOUT
+#include "Frame.h"
+#include "Settings.h"
+#endif
+#include "WebKitCSSTransformValue.h"
+
+#if ENABLE(DASHBOARD_SUPPORT)
+#include "DashboardRegion.h"
+#endif
+
+namespace WebCore {
+
+// List of all properties we know how to compute, omitting shorthands.
+static const int computedProperties[] = {
+ CSSPropertyBackgroundAttachment,
+ CSSPropertyBackgroundColor,
+ CSSPropertyBackgroundImage,
+ // more specific background-position-x/y are non-standard
+ CSSPropertyBackgroundPosition,
+ CSSPropertyBackgroundRepeat,
+ CSSPropertyBorderBottomColor,
+ CSSPropertyBorderBottomStyle,
+ CSSPropertyBorderBottomWidth,
+ CSSPropertyBorderCollapse,
+ CSSPropertyBorderLeftColor,
+ CSSPropertyBorderLeftStyle,
+ CSSPropertyBorderLeftWidth,
+ CSSPropertyBorderRightColor,
+ CSSPropertyBorderRightStyle,
+ CSSPropertyBorderRightWidth,
+ CSSPropertyBorderTopColor,
+ CSSPropertyBorderTopStyle,
+ CSSPropertyBorderTopWidth,
+ CSSPropertyBottom,
+ CSSPropertyCaptionSide,
+ CSSPropertyClear,
+ CSSPropertyColor,
+ CSSPropertyCursor,
+ CSSPropertyDirection,
+ CSSPropertyDisplay,
+ CSSPropertyEmptyCells,
+ CSSPropertyFloat,
+ CSSPropertyFontFamily,
+ CSSPropertyFontSize,
+ CSSPropertyFontStyle,
+ CSSPropertyFontVariant,
+ CSSPropertyFontWeight,
+ CSSPropertyHeight,
+ CSSPropertyLeft,
+ CSSPropertyLetterSpacing,
+ CSSPropertyLineHeight,
+ CSSPropertyListStyleImage,
+ CSSPropertyListStylePosition,
+ CSSPropertyListStyleType,
+ CSSPropertyMarginBottom,
+ CSSPropertyMarginLeft,
+ CSSPropertyMarginRight,
+ CSSPropertyMarginTop,
+ CSSPropertyMaxHeight,
+ CSSPropertyMaxWidth,
+ CSSPropertyMinHeight,
+ CSSPropertyMinWidth,
+ CSSPropertyOpacity,
+ CSSPropertyOrphans,
+ CSSPropertyOutlineColor,
+ CSSPropertyOutlineStyle,
+ CSSPropertyOutlineWidth,
+ CSSPropertyOverflowX,
+ CSSPropertyOverflowY,
+ CSSPropertyPaddingBottom,
+ CSSPropertyPaddingLeft,
+ CSSPropertyPaddingRight,
+ CSSPropertyPaddingTop,
+ CSSPropertyPageBreakAfter,
+ CSSPropertyPageBreakBefore,
+ CSSPropertyPageBreakInside,
+ CSSPropertyPosition,
+ CSSPropertyResize,
+ CSSPropertyRight,
+ CSSPropertyTableLayout,
+ CSSPropertyTextAlign,
+ CSSPropertyTextDecoration,
+ CSSPropertyTextIndent,
+ CSSPropertyTextShadow,
+ CSSPropertyTextTransform,
+ CSSPropertyTop,
+ CSSPropertyUnicodeBidi,
+ CSSPropertyVerticalAlign,
+ CSSPropertyVisibility,
+ CSSPropertyWhiteSpace,
+ CSSPropertyWidows,
+ CSSPropertyWidth,
+ CSSPropertyWordSpacing,
+ CSSPropertyWordWrap,
+ CSSPropertyZIndex,
+ CSSPropertyZoom,
+
+ CSSPropertyWebkitAppearance,
+ CSSPropertyWebkitBackgroundClip,
+ CSSPropertyWebkitBackgroundComposite,
+ CSSPropertyWebkitBackgroundOrigin,
+ CSSPropertyWebkitBackgroundSize,
+ CSSPropertyWebkitBorderFit,
+ CSSPropertyWebkitBorderImage,
+ CSSPropertyWebkitBorderHorizontalSpacing,
+ CSSPropertyWebkitBorderVerticalSpacing,
+ CSSPropertyWebkitBoxAlign,
+ CSSPropertyWebkitBoxDirection,
+ CSSPropertyWebkitBoxFlex,
+ CSSPropertyWebkitBoxFlexGroup,
+ CSSPropertyWebkitBoxLines,
+ CSSPropertyWebkitBoxOrdinalGroup,
+ CSSPropertyWebkitBoxOrient,
+ CSSPropertyWebkitBoxPack,
+ CSSPropertyWebkitBoxReflect,
+ CSSPropertyWebkitBoxShadow,
+ CSSPropertyWebkitBoxSizing,
+ CSSPropertyWebkitColumnBreakAfter,
+ CSSPropertyWebkitColumnBreakBefore,
+ CSSPropertyWebkitColumnBreakInside,
+ CSSPropertyWebkitColumnCount,
+ CSSPropertyWebkitColumnGap,
+ CSSPropertyWebkitColumnRuleColor,
+ CSSPropertyWebkitColumnRuleStyle,
+ CSSPropertyWebkitColumnRuleWidth,
+ CSSPropertyWebkitColumnWidth,
+ CSSPropertyWebkitHighlight,
+ CSSPropertyWebkitLineBreak,
+ CSSPropertyWebkitLineClamp,
+ CSSPropertyWebkitMarginBottomCollapse,
+ CSSPropertyWebkitMarginTopCollapse,
+ CSSPropertyWebkitMarqueeDirection,
+ CSSPropertyWebkitMarqueeIncrement,
+ CSSPropertyWebkitMarqueeRepetition,
+ CSSPropertyWebkitMarqueeStyle,
+ CSSPropertyWebkitMaskAttachment,
+ CSSPropertyWebkitMaskBoxImage,
+ CSSPropertyWebkitMaskImage,
+ CSSPropertyWebkitMaskPosition,
+ CSSPropertyWebkitMaskRepeat,
+ CSSPropertyWebkitMaskClip,
+ CSSPropertyWebkitMaskComposite,
+ CSSPropertyWebkitMaskOrigin,
+ CSSPropertyWebkitMaskSize,
+ CSSPropertyWebkitNbspMode,
+ CSSPropertyWebkitRtlOrdering,
+ CSSPropertyWebkitTextDecorationsInEffect,
+ CSSPropertyWebkitTextFillColor,
+ CSSPropertyWebkitTextSecurity,
+ CSSPropertyWebkitTextStrokeColor,
+ CSSPropertyWebkitTextStrokeWidth,
+ CSSPropertyWebkitTransform,
+ CSSPropertyWebkitTransformOriginX,
+ CSSPropertyWebkitTransformOriginY,
+ CSSPropertyWebkitTransitionDelay,
+ CSSPropertyWebkitTransitionDuration,
+ CSSPropertyWebkitTransitionProperty,
+ CSSPropertyWebkitTransitionTimingFunction,
+ CSSPropertyWebkitUserDrag,
+ CSSPropertyWebkitUserModify,
+ CSSPropertyWebkitUserSelect,
+#if ENABLE(DASHBOARD_SUPPORT)
+ CSSPropertyWebkitDashboardRegion,
+#endif
+ CSSPropertyWebkitBorderBottomLeftRadius,
+ CSSPropertyWebkitBorderBottomRightRadius,
+ CSSPropertyWebkitBorderTopLeftRadius,
+ CSSPropertyWebkitBorderTopRightRadius
+
+#if ENABLE(SVG)
+ ,
+ CSSPropertyClipPath,
+ CSSPropertyClipRule,
+ CSSPropertyMask,
+ CSSPropertyFilter,
+ CSSPropertyFloodColor,
+ CSSPropertyFloodOpacity,
+ CSSPropertyLightingColor,
+ CSSPropertyStopColor,
+ CSSPropertyStopOpacity,
+ CSSPropertyPointerEvents,
+ CSSPropertyColorInterpolation,
+ CSSPropertyColorInterpolationFilters,
+ CSSPropertyColorRendering,
+ CSSPropertyFill,
+ CSSPropertyFillOpacity,
+ CSSPropertyFillRule,
+ CSSPropertyImageRendering,
+ CSSPropertyMarkerEnd,
+ CSSPropertyMarkerMid,
+ CSSPropertyMarkerStart,
+ CSSPropertyShapeRendering,
+ CSSPropertyStroke,
+ CSSPropertyStrokeDasharray,
+ CSSPropertyStrokeDashoffset,
+ CSSPropertyStrokeLinecap,
+ CSSPropertyStrokeLinejoin,
+ CSSPropertyStrokeMiterlimit,
+ CSSPropertyStrokeOpacity,
+ CSSPropertyStrokeWidth,
+ CSSPropertyTextRendering,
+ CSSPropertyAlignmentBaseline,
+ CSSPropertyBaselineShift,
+ CSSPropertyDominantBaseline,
+ CSSPropertyKerning,
+ CSSPropertyTextAnchor,
+ CSSPropertyWritingMode,
+ CSSPropertyGlyphOrientationHorizontal,
+ CSSPropertyGlyphOrientationVertical
+#endif
+#ifdef ANDROID_CSS_TAP_HIGHLIGHT_COLOR
+ ,
+ CSSPropertyWebkitTapHighlightColor
+#endif
+};
+
+const unsigned numComputedProperties = sizeof(computedProperties) / sizeof(computedProperties[0]);
+
+static PassRefPtr<CSSValue> valueForShadow(const ShadowData* shadow)
+{
+ if (!shadow)
+ return CSSPrimitiveValue::createIdentifier(CSSValueNone);
+
+ RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
+ for (const ShadowData* s = shadow; s; s = s->next) {
+ RefPtr<CSSPrimitiveValue> x = CSSPrimitiveValue::create(s->x, CSSPrimitiveValue::CSS_PX);
+ RefPtr<CSSPrimitiveValue> y = CSSPrimitiveValue::create(s->y, CSSPrimitiveValue::CSS_PX);
+ RefPtr<CSSPrimitiveValue> blur = CSSPrimitiveValue::create(s->blur, CSSPrimitiveValue::CSS_PX);
+ RefPtr<CSSPrimitiveValue> color = CSSPrimitiveValue::createColor(s->color.rgb());
+ list->prepend(ShadowValue::create(x.release(), y.release(), blur.release(), color.release()));
+ }
+ return list.release();
+}
+
+static int valueForRepeatRule(int rule)
+{
+ switch (rule) {
+ case RepeatImageRule:
+ return CSSValueRepeat;
+ case RoundImageRule:
+ return CSSValueRound;
+ default:
+ return CSSValueStretch;
+ }
+}
+
+static PassRefPtr<CSSValue> valueForNinePieceImage(const NinePieceImage& image)
+{
+ if (!image.hasImage())
+ return CSSPrimitiveValue::createIdentifier(CSSValueNone);
+
+ // Image first.
+ RefPtr<CSSValue> imageValue;
+ if (image.image())
+ imageValue = image.image()->cssValue();
+
+ // Create the slices.
+ RefPtr<CSSPrimitiveValue> top;
+ if (image.m_slices.top().isPercent())
+ top = CSSPrimitiveValue::create(image.m_slices.top().value(), CSSPrimitiveValue::CSS_PERCENTAGE);
+ else
+ top = CSSPrimitiveValue::create(image.m_slices.top().value(), CSSPrimitiveValue::CSS_NUMBER);
+
+ RefPtr<CSSPrimitiveValue> right;
+ if (image.m_slices.right().isPercent())
+ right = CSSPrimitiveValue::create(image.m_slices.right().value(), CSSPrimitiveValue::CSS_PERCENTAGE);
+ else
+ right = CSSPrimitiveValue::create(image.m_slices.right().value(), CSSPrimitiveValue::CSS_NUMBER);
+
+ RefPtr<CSSPrimitiveValue> bottom;
+ if (image.m_slices.bottom().isPercent())
+ bottom = CSSPrimitiveValue::create(image.m_slices.bottom().value(), CSSPrimitiveValue::CSS_PERCENTAGE);
+ else
+ bottom = CSSPrimitiveValue::create(image.m_slices.bottom().value(), CSSPrimitiveValue::CSS_NUMBER);
+
+ RefPtr<CSSPrimitiveValue> left;
+ if (image.m_slices.left().isPercent())
+ left = CSSPrimitiveValue::create(image.m_slices.left().value(), CSSPrimitiveValue::CSS_PERCENTAGE);
+ else
+ left = CSSPrimitiveValue::create(image.m_slices.left().value(), CSSPrimitiveValue::CSS_NUMBER);
+
+ RefPtr<Rect> rect = Rect::create();
+ rect->setTop(top);
+ rect->setRight(right);
+ rect->setBottom(bottom);
+ rect->setLeft(left);
+
+ return CSSBorderImageValue::create(imageValue, rect, valueForRepeatRule(image.m_horizontalRule), valueForRepeatRule(image.m_verticalRule));
+}
+
+static PassRefPtr<CSSValue> valueForReflection(const StyleReflection* reflection)
+{
+ if (!reflection)
+ return CSSPrimitiveValue::createIdentifier(CSSValueNone);
+
+ RefPtr<CSSPrimitiveValue> offset;
+ if (reflection->offset().isPercent())
+ offset = CSSPrimitiveValue::create(reflection->offset().percent(), CSSPrimitiveValue::CSS_PERCENTAGE);
+ else
+ offset = CSSPrimitiveValue::create(reflection->offset().value(), CSSPrimitiveValue::CSS_PX);
+
+ return CSSReflectValue::create(reflection->direction(), offset.release(), valueForNinePieceImage(reflection->mask()));
+}
+
+static PassRefPtr<CSSValue> getPositionOffsetValue(RenderStyle* style, int propertyID)
+{
+ if (!style)
+ return 0;
+
+ Length l;
+ switch (propertyID) {
+ case CSSPropertyLeft:
+ l = style->left();
+ break;
+ case CSSPropertyRight:
+ l = style->right();
+ break;
+ case CSSPropertyTop:
+ l = style->top();
+ break;
+ case CSSPropertyBottom:
+ l = style->bottom();
+ break;
+ default:
+ return 0;
+ }
+
+ if (style->position() == AbsolutePosition || style->position() == FixedPosition)
+ return CSSPrimitiveValue::create(l);
+
+ if (style->position() == RelativePosition)
+ // FIXME: It's not enough to simply return "auto" values for one offset if the other side is defined.
+ // In other words if left is auto and right is not auto, then left's computed value is negative right().
+ // So we should get the opposite length unit and see if it is auto.
+ return CSSPrimitiveValue::create(l);
+
+ return CSSPrimitiveValue::createIdentifier(CSSValueAuto);
+}
+
+static PassRefPtr<CSSPrimitiveValue> currentColorOrValidColor(RenderStyle* style, const Color& color)
+{
+ if (!color.isValid())
+ return CSSPrimitiveValue::createColor(style->color().rgb());
+ return CSSPrimitiveValue::createColor(color.rgb());
+}
+
+static PassRefPtr<CSSValue> getBorderRadiusCornerValue(IntSize radius)
+{
+ if (radius.width() == radius.height())
+ return CSSPrimitiveValue::create(radius.width(), CSSPrimitiveValue::CSS_PX);
+
+ RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
+ list->append(CSSPrimitiveValue::create(radius.width(), CSSPrimitiveValue::CSS_PX));
+ list->append(CSSPrimitiveValue::create(radius.height(), CSSPrimitiveValue::CSS_PX));
+ return list.release();
+}
+
+static IntRect sizingBox(RenderObject* renderer)
+{
+ return renderer->style()->boxSizing() == CONTENT_BOX ? renderer->contentBox() : renderer->borderBox();
+}
+
+static PassRefPtr<CSSValue> computedTransform(RenderObject* renderer)
+{
+ if (!renderer || renderer->style()->transform().operations().isEmpty())
+ return CSSPrimitiveValue::createIdentifier(CSSValueNone);
+
+ IntRect box = sizingBox(renderer);
+
+ AffineTransform transform;
+ renderer->style()->applyTransform(transform, box.size(), false);
+
+ RefPtr<WebKitCSSTransformValue> transformVal = WebKitCSSTransformValue::create(WebKitCSSTransformValue::MatrixTransformOperation);
+
+ transformVal->append(CSSPrimitiveValue::create(transform.a(), CSSPrimitiveValue::CSS_NUMBER));
+ transformVal->append(CSSPrimitiveValue::create(transform.b(), CSSPrimitiveValue::CSS_NUMBER));
+ transformVal->append(CSSPrimitiveValue::create(transform.c(), CSSPrimitiveValue::CSS_NUMBER));
+ transformVal->append(CSSPrimitiveValue::create(transform.d(), CSSPrimitiveValue::CSS_NUMBER));
+ transformVal->append(CSSPrimitiveValue::create(transform.e(), CSSPrimitiveValue::CSS_NUMBER));
+ transformVal->append(CSSPrimitiveValue::create(transform.f(), CSSPrimitiveValue::CSS_NUMBER));
+
+ RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
+ list->append(transformVal);
+
+ return list.release();
+}
+
+CSSComputedStyleDeclaration::CSSComputedStyleDeclaration(PassRefPtr<Node> n)
+ : m_node(n)
+{
+}
+
+CSSComputedStyleDeclaration::~CSSComputedStyleDeclaration()
+{
+}
+
+String CSSComputedStyleDeclaration::cssText() const
+{
+ String result("");
+
+ for (unsigned i = 0; i < numComputedProperties; i++) {
+ if (i)
+ result += " ";
+ result += getPropertyName(static_cast<CSSPropertyID>(computedProperties[i]));
+ result += ": ";
+ result += getPropertyValue(computedProperties[i]);
+ result += ";";
+ }
+
+ return result;
+}
+
+void CSSComputedStyleDeclaration::setCssText(const String&, ExceptionCode& ec)
+{
+ ec = NO_MODIFICATION_ALLOWED_ERR;
+}
+
+PassRefPtr<CSSValue> CSSComputedStyleDeclaration::getPropertyCSSValue(int propertyID) const
+{
+ return getPropertyCSSValue(propertyID, UpdateLayout);
+}
+
+PassRefPtr<CSSValue> CSSComputedStyleDeclaration::getPropertyCSSValue(int propertyID, EUpdateLayout updateLayout) const
+{
+ Node* node = m_node.get();
+ if (!node)
+ return 0;
+
+ // Make sure our layout is up to date before we allow a query on these attributes.
+ if (updateLayout)
+ node->document()->updateLayoutIgnorePendingStylesheets();
+
+ RenderObject* renderer = node->renderer();
+
+ RenderStyle* style = node->computedStyle();
+ if (!style)
+ return 0;
+
+#ifdef ANDROID_LAYOUT
+ const Settings * settings = node->document()->frame() ? node->document()->frame()->settings() : 0;
+#endif
+
+ switch (static_cast<CSSPropertyID>(propertyID)) {
+ case CSSPropertyInvalid:
+ break;
+
+ case CSSPropertyBackgroundColor:
+ return CSSPrimitiveValue::createColor(style->backgroundColor().rgb());
+ case CSSPropertyBackgroundImage:
+ if (style->backgroundImage())
+ return style->backgroundImage()->cssValue();
+ return CSSPrimitiveValue::createIdentifier(CSSValueNone);
+ case CSSPropertyWebkitBackgroundSize: {
+ RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
+ list->append(CSSPrimitiveValue::create(style->backgroundSize().width()));
+ list->append(CSSPrimitiveValue::create(style->backgroundSize().height()));
+ return list.release();
+ }
+ case CSSPropertyBackgroundRepeat:
+ return CSSPrimitiveValue::create(style->backgroundRepeat());
+ case CSSPropertyWebkitBackgroundComposite:
+ return CSSPrimitiveValue::create(style->backgroundComposite());
+ case CSSPropertyBackgroundAttachment:
+ if (style->backgroundAttachment())
+ return CSSPrimitiveValue::createIdentifier(CSSValueScroll);
+ return CSSPrimitiveValue::createIdentifier(CSSValueFixed);
+ case CSSPropertyWebkitBackgroundClip:
+ case CSSPropertyWebkitBackgroundOrigin: {
+ EFillBox box = (propertyID == CSSPropertyWebkitBackgroundClip ? style->backgroundClip() : style->backgroundOrigin());
+ return CSSPrimitiveValue::create(box);
+ }
+ case CSSPropertyBackgroundPosition: {
+ RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
+
+ list->append(CSSPrimitiveValue::create(style->backgroundXPosition()));
+ list->append(CSSPrimitiveValue::create(style->backgroundYPosition()));
+
+ return list.release();
+ }
+ case CSSPropertyBackgroundPositionX:
+ return CSSPrimitiveValue::create(style->backgroundXPosition());
+ case CSSPropertyBackgroundPositionY:
+ return CSSPrimitiveValue::create(style->backgroundYPosition());
+ case CSSPropertyBorderCollapse:
+ if (style->borderCollapse())
+ return CSSPrimitiveValue::createIdentifier(CSSValueCollapse);
+ return CSSPrimitiveValue::createIdentifier(CSSValueSeparate);
+ case CSSPropertyBorderSpacing: {
+ RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
+ list->append(CSSPrimitiveValue::create(style->horizontalBorderSpacing(), CSSPrimitiveValue::CSS_PX));
+ list->append(CSSPrimitiveValue::create(style->verticalBorderSpacing(), CSSPrimitiveValue::CSS_PX));
+ return list.release();
+ }
+ case CSSPropertyWebkitBorderHorizontalSpacing:
+ return CSSPrimitiveValue::create(style->horizontalBorderSpacing(), CSSPrimitiveValue::CSS_PX);
+ case CSSPropertyWebkitBorderVerticalSpacing:
+ return CSSPrimitiveValue::create(style->verticalBorderSpacing(), CSSPrimitiveValue::CSS_PX);
+ case CSSPropertyBorderTopColor:
+ return currentColorOrValidColor(style, style->borderTopColor());
+ case CSSPropertyBorderRightColor:
+ return currentColorOrValidColor(style, style->borderRightColor());
+ case CSSPropertyBorderBottomColor:
+ return currentColorOrValidColor(style, style->borderBottomColor());
+ case CSSPropertyBorderLeftColor:
+ return currentColorOrValidColor(style, style->borderLeftColor());
+ case CSSPropertyBorderTopStyle:
+ return CSSPrimitiveValue::create(style->borderTopStyle());
+ case CSSPropertyBorderRightStyle:
+ return CSSPrimitiveValue::create(style->borderRightStyle());
+ case CSSPropertyBorderBottomStyle:
+ return CSSPrimitiveValue::create(style->borderBottomStyle());
+ case CSSPropertyBorderLeftStyle:
+ return CSSPrimitiveValue::create(style->borderLeftStyle());
+ case CSSPropertyBorderTopWidth:
+ return CSSPrimitiveValue::create(style->borderTopWidth(), CSSPrimitiveValue::CSS_PX);
+ case CSSPropertyBorderRightWidth:
+ return CSSPrimitiveValue::create(style->borderRightWidth(), CSSPrimitiveValue::CSS_PX);
+ case CSSPropertyBorderBottomWidth:
+ return CSSPrimitiveValue::create(style->borderBottomWidth(), CSSPrimitiveValue::CSS_PX);
+ case CSSPropertyBorderLeftWidth:
+ return CSSPrimitiveValue::create(style->borderLeftWidth(), CSSPrimitiveValue::CSS_PX);
+ case CSSPropertyBottom:
+ return getPositionOffsetValue(style, CSSPropertyBottom);
+ case CSSPropertyWebkitBoxAlign:
+ return CSSPrimitiveValue::create(style->boxAlign());
+ case CSSPropertyWebkitBoxDirection:
+ return CSSPrimitiveValue::create(style->boxDirection());
+ case CSSPropertyWebkitBoxFlex:
+ return CSSPrimitiveValue::create(style->boxFlex(), CSSPrimitiveValue::CSS_NUMBER);
+ case CSSPropertyWebkitBoxFlexGroup:
+ return CSSPrimitiveValue::create(style->boxFlexGroup(), CSSPrimitiveValue::CSS_NUMBER);
+ case CSSPropertyWebkitBoxLines:
+ return CSSPrimitiveValue::create(style->boxLines());
+ case CSSPropertyWebkitBoxOrdinalGroup:
+ return CSSPrimitiveValue::create(style->boxOrdinalGroup(), CSSPrimitiveValue::CSS_NUMBER);
+ case CSSPropertyWebkitBoxOrient:
+ return CSSPrimitiveValue::create(style->boxOrient());
+ case CSSPropertyWebkitBoxPack: {
+ EBoxAlignment boxPack = style->boxPack();
+ ASSERT(boxPack != BSTRETCH);
+ ASSERT(boxPack != BBASELINE);
+ if (boxPack == BJUSTIFY || boxPack== BBASELINE)
+ return 0;
+ return CSSPrimitiveValue::create(boxPack);
+ }
+ case CSSPropertyWebkitBoxReflect:
+ return valueForReflection(style->boxReflect());
+ case CSSPropertyWebkitBoxShadow:
+ return valueForShadow(style->boxShadow());
+ case CSSPropertyCaptionSide:
+ return CSSPrimitiveValue::create(style->captionSide());
+ case CSSPropertyClear:
+ return CSSPrimitiveValue::create(style->clear());
+ case CSSPropertyColor:
+ return CSSPrimitiveValue::createColor(style->color().rgb());
+ case CSSPropertyWebkitColumnCount:
+ if (style->hasAutoColumnCount())
+ return CSSPrimitiveValue::createIdentifier(CSSValueAuto);
+ return CSSPrimitiveValue::create(style->columnCount(), CSSPrimitiveValue::CSS_NUMBER);
+ case CSSPropertyWebkitColumnGap:
+ if (style->hasNormalColumnGap())
+ return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
+ return CSSPrimitiveValue::create(style->columnGap(), CSSPrimitiveValue::CSS_NUMBER);
+ case CSSPropertyWebkitColumnRuleColor:
+ return currentColorOrValidColor(style, style->columnRuleColor());
+ case CSSPropertyWebkitColumnRuleStyle:
+ return CSSPrimitiveValue::create(style->columnRuleStyle());
+ case CSSPropertyWebkitColumnRuleWidth:
+ return CSSPrimitiveValue::create(style->columnRuleWidth(), CSSPrimitiveValue::CSS_PX);
+ case CSSPropertyWebkitColumnBreakAfter:
+ return CSSPrimitiveValue::create(style->columnBreakAfter());
+ case CSSPropertyWebkitColumnBreakBefore:
+ return CSSPrimitiveValue::create(style->columnBreakBefore());
+ case CSSPropertyWebkitColumnBreakInside:
+ return CSSPrimitiveValue::create(style->columnBreakInside());
+ case CSSPropertyWebkitColumnWidth:
+ if (style->hasAutoColumnWidth())
+ return CSSPrimitiveValue::createIdentifier(CSSValueAuto);
+ return CSSPrimitiveValue::create(style->columnWidth(), CSSPrimitiveValue::CSS_NUMBER);
+ case CSSPropertyCursor: {
+ RefPtr<CSSValueList> list;
+ CursorList* cursors = style->cursors();
+ if (cursors && cursors->size() > 0) {
+ list = CSSValueList::createCommaSeparated();
+ for (unsigned i = 0; i < cursors->size(); ++i)
+ list->append(CSSPrimitiveValue::create((*cursors)[i].cursorImage->url(), CSSPrimitiveValue::CSS_URI));
+ }
+ RefPtr<CSSValue> value = CSSPrimitiveValue::create(style->cursor());
+ if (list) {
+ list->append(value);
+ return list.release();
+ }
+ return value.release();
+ }
+ case CSSPropertyDirection:
+ return CSSPrimitiveValue::create(style->direction());
+ case CSSPropertyDisplay:
+ return CSSPrimitiveValue::create(style->display());
+ case CSSPropertyEmptyCells:
+ return CSSPrimitiveValue::create(style->emptyCells());
+ case CSSPropertyFloat:
+#ifdef ANDROID_LAYOUT
+ if (settings && settings->layoutAlgorithm() == Settings::kLayoutSSR)
+ return CSSPrimitiveValue::createIdentifier(CSSValueNone);
+#endif
+ return CSSPrimitiveValue::create(style->floating());
+ case CSSPropertyFontFamily:
+ // FIXME: This only returns the first family.
+ return CSSPrimitiveValue::create(style->fontDescription().family().family().string(), CSSPrimitiveValue::CSS_STRING);
+ case CSSPropertyFontSize:
+ return CSSPrimitiveValue::create(style->fontDescription().computedPixelSize(), CSSPrimitiveValue::CSS_PX);
+ case CSSPropertyWebkitBinding:
+ break;
+ case CSSPropertyFontStyle:
+ if (style->fontDescription().italic())
+ return CSSPrimitiveValue::createIdentifier(CSSValueItalic);
+ return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
+ case CSSPropertyFontVariant:
+ if (style->fontDescription().smallCaps())
+ return CSSPrimitiveValue::createIdentifier(CSSValueSmallCaps);
+ return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
+ case CSSPropertyFontWeight:
+ switch (style->fontDescription().weight()) {
+ case FontWeight100:
+ return CSSPrimitiveValue::createIdentifier(CSSValue100);
+ case FontWeight200:
+ return CSSPrimitiveValue::createIdentifier(CSSValue200);
+ case FontWeight300:
+ return CSSPrimitiveValue::createIdentifier(CSSValue300);
+ case FontWeightNormal:
+ return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
+ case FontWeight500:
+ return CSSPrimitiveValue::createIdentifier(CSSValue500);
+ case FontWeight600:
+ return CSSPrimitiveValue::createIdentifier(CSSValue600);
+ case FontWeightBold:
+ return CSSPrimitiveValue::createIdentifier(CSSValueBold);
+ case FontWeight800:
+ return CSSPrimitiveValue::createIdentifier(CSSValue800);
+ case FontWeight900:
+ return CSSPrimitiveValue::createIdentifier(CSSValue900);
+ }
+ ASSERT_NOT_REACHED();
+ return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
+ case CSSPropertyHeight:
+ if (renderer)
+ return CSSPrimitiveValue::create(sizingBox(renderer).height(), CSSPrimitiveValue::CSS_PX);
+ return CSSPrimitiveValue::create(style->height());
+ case CSSPropertyWebkitHighlight:
+ if (style->highlight() == nullAtom)
+ return CSSPrimitiveValue::createIdentifier(CSSValueNone);
+ return CSSPrimitiveValue::create(style->highlight(), CSSPrimitiveValue::CSS_STRING);
+ case CSSPropertyWebkitBorderFit:
+ if (style->borderFit() == BorderFitBorder)
+ return CSSPrimitiveValue::createIdentifier(CSSValueBorder);
+ return CSSPrimitiveValue::createIdentifier(CSSValueLines);
+ case CSSPropertyLeft:
+ return getPositionOffsetValue(style, CSSPropertyLeft);
+ case CSSPropertyLetterSpacing:
+ if (!style->letterSpacing())
+ return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
+ return CSSPrimitiveValue::create(style->letterSpacing(), CSSPrimitiveValue::CSS_PX);
+ case CSSPropertyWebkitLineClamp:
+ if (style->lineClamp() == -1)
+ return CSSPrimitiveValue::createIdentifier(CSSValueNone);
+ return CSSPrimitiveValue::create(style->lineClamp(), CSSPrimitiveValue::CSS_PERCENTAGE);
+ case CSSPropertyLineHeight: {
+ Length length = style->lineHeight();
+ if (length.isNegative())
+ return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
+ if (length.isPercent())
+ // This is imperfect, because it doesn't include the zoom factor and the real computation
+ // for how high to be in pixels does include things like minimum font size and the zoom factor.
+ // On the other hand, since font-size doesn't include the zoom factor, we really can't do
+ // that here either.
+ return CSSPrimitiveValue::create(static_cast<int>(length.percent() * style->fontDescription().specifiedSize()) / 100, CSSPrimitiveValue::CSS_PX);
+ return CSSPrimitiveValue::create(length.value(), CSSPrimitiveValue::CSS_PX);
+ }
+ case CSSPropertyListStyleImage:
+ if (style->listStyleImage())
+ return style->listStyleImage()->cssValue();
+ return CSSPrimitiveValue::createIdentifier(CSSValueNone);
+ case CSSPropertyListStylePosition:
+ return CSSPrimitiveValue::create(style->listStylePosition());
+ case CSSPropertyListStyleType:
+ return CSSPrimitiveValue::create(style->listStyleType());
+ case CSSPropertyMarginTop:
+ if (renderer)
+ // FIXME: Supposed to return the percentage if percentage was specified.
+ return CSSPrimitiveValue::create(renderer->marginTop(), CSSPrimitiveValue::CSS_PX);
+ return CSSPrimitiveValue::create(style->marginTop());
+ case CSSPropertyMarginRight:
+ if (renderer)
+ // FIXME: Supposed to return the percentage if percentage was specified.
+ return CSSPrimitiveValue::create(renderer->marginRight(), CSSPrimitiveValue::CSS_PX);
+ return CSSPrimitiveValue::create(style->marginRight());
+ case CSSPropertyMarginBottom:
+ if (renderer)
+ // FIXME: Supposed to return the percentage if percentage was specified.
+ return CSSPrimitiveValue::create(renderer->marginBottom(), CSSPrimitiveValue::CSS_PX);
+ return CSSPrimitiveValue::create(style->marginBottom());
+ case CSSPropertyMarginLeft:
+ if (renderer)
+ // FIXME: Supposed to return the percentage if percentage was specified.
+ return CSSPrimitiveValue::create(renderer->marginLeft(), CSSPrimitiveValue::CSS_PX);
+ return CSSPrimitiveValue::create(style->marginLeft());
+ case CSSPropertyWebkitMarqueeDirection:
+ return CSSPrimitiveValue::create(style->marqueeDirection());
+ case CSSPropertyWebkitMarqueeIncrement:
+ return CSSPrimitiveValue::create(style->marqueeIncrement());
+ case CSSPropertyWebkitMarqueeRepetition:
+ if (style->marqueeLoopCount() < 0)
+ return CSSPrimitiveValue::createIdentifier(CSSValueInfinite);
+ return CSSPrimitiveValue::create(style->marqueeLoopCount(), CSSPrimitiveValue::CSS_NUMBER);
+ case CSSPropertyWebkitMarqueeStyle:
+ return CSSPrimitiveValue::create(style->marqueeBehavior());
+ case CSSPropertyWebkitMaskImage:
+ if (style->maskImage())
+ return style->maskImage()->cssValue();
+ return CSSPrimitiveValue::createIdentifier(CSSValueNone);
+ case CSSPropertyWebkitMaskSize: {
+ RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
+ list->append(CSSPrimitiveValue::create(style->maskSize().width()));
+ list->append(CSSPrimitiveValue::create(style->maskSize().height()));
+ return list.release();
+ }
+ case CSSPropertyWebkitMaskRepeat:
+ return CSSPrimitiveValue::create(style->maskRepeat());
+ case CSSPropertyWebkitMaskAttachment:
+ if (style->maskAttachment())
+ return CSSPrimitiveValue::createIdentifier(CSSValueScroll);
+ return CSSPrimitiveValue::createIdentifier(CSSValueFixed);
+ case CSSPropertyWebkitMaskComposite:
+ return CSSPrimitiveValue::create(style->maskComposite());
+ case CSSPropertyWebkitMaskClip:
+ case CSSPropertyWebkitMaskOrigin: {
+ EFillBox box = (propertyID == CSSPropertyWebkitMaskClip ? style->maskClip() : style->maskOrigin());
+ return CSSPrimitiveValue::create(box);
+ }
+ case CSSPropertyWebkitMaskPosition: {
+ RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
+
+ list->append(CSSPrimitiveValue::create(style->maskXPosition()));
+ list->append(CSSPrimitiveValue::create(style->maskYPosition()));
+
+ return list.release();
+ }
+ case CSSPropertyWebkitMaskPositionX:
+ return CSSPrimitiveValue::create(style->maskXPosition());
+ case CSSPropertyWebkitMaskPositionY:
+ return CSSPrimitiveValue::create(style->maskYPosition());
+ case CSSPropertyWebkitUserModify:
+ return CSSPrimitiveValue::create(style->userModify());
+ case CSSPropertyMaxHeight: {
+ const Length& maxHeight = style->maxHeight();
+ if (maxHeight.isFixed() && maxHeight.value() == undefinedLength)
+ return CSSPrimitiveValue::createIdentifier(CSSValueNone);
+ return CSSPrimitiveValue::create(maxHeight);
+ }
+ case CSSPropertyMaxWidth: {
+ const Length& maxWidth = style->maxWidth();
+ if (maxWidth.isFixed() && maxWidth.value() == undefinedLength)
+ return CSSPrimitiveValue::createIdentifier(CSSValueNone);
+ return CSSPrimitiveValue::create(maxWidth);
+ }
+ case CSSPropertyMinHeight:
+ return CSSPrimitiveValue::create(style->minHeight());
+ case CSSPropertyMinWidth:
+ return CSSPrimitiveValue::create(style->minWidth());
+ case CSSPropertyOpacity:
+ return CSSPrimitiveValue::create(style->opacity(), CSSPrimitiveValue::CSS_NUMBER);
+ case CSSPropertyOrphans:
+ return CSSPrimitiveValue::create(style->orphans(), CSSPrimitiveValue::CSS_NUMBER);
+ case CSSPropertyOutlineColor:
+ return currentColorOrValidColor(style, style->outlineColor());
+ case CSSPropertyOutlineStyle:
+ if (style->outlineStyleIsAuto())
+ return CSSPrimitiveValue::createIdentifier(CSSValueAuto);
+ return CSSPrimitiveValue::create(style->outlineStyle());
+ case CSSPropertyOutlineWidth:
+ return CSSPrimitiveValue::create(style->outlineWidth(), CSSPrimitiveValue::CSS_PX);
+ case CSSPropertyOverflow:
+ return CSSPrimitiveValue::create(max(style->overflowX(), style->overflowY()));
+ case CSSPropertyOverflowX:
+ return CSSPrimitiveValue::create(style->overflowX());
+ case CSSPropertyOverflowY:
+#ifdef ANDROID_LAYOUT
+ if (settings && settings->layoutAlgorithm() == Settings::kLayoutSSR)
+ return CSSPrimitiveValue::createIdentifier(CSSValueVisible);
+#endif
+ return CSSPrimitiveValue::create(style->overflowY());
+ case CSSPropertyPaddingTop:
+ if (renderer)
+ return CSSPrimitiveValue::create(renderer->paddingTop(), CSSPrimitiveValue::CSS_PX);
+ return CSSPrimitiveValue::create(style->paddingTop());
+ case CSSPropertyPaddingRight:
+ if (renderer)
+ return CSSPrimitiveValue::create(renderer->paddingRight(), CSSPrimitiveValue::CSS_PX);
+ return CSSPrimitiveValue::create(style->paddingRight());
+ case CSSPropertyPaddingBottom:
+ if (renderer)
+ return CSSPrimitiveValue::create(renderer->paddingBottom(), CSSPrimitiveValue::CSS_PX);
+ return CSSPrimitiveValue::create(style->paddingBottom());
+ case CSSPropertyPaddingLeft:
+ if (renderer)
+ return CSSPrimitiveValue::create(renderer->paddingLeft(), CSSPrimitiveValue::CSS_PX);
+ return CSSPrimitiveValue::create(style->paddingLeft());
+ case CSSPropertyPageBreakAfter:
+ return CSSPrimitiveValue::create(style->pageBreakAfter());
+ case CSSPropertyPageBreakBefore:
+ return CSSPrimitiveValue::create(style->pageBreakBefore());
+ case CSSPropertyPageBreakInside: {
+ EPageBreak pageBreak = style->pageBreakInside();
+ ASSERT(pageBreak != PBALWAYS);
+ if (pageBreak == PBALWAYS)
+ return 0;
+ return CSSPrimitiveValue::create(style->pageBreakInside());
+ }
+ case CSSPropertyPosition:
+#ifdef ANDROID_LAYOUT
+ if (settings && settings->layoutAlgorithm() == Settings::kLayoutSSR)
+ return CSSPrimitiveValue::createIdentifier(CSSValueStatic);
+#endif
+ return CSSPrimitiveValue::create(style->position());
+ case CSSPropertyRight:
+ return getPositionOffsetValue(style, CSSPropertyRight);
+ case CSSPropertyTableLayout:
+ return CSSPrimitiveValue::create(style->tableLayout());
+ case CSSPropertyTextAlign:
+ return CSSPrimitiveValue::create(style->textAlign());
+ case CSSPropertyTextDecoration: {
+ String string;
+ if (style->textDecoration() & UNDERLINE)
+ string += "underline";
+ if (style->textDecoration() & OVERLINE) {
+ if (string.length())
+ string += " ";
+ string += "overline";
+ }
+ if (style->textDecoration() & LINE_THROUGH) {
+ if (string.length())
+ string += " ";
+ string += "line-through";
+ }
+ if (style->textDecoration() & BLINK) {
+ if (string.length())
+ string += " ";
+ string += "blink";
+ }
+ if (!string.length())
+ return CSSPrimitiveValue::createIdentifier(CSSValueNone);
+ return CSSPrimitiveValue::create(string, CSSPrimitiveValue::CSS_STRING);
+ }
+ case CSSPropertyWebkitTextDecorationsInEffect: {
+ String string;
+ if (style->textDecorationsInEffect() & UNDERLINE)
+ string += "underline";
+ if (style->textDecorationsInEffect() & OVERLINE) {
+ if (string.length())
+ string += " ";
+ string += "overline";
+ }
+ if (style->textDecorationsInEffect() & LINE_THROUGH) {
+ if (string.length())
+ string += " ";
+ string += "line-through";
+ }
+ if (style->textDecorationsInEffect() & BLINK) {
+ if (string.length())
+ string += " ";
+ string += "blink";
+ }
+ if (!string.length())
+ return CSSPrimitiveValue::createIdentifier(CSSValueNone);
+ return CSSPrimitiveValue::create(string, CSSPrimitiveValue::CSS_STRING);
+ }
+ case CSSPropertyWebkitTextFillColor:
+ return currentColorOrValidColor(style, style->textFillColor());
+ case CSSPropertyTextIndent:
+ return CSSPrimitiveValue::create(style->textIndent());
+ case CSSPropertyTextShadow:
+ return valueForShadow(style->textShadow());
+ case CSSPropertyWebkitTextSecurity:
+ return CSSPrimitiveValue::create(style->textSecurity());
+ case CSSPropertyWebkitTextSizeAdjust:
+ if (style->textSizeAdjust())
+ return CSSPrimitiveValue::createIdentifier(CSSValueAuto);
+ return CSSPrimitiveValue::createIdentifier(CSSValueNone);
+ case CSSPropertyWebkitTextStrokeColor:
+ return currentColorOrValidColor(style, style->textStrokeColor());
+ case CSSPropertyWebkitTextStrokeWidth:
+ return CSSPrimitiveValue::create(style->textStrokeWidth(), CSSPrimitiveValue::CSS_PX);
+ case CSSPropertyTextTransform:
+ return CSSPrimitiveValue::create(style->textTransform());
+ case CSSPropertyTop:
+ return getPositionOffsetValue(style, CSSPropertyTop);
+ case CSSPropertyUnicodeBidi:
+ return CSSPrimitiveValue::create(style->unicodeBidi());
+ case CSSPropertyVerticalAlign:
+ switch (style->verticalAlign()) {
+ case BASELINE:
+ return CSSPrimitiveValue::createIdentifier(CSSValueBaseline);
+ case MIDDLE:
+ return CSSPrimitiveValue::createIdentifier(CSSValueMiddle);
+ case SUB:
+ return CSSPrimitiveValue::createIdentifier(CSSValueSub);
+ case SUPER:
+ return CSSPrimitiveValue::createIdentifier(CSSValueSuper);
+ case TEXT_TOP:
+ return CSSPrimitiveValue::createIdentifier(CSSValueTextTop);
+ case TEXT_BOTTOM:
+ return CSSPrimitiveValue::createIdentifier(CSSValueTextBottom);
+ case TOP:
+ return CSSPrimitiveValue::createIdentifier(CSSValueTop);
+ case BOTTOM:
+ return CSSPrimitiveValue::createIdentifier(CSSValueBottom);
+ case BASELINE_MIDDLE:
+ return CSSPrimitiveValue::createIdentifier(CSSValueWebkitBaselineMiddle);
+ case LENGTH:
+ return CSSPrimitiveValue::create(style->verticalAlignLength());
+ }
+ ASSERT_NOT_REACHED();
+ return 0;
+ case CSSPropertyVisibility:
+#ifdef ANDROID_LAYOUT
+ if (settings && settings->layoutAlgorithm() == Settings::kLayoutSSR)
+ return CSSPrimitiveValue::createIdentifier(CSSValueVisible);
+#endif
+ return CSSPrimitiveValue::create(style->visibility());
+ case CSSPropertyWhiteSpace:
+#ifdef ANDROID_LAYOUT
+ if (settings && settings->layoutAlgorithm() == Settings::kLayoutSSR)
+ switch (style->whiteSpace()) {
+ case NORMAL:
+ case NOWRAP:
+ case KHTML_NOWRAP:
+ return CSSPrimitiveValue::createIdentifier(CSSValueNormal);
+ case PRE:
+ case PRE_WRAP:
+ return CSSPrimitiveValue::createIdentifier(CSSValuePreWrap);
+ case PRE_LINE:
+ return CSSPrimitiveValue::createIdentifier(CSSValuePreLine);
+ }
+ else
+#endif
+ return CSSPrimitiveValue::create(style->whiteSpace());
+ case CSSPropertyWidows:
+ return CSSPrimitiveValue::create(style->widows(), CSSPrimitiveValue::CSS_NUMBER);
+ case CSSPropertyWidth:
+ if (renderer)
+ return CSSPrimitiveValue::create(sizingBox(renderer).width(), CSSPrimitiveValue::CSS_PX);
+ return CSSPrimitiveValue::create(style->width());
+ case CSSPropertyWordBreak:
+ return CSSPrimitiveValue::create(style->wordBreak());
+ case CSSPropertyWordSpacing:
+ return CSSPrimitiveValue::create(style->wordSpacing(), CSSPrimitiveValue::CSS_PX);
+ case CSSPropertyWordWrap:
+ return CSSPrimitiveValue::create(style->wordWrap());
+ case CSSPropertyWebkitLineBreak:
+ return CSSPrimitiveValue::create(style->khtmlLineBreak());
+ case CSSPropertyWebkitNbspMode:
+ return CSSPrimitiveValue::create(style->nbspMode());
+ case CSSPropertyWebkitMatchNearestMailBlockquoteColor:
+ return CSSPrimitiveValue::create(style->matchNearestMailBlockquoteColor());
+ case CSSPropertyResize:
+ return CSSPrimitiveValue::create(style->resize());
+ case CSSPropertyZIndex:
+ if (style->hasAutoZIndex())
+ return CSSPrimitiveValue::createIdentifier(CSSValueAuto);
+ return CSSPrimitiveValue::create(style->zIndex(), CSSPrimitiveValue::CSS_NUMBER);
+ case CSSPropertyZoom:
+ return CSSPrimitiveValue::create(style->zoom(), CSSPrimitiveValue::CSS_NUMBER);
+ case CSSPropertyWebkitBoxSizing:
+ if (style->boxSizing() == CONTENT_BOX)
+ return CSSPrimitiveValue::createIdentifier(CSSValueContentBox);
+ return CSSPrimitiveValue::createIdentifier(CSSValueBorderBox);
+#if ENABLE(DASHBOARD_SUPPORT)
+ case CSSPropertyWebkitDashboardRegion:
+ {
+ const Vector<StyleDashboardRegion>& regions = style->dashboardRegions();
+ unsigned count = regions.size();
+ if (count == 1 && regions[0].type == StyleDashboardRegion::None)
+ return CSSPrimitiveValue::createIdentifier(CSSValueNone);
+
+ RefPtr<DashboardRegion> firstRegion;
+ DashboardRegion* previousRegion = 0;
+ for (unsigned i = 0; i < count; i++) {
+ RefPtr<DashboardRegion> region = DashboardRegion::create();
+ StyleDashboardRegion styleRegion = regions[i];
+
+ region->m_label = styleRegion.label;
+ LengthBox offset = styleRegion.offset;
+ region->setTop(CSSPrimitiveValue::create(offset.top().value(), CSSPrimitiveValue::CSS_PX));
+ region->setRight(CSSPrimitiveValue::create(offset.right().value(), CSSPrimitiveValue::CSS_PX));
+ region->setBottom(CSSPrimitiveValue::create(offset.bottom().value(), CSSPrimitiveValue::CSS_PX));
+ region->setLeft(CSSPrimitiveValue::create(offset.left().value(), CSSPrimitiveValue::CSS_PX));
+ region->m_isRectangle = (styleRegion.type == StyleDashboardRegion::Rectangle);
+ region->m_isCircle = (styleRegion.type == StyleDashboardRegion::Circle);
+
+ if (previousRegion)
+ previousRegion->m_next = region;
+ else
+ firstRegion = region;
+ previousRegion = region.get();
+ }
+ return CSSPrimitiveValue::create(firstRegion.release());
+ }
+#endif
+ case CSSPropertyWebkitAppearance:
+ return CSSPrimitiveValue::create(style->appearance());
+ case CSSPropertyWebkitBorderImage:
+ return valueForNinePieceImage(style->borderImage());
+ case CSSPropertyWebkitMaskBoxImage:
+ return valueForNinePieceImage(style->maskBoxImage());
+ case CSSPropertyWebkitFontSizeDelta:
+ // Not a real style property -- used by the editing engine -- so has no computed value.
+ break;
+ case CSSPropertyWebkitMarginBottomCollapse:
+ return CSSPrimitiveValue::create(style->marginBottomCollapse());
+ case CSSPropertyWebkitMarginTopCollapse:
+ return CSSPrimitiveValue::create(style->marginTopCollapse());
+ case CSSPropertyWebkitRtlOrdering:
+ if (style->visuallyOrdered())
+ return CSSPrimitiveValue::createIdentifier(CSSValueVisual);
+ return CSSPrimitiveValue::createIdentifier(CSSValueLogical);
+ case CSSPropertyWebkitUserDrag:
+ return CSSPrimitiveValue::create(style->userDrag());
+ case CSSPropertyWebkitUserSelect:
+ return CSSPrimitiveValue::create(style->userSelect());
+ case CSSPropertyWebkitBorderBottomLeftRadius:
+ return getBorderRadiusCornerValue(style->borderBottomLeftRadius());
+ case CSSPropertyWebkitBorderBottomRightRadius:
+ return getBorderRadiusCornerValue(style->borderBottomRightRadius());
+ case CSSPropertyWebkitBorderTopLeftRadius:
+ return getBorderRadiusCornerValue(style->borderTopLeftRadius());
+ case CSSPropertyWebkitBorderTopRightRadius:
+ return getBorderRadiusCornerValue(style->borderTopRightRadius());
+ case CSSPropertyClip:
+ {
+ if (style->hasClip()) {
+ RefPtr<Rect> rect = Rect::create();
+ rect->setTop(CSSPrimitiveValue::create(style->clip().top().value(), CSSPrimitiveValue::CSS_PX));
+ rect->setRight(CSSPrimitiveValue::create(style->clip().right().value(), CSSPrimitiveValue::CSS_PX));
+ rect->setBottom(CSSPrimitiveValue::create(style->clip().bottom().value(), CSSPrimitiveValue::CSS_PX));
+ rect->setLeft(CSSPrimitiveValue::create(style->clip().left().value(), CSSPrimitiveValue::CSS_PX));
+ return CSSPrimitiveValue::create(rect.release());
+ }
+ return 0;
+ }
+ case CSSPropertyWebkitTransform:
+ return computedTransform(renderer);
+ case CSSPropertyWebkitTransformOriginX:
+ if (renderer) {
+ IntRect box = sizingBox(renderer);
+ return CSSPrimitiveValue::create(style->transformOriginX().calcMinValue(box.width()), CSSPrimitiveValue::CSS_PX);
+ }
+ else
+ return CSSPrimitiveValue::create(style->transformOriginX());
+ case CSSPropertyWebkitTransformOriginY:
+ if (renderer) {
+ IntRect box = sizingBox(renderer);
+ return CSSPrimitiveValue::create(style->transformOriginY().calcMinValue(box.height()), CSSPrimitiveValue::CSS_PX);
+ }
+ else
+ return CSSPrimitiveValue::create(style->transformOriginY());
+ case CSSPropertyWebkitTransitionDelay: {
+ RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
+ const AnimationList* t = style->transitions();
+ if (t) {
+ for (size_t i = 0; i < t->size(); ++i)
+ list->append(CSSPrimitiveValue::create(t->animation(i)->delay(), CSSPrimitiveValue::CSS_S));
+ }
+ else
+ list->append(CSSPrimitiveValue::create(RenderStyle::initialAnimationDelay(), CSSPrimitiveValue::CSS_S));
+ return list.release();
+ }
+ case CSSPropertyWebkitTransitionDuration: {
+ RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
+ const AnimationList* t = style->transitions();
+ if (t) {
+ for (size_t i = 0; i < t->size(); ++i)
+ list->append(CSSPrimitiveValue::create(t->animation(i)->duration(), CSSPrimitiveValue::CSS_S));
+ }
+ else
+ list->append(CSSPrimitiveValue::create(RenderStyle::initialAnimationDuration(), CSSPrimitiveValue::CSS_S));
+ return list.release();
+ }
+ case CSSPropertyWebkitTransitionTimingFunction: {
+ RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
+ const AnimationList* t = style->transitions();
+ if (t) {
+ for (size_t i = 0; i < t->size(); ++i) {
+ const TimingFunction& tf = t->animation(i)->timingFunction();
+ list->append(CSSTimingFunctionValue::create(tf.x1(), tf.y1(), tf.x2(), tf.y2()));
+ }
+ }
+ else {
+ const TimingFunction& tf = RenderStyle::initialAnimationTimingFunction();
+ list->append(CSSTimingFunctionValue::create(tf.x1(), tf.y1(), tf.x2(), tf.y2()));
+ }
+ return list.release();
+ }
+ case CSSPropertyWebkitTransitionProperty: {
+ RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
+ const AnimationList* t = style->transitions();
+ if (t) {
+ for (size_t i = 0; i < t->size(); ++i) {
+ int prop = t->animation(i)->property();
+ const char* name;
+ if (prop == cAnimateNone)
+ name = "none";
+ else if (prop == cAnimateAll)
+ name = "all";
+ else
+ name = getPropertyName(static_cast<CSSPropertyID>(prop));
+ list->append(CSSPrimitiveValue::create(name, CSSPrimitiveValue::CSS_STRING));
+ }
+ }
+ else
+ list->append(CSSPrimitiveValue::create("all", CSSPrimitiveValue::CSS_STRING));
+ return list.release();
+ }
+ case CSSPropertyBackground:
+ case CSSPropertyBorder:
+ case CSSPropertyBorderBottom:
+ case CSSPropertyBorderColor:
+ case CSSPropertyBorderLeft:
+ case CSSPropertyBorderRight:
+ case CSSPropertyBorderStyle:
+ case CSSPropertyBorderTop:
+ case CSSPropertyBorderWidth:
+ case CSSPropertyContent:
+ case CSSPropertyCounterIncrement:
+ case CSSPropertyCounterReset:
+ case CSSPropertyFont:
+ case CSSPropertyFontStretch:
+ case CSSPropertyListStyle:
+ case CSSPropertyMargin:
+ case CSSPropertyOutline:
+ case CSSPropertyOutlineOffset:
+ case CSSPropertyPadding:
+ case CSSPropertyPage:
+ case CSSPropertyQuotes:
+ case CSSPropertyScrollbar3dlightColor:
+ case CSSPropertyScrollbarArrowColor:
+ case CSSPropertyScrollbarDarkshadowColor:
+ case CSSPropertyScrollbarFaceColor:
+ case CSSPropertyScrollbarHighlightColor:
+ case CSSPropertyScrollbarShadowColor:
+ case CSSPropertyScrollbarTrackColor:
+ case CSSPropertySrc: // Only used in @font-face rules.
+ case CSSPropertySize:
+ case CSSPropertyTextLineThrough:
+ case CSSPropertyTextLineThroughColor:
+ case CSSPropertyTextLineThroughMode:
+ case CSSPropertyTextLineThroughStyle:
+ case CSSPropertyTextLineThroughWidth:
+ case CSSPropertyTextOverflow:
+ case CSSPropertyTextOverline:
+ case CSSPropertyTextOverlineColor:
+ case CSSPropertyTextOverlineMode:
+ case CSSPropertyTextOverlineStyle:
+ case CSSPropertyTextOverlineWidth:
+ case CSSPropertyTextUnderline:
+ case CSSPropertyTextUnderlineColor:
+ case CSSPropertyTextUnderlineMode:
+ case CSSPropertyTextUnderlineStyle:
+ case CSSPropertyTextUnderlineWidth:
+ case CSSPropertyUnicodeRange: // Only used in @font-face rules.
+ case CSSPropertyWebkitAnimation:
+ case CSSPropertyWebkitAnimationDelay:
+ case CSSPropertyWebkitAnimationDirection:
+ case CSSPropertyWebkitAnimationDuration:
+ case CSSPropertyWebkitAnimationIterationCount:
+ case CSSPropertyWebkitAnimationName:
+ case CSSPropertyWebkitAnimationPlayState:
+ case CSSPropertyWebkitAnimationTimingFunction:
+ case CSSPropertyWebkitBorderRadius:
+ case CSSPropertyWebkitColumns:
+ case CSSPropertyWebkitColumnRule:
+ case CSSPropertyWebkitMarginCollapse:
+ case CSSPropertyWebkitMarginStart:
+ case CSSPropertyWebkitMarquee:
+ case CSSPropertyWebkitMarqueeSpeed:
+ case CSSPropertyWebkitMask:
+ case CSSPropertyWebkitPaddingStart:
+ case CSSPropertyWebkitTextStroke:
+ case CSSPropertyWebkitTransformOrigin:
+ case CSSPropertyWebkitTransition:
+ case CSSPropertyWebkitVariableDeclarationBlock:
+ // FIXME: The above are unimplemented.
+ break;
+#ifdef ANDROID_CSS_TAP_HIGHLIGHT_COLOR
+ case CSSPropertyWebkitTapHighlightColor:
+ return CSSPrimitiveValue::createColor(style->tapHighlightColor().rgb());
+#endif
+#if ENABLE(SVG)
+ // FIXME: This default case ruins the point of using an enum for
+ // properties -- it prevents us from getting a warning when we
+ // forget to list a property above.
+ default:
+ return getSVGPropertyCSSValue(propertyID, DoNotUpdateLayout);
+#endif
+ }
+
+ LOG_ERROR("unimplemented propertyID: %d", propertyID);
+ return 0;
+}
+
+String CSSComputedStyleDeclaration::getPropertyValue(int propertyID) const
+{
+ RefPtr<CSSValue> value = getPropertyCSSValue(propertyID);
+ if (value)
+ return value->cssText();
+ return "";
+}
+
+bool CSSComputedStyleDeclaration::getPropertyPriority(int /*propertyID*/) const
+{
+ // All computed styles have a priority of false (not "important").
+ return false;
+}
+
+String CSSComputedStyleDeclaration::removeProperty(int /*propertyID*/, ExceptionCode& ec)
+{
+ ec = NO_MODIFICATION_ALLOWED_ERR;
+ return String();
+}
+
+void CSSComputedStyleDeclaration::setProperty(int /*propertyID*/, const String& /*value*/, bool /*important*/, ExceptionCode& ec)
+{
+ ec = NO_MODIFICATION_ALLOWED_ERR;
+}
+
+unsigned CSSComputedStyleDeclaration::length() const
+{
+ Node* node = m_node.get();
+ if (!node)
+ return 0;
+
+ RenderStyle* style = node->computedStyle();
+ if (!style)
+ return 0;
+
+ return numComputedProperties;
+}
+
+String CSSComputedStyleDeclaration::item(unsigned i) const
+{
+ if (i >= length())
+ return String();
+
+ return getPropertyName(static_cast<CSSPropertyID>(computedProperties[i]));
+}
+
+// This is the list of properties we want to copy in the copyInheritableProperties() function.
+// It is the intersection of the list of inherited CSS properties and the
+// properties for which we have a computed implementation in this file.
+const int inheritableProperties[] = {
+ CSSPropertyBorderCollapse,
+ CSSPropertyColor,
+ CSSPropertyFontFamily,
+ CSSPropertyFontSize,
+ CSSPropertyFontStyle,
+ CSSPropertyFontVariant,
+ CSSPropertyFontWeight,
+ CSSPropertyLetterSpacing,
+ CSSPropertyLineHeight,
+ CSSPropertyOrphans,
+ CSSPropertyTextAlign,
+ CSSPropertyTextIndent,
+ CSSPropertyTextTransform,
+ CSSPropertyWhiteSpace,
+ CSSPropertyWidows,
+ CSSPropertyWordSpacing,
+ CSSPropertyWebkitBorderHorizontalSpacing,
+ CSSPropertyWebkitBorderVerticalSpacing,
+ CSSPropertyWebkitTextDecorationsInEffect,
+ CSSPropertyWebkitTextFillColor,
+ CSSPropertyWebkitTextSizeAdjust,
+ CSSPropertyWebkitTextStrokeColor,
+ CSSPropertyWebkitTextStrokeWidth,
+#ifdef ANDROID_CSS_TAP_HIGHLIGHT_COLOR
+ CSSPropertyWebkitTapHighlightColor,
+#endif
+};
+
+const unsigned numInheritableProperties = sizeof(inheritableProperties) / sizeof(inheritableProperties[0]);
+
+void CSSComputedStyleDeclaration::removeComputedInheritablePropertiesFrom(CSSMutableStyleDeclaration* declaration)
+{
+ declaration->removePropertiesInSet(inheritableProperties, numInheritableProperties);
+}
+
+PassRefPtr<CSSMutableStyleDeclaration> CSSComputedStyleDeclaration::copyInheritableProperties() const
+{
+ RefPtr<CSSMutableStyleDeclaration> style = copyPropertiesInSet(inheritableProperties, numInheritableProperties);
+ if (style && m_node && m_node->computedStyle()) {
+ // If a node's text fill color is invalid, then its children use
+ // their font-color as their text fill color (they don't
+ // inherit it). Likewise for stroke color.
+ ExceptionCode ec = 0;
+ if (!m_node->computedStyle()->textFillColor().isValid())
+ style->removeProperty(CSSPropertyWebkitTextFillColor, ec);
+ if (!m_node->computedStyle()->textStrokeColor().isValid())
+ style->removeProperty(CSSPropertyWebkitTextStrokeColor, ec);
+ ASSERT(ec == 0);
+ }
+ return style.release();
+}
+
+PassRefPtr<CSSMutableStyleDeclaration> CSSComputedStyleDeclaration::copy() const
+{
+ return copyPropertiesInSet(computedProperties, numComputedProperties);
+}
+
+PassRefPtr<CSSMutableStyleDeclaration> CSSComputedStyleDeclaration::makeMutable()
+{
+ return copy();
+}
+
+} // namespace WebCore