File indexing completed on 2024-04-28 15:22:40

0001 /**
0002  * css_renderstyledeclarationimpl.cpp
0003  *
0004  * Copyright 2004  Zack Rusin <zack@kde.org>
0005  * Copyright 2004,2005 Apple Computer, Inc.
0006  *
0007  * This library is free software; you can redistribute it and/or
0008  * modify it under the terms of the GNU Lesser General Public
0009  * License as published by the Free Software Foundation; either
0010  * version 2 of the License, or (at your option) any later version.
0011  *
0012  * This library is distributed in the hope that it will be useful,
0013  * but WITHOUT ANY WARRANTY; without even the implied warranty of
0014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0015  * Lesser General Public License for more details.
0016  *
0017  * You should have received a copy of the GNU Lesser General Public
0018  * License along with this library; if not, write to the Free Software
0019  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
0020  * 02110-1301  USA
0021  */
0022 #include "css_renderstyledeclarationimpl.h"
0023 
0024 #include "rendering/render_object.h"
0025 
0026 #include "cssproperties.h"
0027 #include "cssvalues.h"
0028 
0029 #include <dom/dom_exception.h>
0030 
0031 using namespace DOM;
0032 using namespace khtml;
0033 
0034 // List of all properties we know how to compute, omitting shorthands.
0035 static const int computedProperties[] = {
0036     CSS_PROP_BACKGROUND_COLOR,
0037     CSS_PROP_BACKGROUND_CLIP,
0038     CSS_PROP_BACKGROUND_IMAGE,
0039     CSS_PROP_BACKGROUND_REPEAT,
0040     CSS_PROP_BACKGROUND_ATTACHMENT,
0041     CSS_PROP_BACKGROUND_ORIGIN,
0042     CSS_PROP_BACKGROUND_POSITION,
0043     CSS_PROP_BACKGROUND_POSITION_X,
0044     CSS_PROP_BACKGROUND_POSITION_Y,
0045     CSS_PROP_BACKGROUND_SIZE,
0046     CSS_PROP_BORDER_COLLAPSE,
0047     CSS_PROP_BORDER_SPACING,
0048     CSS_PROP__KHTML_BORDER_HORIZONTAL_SPACING,
0049     CSS_PROP__KHTML_BORDER_VERTICAL_SPACING,
0050     CSS_PROP_BORDER_TOP_RIGHT_RADIUS,
0051     CSS_PROP_BORDER_BOTTOM_RIGHT_RADIUS,
0052     CSS_PROP_BORDER_BOTTOM_LEFT_RADIUS,
0053     CSS_PROP_BORDER_TOP_LEFT_RADIUS,
0054     CSS_PROP_BORDER_TOP_COLOR,
0055     CSS_PROP_BORDER_RIGHT_COLOR,
0056     CSS_PROP_BORDER_BOTTOM_COLOR,
0057     CSS_PROP_BORDER_LEFT_COLOR,
0058     CSS_PROP_BORDER_TOP_STYLE,
0059     CSS_PROP_BORDER_RIGHT_STYLE,
0060     CSS_PROP_BORDER_BOTTOM_STYLE,
0061     CSS_PROP_BORDER_LEFT_STYLE,
0062     CSS_PROP_BORDER_TOP_WIDTH,
0063     CSS_PROP_BORDER_RIGHT_WIDTH,
0064     CSS_PROP_BORDER_BOTTOM_WIDTH,
0065     CSS_PROP_BORDER_LEFT_WIDTH,
0066     CSS_PROP_BOTTOM,
0067     CSS_PROP_BOX_SIZING,
0068     CSS_PROP_CAPTION_SIDE,
0069     CSS_PROP_CLEAR,
0070     CSS_PROP_COLOR,
0071     CSS_PROP_CURSOR,
0072     CSS_PROP_DIRECTION,
0073     CSS_PROP_DISPLAY,
0074     CSS_PROP_EMPTY_CELLS,
0075     CSS_PROP_FLOAT,
0076     CSS_PROP_FONT_FAMILY,
0077     CSS_PROP_FONT_SIZE,
0078     CSS_PROP_FONT_STYLE,
0079     CSS_PROP_FONT_VARIANT,
0080     CSS_PROP_FONT_WEIGHT,
0081     CSS_PROP_HEIGHT,
0082     CSS_PROP_LEFT,
0083     CSS_PROP_LETTER_SPACING,
0084     CSS_PROP_LINE_HEIGHT,
0085     CSS_PROP_LIST_STYLE_IMAGE,
0086     CSS_PROP_LIST_STYLE_POSITION,
0087     CSS_PROP_LIST_STYLE_TYPE,
0088     CSS_PROP_MARGIN_TOP,
0089     CSS_PROP_MARGIN_RIGHT,
0090     CSS_PROP_MARGIN_BOTTOM,
0091     CSS_PROP_MARGIN_LEFT,
0092     CSS_PROP__KHTML_MARQUEE_DIRECTION,
0093     CSS_PROP__KHTML_MARQUEE_INCREMENT,
0094     CSS_PROP__KHTML_MARQUEE_REPETITION,
0095     CSS_PROP__KHTML_MARQUEE_STYLE,
0096     CSS_PROP_MAX_HEIGHT,
0097     CSS_PROP_MAX_WIDTH,
0098     CSS_PROP_MIN_HEIGHT,
0099     CSS_PROP_MIN_WIDTH,
0100     CSS_PROP_OPACITY,
0101     CSS_PROP_ORPHANS,
0102     CSS_PROP_OUTLINE_STYLE,
0103     CSS_PROP_OVERFLOW,
0104     CSS_PROP_OVERFLOW_X,
0105     CSS_PROP_OVERFLOW_Y,
0106     CSS_PROP_PADDING_TOP,
0107     CSS_PROP_PADDING_RIGHT,
0108     CSS_PROP_PADDING_BOTTOM,
0109     CSS_PROP_PADDING_LEFT,
0110     CSS_PROP_PAGE_BREAK_AFTER,
0111     CSS_PROP_PAGE_BREAK_BEFORE,
0112     CSS_PROP_PAGE_BREAK_INSIDE,
0113     CSS_PROP_POSITION,
0114     CSS_PROP_RIGHT,
0115     CSS_PROP_TABLE_LAYOUT,
0116     CSS_PROP_TEXT_ALIGN,
0117     CSS_PROP_TEXT_DECORATION,
0118     CSS_PROP_TEXT_INDENT,
0119     CSS_PROP_TEXT_OVERFLOW,
0120     CSS_PROP_TEXT_SHADOW,
0121     CSS_PROP_TEXT_TRANSFORM,
0122     CSS_PROP_TOP,
0123     CSS_PROP_UNICODE_BIDI,
0124     CSS_PROP_VERTICAL_ALIGN,
0125     CSS_PROP_VISIBILITY,
0126     CSS_PROP_WHITE_SPACE,
0127     CSS_PROP_WIDOWS,
0128     CSS_PROP_WIDTH,
0129     CSS_PROP_WORD_SPACING,
0130     CSS_PROP_Z_INDEX
0131 };
0132 
0133 const unsigned numComputedProperties = sizeof(computedProperties) / sizeof(computedProperties[0]);
0134 
0135 static CSSPrimitiveValueImpl *valueForLength(const Length &length, int max)
0136 {
0137     if (length.isPercent()) {
0138         return new CSSPrimitiveValueImpl(length.percent(), CSSPrimitiveValue::CSS_PERCENTAGE);
0139     } else {
0140         return new CSSPrimitiveValueImpl(length.minWidth(max), CSSPrimitiveValue::CSS_PX);
0141     }
0142 }
0143 
0144 static CSSPrimitiveValueImpl *valueForLength2(const Length &length)
0145 {
0146     if (length.isPercent()) {
0147         return new CSSPrimitiveValueImpl(length.percent(), CSSPrimitiveValue::CSS_PERCENTAGE);
0148     } else {
0149         return new CSSPrimitiveValueImpl(length.value(), CSSPrimitiveValue::CSS_PX);
0150     }
0151 }
0152 
0153 static CSSValueImpl *valueForBorderStyle(EBorderStyle style)
0154 {
0155     switch (style) {
0156     case khtml::BNATIVE:
0157         return new CSSPrimitiveValueImpl(CSS_VAL__KHTML_NATIVE);
0158     case khtml::BNONE:
0159         return new CSSPrimitiveValueImpl(CSS_VAL_NONE);
0160     case khtml::BHIDDEN:
0161         return new CSSPrimitiveValueImpl(CSS_VAL_HIDDEN);
0162     case khtml::INSET:
0163         return new CSSPrimitiveValueImpl(CSS_VAL_INSET);
0164     case khtml::GROOVE:
0165         return new CSSPrimitiveValueImpl(CSS_VAL_GROOVE);
0166     case khtml::RIDGE:
0167         return new CSSPrimitiveValueImpl(CSS_VAL_RIDGE);
0168     case khtml::OUTSET:
0169         return new CSSPrimitiveValueImpl(CSS_VAL_OUTSET);
0170     case khtml::DOTTED:
0171         return new CSSPrimitiveValueImpl(CSS_VAL_DOTTED);
0172     case khtml::DASHED:
0173         return new CSSPrimitiveValueImpl(CSS_VAL_DASHED);
0174     case khtml::SOLID:
0175         return new CSSPrimitiveValueImpl(CSS_VAL_SOLID);
0176     case khtml::DOUBLE:
0177         return new CSSPrimitiveValueImpl(CSS_VAL_DOUBLE);
0178     }
0179     Q_ASSERT(0);
0180     return nullptr;
0181 }
0182 
0183 static CSSValueImpl *valueForBorderRadii(BorderRadii radii)
0184 {
0185     CSSPrimitiveValueImpl *h = valueForLength2(radii.horizontal);
0186     CSSPrimitiveValueImpl *v = valueForLength2(radii.vertical);
0187     return new CSSPrimitiveValueImpl(new PairImpl(h, v));
0188 }
0189 
0190 static CSSValueImpl *valueForTextAlign(ETextAlign align)
0191 {
0192     switch (align) {
0193     case khtml::TAAUTO:
0194         return new CSSPrimitiveValueImpl(CSS_VAL_AUTO);
0195     case khtml::LEFT:
0196         return new CSSPrimitiveValueImpl(CSS_VAL_LEFT);
0197     case khtml::RIGHT:
0198         return new CSSPrimitiveValueImpl(CSS_VAL_RIGHT);
0199     case khtml::CENTER:
0200         return new CSSPrimitiveValueImpl(CSS_VAL_CENTER);
0201     case khtml::JUSTIFY:
0202         return new CSSPrimitiveValueImpl(CSS_VAL_JUSTIFY);
0203     case khtml::KHTML_LEFT:
0204         return new CSSPrimitiveValueImpl(CSS_VAL__KHTML_LEFT);
0205     case khtml::KHTML_RIGHT:
0206         return new CSSPrimitiveValueImpl(CSS_VAL__KHTML_RIGHT);
0207     case khtml::KHTML_CENTER:
0208         return new CSSPrimitiveValueImpl(CSS_VAL__KHTML_CENTER);
0209     }
0210     Q_ASSERT(0);
0211     return nullptr;
0212 }
0213 
0214 DOMString khtml::stringForListStyleType(EListStyleType type)
0215 {
0216     switch (type) {
0217     case khtml::LDISC:
0218         return "disc";
0219     case khtml::LCIRCLE:
0220         return "circle";
0221     case khtml::LSQUARE:
0222         return "square";
0223     case khtml::LBOX:
0224         return "box";
0225     case khtml::LDIAMOND:
0226         return "-khtml-diamond";
0227     case khtml::LDECIMAL:
0228         return "decimal";
0229     case khtml::DECIMAL_LEADING_ZERO:
0230         return "decimal-leading-zero";
0231     case khtml::ARABIC_INDIC:
0232         return "-khtml-arabic-indic";
0233     case khtml::LAO:
0234         return "-khtml-lao";
0235     case khtml::PERSIAN:
0236         return "-khtml-persian";
0237     case khtml::URDU:
0238         return "-khtml-urdu";
0239     case khtml::THAI:
0240         return "-khtml-thai";
0241     case khtml::TIBETAN:
0242         return "-khtml-tibetan";
0243     case khtml::LOWER_ROMAN:
0244         return "lower-roman";
0245     case khtml::UPPER_ROMAN:
0246         return "upper-roman";
0247     case khtml::HEBREW:
0248         return "hebrew";
0249     case khtml::ARMENIAN:
0250         return "armenian";
0251     case khtml::GEORGIAN:
0252         return "georgian";
0253     case khtml::CJK_IDEOGRAPHIC:
0254         return "cjk-ideographic";
0255     case khtml::JAPANESE_FORMAL:
0256         return "-khtml-japanese-formal";
0257     case khtml::JAPANESE_INFORMAL:
0258         return "-khtml-japanese-informal";
0259     case khtml::SIMP_CHINESE_FORMAL:
0260         return "-khtml-simp-chinese-formal";
0261     case khtml::SIMP_CHINESE_INFORMAL:
0262         return "-khtml-simp-chinese-informal";
0263     case khtml::TRAD_CHINESE_FORMAL:
0264         return "-khtml-trad-chinese-formal";
0265     case khtml::TRAD_CHINESE_INFORMAL:
0266         return "-khtml-trad-chinese-informal";
0267     case khtml::LOWER_GREEK:
0268         return "lower-greek";
0269     case khtml::UPPER_GREEK:
0270         return "-khtml-upper-greek";
0271     case khtml::LOWER_ALPHA:
0272         return "lower-alpha";
0273     case khtml::UPPER_ALPHA:
0274         return "upper-alpha";
0275     case khtml::LOWER_LATIN:
0276         return "lower-latin";
0277     case khtml::UPPER_LATIN:
0278         return "upper-latin";
0279     case khtml::HIRAGANA:
0280         return "hiragana";
0281     case khtml::KATAKANA:
0282         return "katakana";
0283     case khtml::HIRAGANA_IROHA:
0284         return "hiragana-iroha";
0285     case khtml::KATAKANA_IROHA:
0286         return "katakana_iroha";
0287     case khtml::LNONE:
0288         return "none";
0289     }
0290     Q_ASSERT(0);
0291     return "";
0292 }
0293 
0294 static CSSPrimitiveValueImpl *valueForColor(QColor color)
0295 {
0296     if (color.isValid()) {
0297         return new CSSPrimitiveValueImpl(color.rgba());
0298     } else {
0299         return new CSSPrimitiveValueImpl(khtml::transparentColor);
0300     }
0301 }
0302 
0303 static CSSValueImpl *valueForShadow(const ShadowData *shadow)
0304 {
0305     if (!shadow) {
0306         return new CSSPrimitiveValueImpl(CSS_VAL_NONE);
0307     }
0308     CSSValueListImpl *list = new CSSValueListImpl(CSSValueListImpl::Comma);
0309     for (const ShadowData *s = shadow; s; s = s->next) {
0310         CSSPrimitiveValueImpl *x = new CSSPrimitiveValueImpl(s->x, CSSPrimitiveValue::CSS_PX);
0311         CSSPrimitiveValueImpl *y = new CSSPrimitiveValueImpl(s->y, CSSPrimitiveValue::CSS_PX);
0312         CSSPrimitiveValueImpl *blur = new CSSPrimitiveValueImpl(s->blur, CSSPrimitiveValue::CSS_PX);
0313         CSSPrimitiveValueImpl *color = valueForColor(s->color);
0314         list->append(new ShadowValueImpl(x, y, blur, color));
0315     }
0316     return list;
0317 }
0318 
0319 static CSSValueImpl *getPositionOffsetValue(RenderObject *renderer, int propertyID)
0320 {
0321     if (!renderer) {
0322         return nullptr;
0323     }
0324 
0325     RenderStyle *style = renderer->style();
0326     if (!style) {
0327         return nullptr;
0328     }
0329 
0330     Length l;
0331     switch (propertyID) {
0332     case CSS_PROP_LEFT:
0333         l = style->left();
0334         break;
0335     case CSS_PROP_RIGHT:
0336         l = style->right();
0337         break;
0338     case CSS_PROP_TOP:
0339         l = style->top();
0340         break;
0341     case CSS_PROP_BOTTOM:
0342         l = style->bottom();
0343         break;
0344     default:
0345         return nullptr;
0346     }
0347 
0348     if (renderer->isPositioned()) {
0349         return valueForLength(l, renderer->contentWidth());
0350     }
0351 
0352     if (renderer->isRelPositioned())
0353         // FIXME: It's not enough to simply return "auto" values for one offset if the other side is defined.
0354         // In other words if left is auto and right is not auto, then left's computed value is negative right.
0355         // So we should get the opposite length unit and see if it is auto.
0356     {
0357         return valueForLength(l, renderer->contentWidth());
0358     }
0359 
0360     return new CSSPrimitiveValueImpl(CSS_VAL_AUTO);
0361 }
0362 
0363 RenderStyleDeclarationImpl::RenderStyleDeclarationImpl(DOM::NodeImpl *node)
0364     : CSSStyleDeclarationImpl(nullptr), m_node(node)
0365 {
0366     //qCDebug(KHTML_LOG) << "Render Style Declaration created";
0367 }
0368 
0369 RenderStyleDeclarationImpl::~RenderStyleDeclarationImpl()
0370 {
0371     //qCDebug(KHTML_LOG) << "Render Style Declaration destroyed";
0372 }
0373 
0374 DOM::DOMString RenderStyleDeclarationImpl::cssText() const
0375 {
0376     DOMString result;
0377 
0378     for (unsigned i = 0; i < numComputedProperties; i++) {
0379         if (i != 0) {
0380             result += " ";
0381         }
0382         result += getPropertyName(computedProperties[i]);
0383         result += ": ";
0384         result += getPropertyValue(computedProperties[i]);
0385         result += ";";
0386     }
0387 
0388     return result;
0389 }
0390 
0391 void RenderStyleDeclarationImpl::setCssText(DOM::DOMString)
0392 {
0393     // ### report that this sucka is read only
0394 }
0395 
0396 CSSValueImpl *RenderStyleDeclarationImpl::getPropertyCSSValue(int propertyID) const
0397 {
0398     NodeImpl *node = m_node.get();
0399     if (!node) {
0400         return nullptr;
0401     }
0402 
0403     // Make sure our layout is up to date before we allow a query on these attributes.
0404     DocumentImpl *docimpl = node->document();
0405     if (docimpl) {
0406         docimpl->updateLayout();
0407     }
0408 
0409     RenderStyle *style = node->computedStyle();
0410     if (!style) {
0411         return nullptr;
0412     }
0413     RenderObject *renderer = node->renderer(); // can be NULL
0414 
0415     // temporary(?) measure to handle with missing render object
0416     // check how we can better deal with it on a case-by-case basis
0417 #define RETURN_NULL_ON_NULL(ptr) if(ptr == nullptr) return nullptr;
0418 
0419     switch (propertyID) {
0420     case CSS_PROP_BACKGROUND_COLOR:
0421         return valueForColor(style->backgroundColor());
0422     case CSS_PROP_BACKGROUND_CLIP:
0423         switch (style->backgroundLayers()->backgroundClip()) {
0424         case BGBORDER:
0425             return new CSSPrimitiveValueImpl(CSS_VAL_BORDER_BOX);
0426         case BGPADDING:
0427             return new CSSPrimitiveValueImpl(CSS_VAL_PADDING_BOX);
0428         case BGCONTENT:
0429             return new CSSPrimitiveValueImpl(CSS_VAL_CONTENT_BOX);
0430         }
0431         Q_ASSERT(0);
0432         break;
0433     case CSS_PROP_BACKGROUND_IMAGE:
0434         if (style->backgroundImage())
0435             return new CSSPrimitiveValueImpl(style->backgroundImage()->url(),
0436                                              CSSPrimitiveValue::CSS_URI);
0437         return new CSSPrimitiveValueImpl(CSS_VAL_NONE);
0438     case CSS_PROP_BACKGROUND_REPEAT:
0439         switch (style->backgroundRepeat()) {
0440         case khtml::REPEAT:
0441             return new CSSPrimitiveValueImpl(CSS_VAL_REPEAT);
0442         case khtml::REPEAT_X:
0443             return new CSSPrimitiveValueImpl(CSS_VAL_REPEAT_X);
0444         case khtml::REPEAT_Y:
0445             return new CSSPrimitiveValueImpl(CSS_VAL_REPEAT_Y);
0446         case khtml::NO_REPEAT:
0447             return new CSSPrimitiveValueImpl(CSS_VAL_NO_REPEAT);
0448         default:
0449             Q_ASSERT(0);
0450         }
0451         break;
0452     case CSS_PROP_BACKGROUND_ATTACHMENT:
0453         switch (style->backgroundAttachment()) {
0454         case khtml::BGASCROLL:
0455             return new CSSPrimitiveValueImpl(CSS_VAL_SCROLL);
0456         case khtml::BGAFIXED:
0457             return new CSSPrimitiveValueImpl(CSS_VAL_FIXED);
0458         case khtml::BGALOCAL:
0459             return new CSSPrimitiveValueImpl(CSS_VAL_LOCAL);
0460         default:
0461             Q_ASSERT(0);
0462         }
0463         break;
0464     case CSS_PROP_BACKGROUND_ORIGIN:
0465         switch (style->backgroundLayers()->backgroundOrigin()) {
0466             case BGBORDER:
0467                 return new CSSPrimitiveValueImpl(CSS_VAL_BORDER_BOX);
0468             case BGPADDING:
0469                 return new CSSPrimitiveValueImpl(CSS_VAL_PADDING_BOX);
0470             case BGCONTENT:
0471                 return new CSSPrimitiveValueImpl(CSS_VAL_CONTENT_BOX);
0472         }
0473         Q_ASSERT(0);
0474         break;
0475     case CSS_PROP_BACKGROUND_POSITION: {
0476         RETURN_NULL_ON_NULL(renderer);
0477         CSSValueListImpl *values = new CSSValueListImpl(CSSValueListImpl::Space);
0478         values->append(valueForLength(style->backgroundXPosition(), renderer->contentWidth()));
0479         values->append(valueForLength(style->backgroundYPosition(), renderer->contentHeight()));
0480         return values;
0481     }
0482     case CSS_PROP_BACKGROUND_POSITION_X:
0483         RETURN_NULL_ON_NULL(renderer);
0484         return valueForLength(style->backgroundXPosition(), renderer->contentWidth());
0485     case CSS_PROP_BACKGROUND_POSITION_Y:
0486         RETURN_NULL_ON_NULL(renderer);
0487         return valueForLength(style->backgroundYPosition(), renderer->contentHeight());
0488     case CSS_PROP_BACKGROUND_SIZE: {
0489         const EBackgroundSizeType backgroundSizeType = style->backgroundLayers()->backgroundSize().type;
0490         switch (backgroundSizeType) {
0491             case BGSCONTAIN:
0492                 return new CSSPrimitiveValueImpl(CSS_VAL_CONTAIN);
0493             case BGSCOVER:
0494                 return new CSSPrimitiveValueImpl(CSS_VAL_COVER);
0495             case BGSLENGTH: {
0496                 const BGSize bgSize = style->backgroundLayers()->backgroundSize();
0497                 CSSValueListImpl *values = new CSSValueListImpl(CSSValueListImpl::Space);
0498                 switch (bgSize.width.type()) {
0499                     case Auto:
0500                         values->append(new CSSPrimitiveValueImpl(CSS_VAL_AUTO));
0501                         break;
0502                     case Percent:
0503                         values->append(new CSSPrimitiveValueImpl(bgSize.width.percent(), CSSPrimitiveValue::CSS_PERCENTAGE));
0504                         break;
0505                     default:
0506                         values->append(new CSSPrimitiveValueImpl(bgSize.width.value(), CSSPrimitiveValue::CSS_PX));
0507                 }
0508                 switch (bgSize.height.type()) {
0509                     case Auto:
0510                         values->append(new CSSPrimitiveValueImpl(CSS_VAL_AUTO));
0511                         break;
0512                     case Percent:
0513                         values->append(new CSSPrimitiveValueImpl(bgSize.height.percent(), CSSPrimitiveValue::CSS_PERCENTAGE));
0514                         break;
0515                     default:
0516                         values->append(new CSSPrimitiveValueImpl(bgSize.height.value(), CSSPrimitiveValue::CSS_PX));
0517                 }
0518                 return values;
0519             }
0520             default:
0521                 Q_ASSERT(0);
0522         }
0523         break;
0524     }
0525     case CSS_PROP_BORDER_COLLAPSE:
0526         if (style->borderCollapse()) {
0527             return new CSSPrimitiveValueImpl(CSS_VAL_COLLAPSE);
0528         } else {
0529             return new CSSPrimitiveValueImpl(CSS_VAL_SEPARATE);
0530         }
0531     case CSS_PROP_BORDER_SPACING: {
0532         CSSValueListImpl *values = new CSSValueListImpl(CSSValueListImpl::Space);
0533         values->append(new CSSPrimitiveValueImpl(style->borderHorizontalSpacing(), CSSPrimitiveValue::CSS_PX));
0534         values->append(new CSSPrimitiveValueImpl(style->borderVerticalSpacing(), CSSPrimitiveValue::CSS_PX));
0535         return values;
0536     }
0537     case CSS_PROP__KHTML_BORDER_HORIZONTAL_SPACING:
0538         return new CSSPrimitiveValueImpl(style->borderHorizontalSpacing(), CSSPrimitiveValue::CSS_PX);
0539     case CSS_PROP__KHTML_BORDER_VERTICAL_SPACING:
0540         return new CSSPrimitiveValueImpl(style->borderVerticalSpacing(), CSSPrimitiveValue::CSS_PX);
0541     case CSS_PROP_BORDER_TOP_RIGHT_RADIUS:
0542         return valueForBorderRadii(style->borderTopRightRadius());
0543     case CSS_PROP_BORDER_BOTTOM_RIGHT_RADIUS:
0544         return valueForBorderRadii(style->borderBottomRightRadius());
0545     case CSS_PROP_BORDER_BOTTOM_LEFT_RADIUS:
0546         return valueForBorderRadii(style->borderBottomLeftRadius());
0547     case CSS_PROP_BORDER_TOP_LEFT_RADIUS:
0548         return valueForBorderRadii(style->borderTopLeftRadius());
0549     case CSS_PROP_BORDER_TOP_COLOR:
0550         return valueForColor(style->borderTopColor());
0551     case CSS_PROP_BORDER_RIGHT_COLOR:
0552         return valueForColor(style->borderRightColor());
0553     case CSS_PROP_BORDER_BOTTOM_COLOR:
0554         return valueForColor(style->borderBottomColor());
0555     case CSS_PROP_BORDER_LEFT_COLOR:
0556         return valueForColor(style->borderLeftColor());
0557     case CSS_PROP_BORDER_TOP_STYLE:
0558         return valueForBorderStyle(style->borderTopStyle());
0559     case CSS_PROP_BORDER_RIGHT_STYLE:
0560         return valueForBorderStyle(style->borderRightStyle());
0561     case CSS_PROP_BORDER_BOTTOM_STYLE:
0562         return valueForBorderStyle(style->borderBottomStyle());
0563     case CSS_PROP_BORDER_LEFT_STYLE:
0564         return valueForBorderStyle(style->borderLeftStyle());
0565     case CSS_PROP_BORDER_TOP_WIDTH:
0566         return new CSSPrimitiveValueImpl(style->borderTopWidth(), CSSPrimitiveValue::CSS_PX);
0567     case CSS_PROP_BORDER_RIGHT_WIDTH:
0568         return new CSSPrimitiveValueImpl(style->borderRightWidth(), CSSPrimitiveValue::CSS_PX);
0569     case CSS_PROP_BORDER_BOTTOM_WIDTH:
0570         return new CSSPrimitiveValueImpl(style->borderBottomWidth(), CSSPrimitiveValue::CSS_PX);
0571     case CSS_PROP_BORDER_LEFT_WIDTH:
0572         return new CSSPrimitiveValueImpl(style->borderLeftWidth(), CSSPrimitiveValue::CSS_PX);
0573     case CSS_PROP_BOTTOM:
0574         RETURN_NULL_ON_NULL(renderer);
0575         return getPositionOffsetValue(renderer, CSS_PROP_BOTTOM);
0576     case CSS_PROP_BOX_SIZING:
0577         if (style->boxSizing() == BORDER_BOX) {
0578             return new CSSPrimitiveValueImpl(CSS_VAL_BORDER_BOX);
0579         } else {
0580             return new CSSPrimitiveValueImpl(CSS_VAL_CONTENT_BOX);
0581         }
0582     case CSS_PROP_CAPTION_SIDE:
0583         switch (style->captionSide()) {
0584         case CAPLEFT:
0585             return new CSSPrimitiveValueImpl(CSS_VAL_LEFT);
0586         case CAPRIGHT:
0587             return new CSSPrimitiveValueImpl(CSS_VAL_RIGHT);
0588         case CAPTOP:
0589             return new CSSPrimitiveValueImpl(CSS_VAL_TOP);
0590         case CAPBOTTOM:
0591             return new CSSPrimitiveValueImpl(CSS_VAL_BOTTOM);
0592         }
0593         Q_ASSERT(0);
0594         break;
0595     case CSS_PROP_CLEAR:
0596         switch (style->clear()) {
0597         case CNONE:
0598             return new CSSPrimitiveValueImpl(CSS_VAL_NONE);
0599         case CLEFT:
0600             return new CSSPrimitiveValueImpl(CSS_VAL_LEFT);
0601         case CRIGHT:
0602             return new CSSPrimitiveValueImpl(CSS_VAL_RIGHT);
0603         case CBOTH:
0604             return new CSSPrimitiveValueImpl(CSS_VAL_BOTH);
0605         }
0606         Q_ASSERT(0);
0607         break;
0608     case CSS_PROP_CLIP:
0609         break;
0610     case CSS_PROP_COLOR:
0611         return valueForColor(style->color());
0612     case CSS_PROP_CONTENT:
0613         break;
0614     case CSS_PROP_COUNTER_INCREMENT:
0615         break;
0616     case CSS_PROP_COUNTER_RESET:
0617         break;
0618     case CSS_PROP_CURSOR:
0619         switch (style->cursor()) {
0620         case CURSOR_AUTO:
0621             return new CSSPrimitiveValueImpl(CSS_VAL_AUTO);
0622         case CURSOR_DEFAULT:
0623             return new CSSPrimitiveValueImpl(CSS_VAL_DEFAULT);
0624         case CURSOR_NONE:
0625             return new CSSPrimitiveValueImpl(CSS_VAL_NONE);
0626         case CURSOR_CONTEXT_MENU:
0627             return new CSSPrimitiveValueImpl(CSS_VAL_CONTEXT_MENU);
0628         case CURSOR_HELP:
0629             return new CSSPrimitiveValueImpl(CSS_VAL_HELP);
0630         case CURSOR_POINTER:
0631             return new CSSPrimitiveValueImpl(CSS_VAL_POINTER);
0632         case CURSOR_PROGRESS:
0633             return new CSSPrimitiveValueImpl(CSS_VAL_PROGRESS);
0634         case CURSOR_WAIT:
0635             return new CSSPrimitiveValueImpl(CSS_VAL_WAIT);
0636         case CURSOR_CELL:
0637             return new CSSPrimitiveValueImpl(CSS_VAL_CELL);
0638         case CURSOR_CROSS:
0639             return new CSSPrimitiveValueImpl(CSS_VAL_CROSSHAIR);
0640         case CURSOR_TEXT:
0641             return new CSSPrimitiveValueImpl(CSS_VAL_TEXT);
0642         case CURSOR_VERTICAL_TEXT:
0643             return new CSSPrimitiveValueImpl(CSS_VAL_VERTICAL_TEXT);
0644         case CURSOR_ALIAS:
0645             return new CSSPrimitiveValueImpl(CSS_VAL_ALIAS);
0646         case CURSOR_COPY:
0647             return new CSSPrimitiveValueImpl(CSS_VAL_COPY);
0648         case CURSOR_MOVE:
0649             return new CSSPrimitiveValueImpl(CSS_VAL_MOVE);
0650         case CURSOR_NO_DROP:
0651             return new CSSPrimitiveValueImpl(CSS_VAL_NO_DROP);
0652         case CURSOR_NOT_ALLOWED:
0653             return new CSSPrimitiveValueImpl(CSS_VAL_NOT_ALLOWED);
0654         case CURSOR_E_RESIZE:
0655             return new CSSPrimitiveValueImpl(CSS_VAL_E_RESIZE);
0656         case CURSOR_N_RESIZE:
0657             return new CSSPrimitiveValueImpl(CSS_VAL_N_RESIZE);
0658         case CURSOR_NE_RESIZE:
0659             return new CSSPrimitiveValueImpl(CSS_VAL_NE_RESIZE);
0660         case CURSOR_NW_RESIZE:
0661             return new CSSPrimitiveValueImpl(CSS_VAL_NW_RESIZE);
0662         case CURSOR_S_RESIZE:
0663             return new CSSPrimitiveValueImpl(CSS_VAL_S_RESIZE);
0664         case CURSOR_SE_RESIZE:
0665             return new CSSPrimitiveValueImpl(CSS_VAL_SE_RESIZE);
0666         case CURSOR_SW_RESIZE:
0667             return new CSSPrimitiveValueImpl(CSS_VAL_SW_RESIZE);
0668         case CURSOR_W_RESIZE:
0669             return new CSSPrimitiveValueImpl(CSS_VAL_W_RESIZE);
0670         case CURSOR_EW_RESIZE:
0671             return new CSSPrimitiveValueImpl(CSS_VAL_EW_RESIZE);
0672         case CURSOR_NS_RESIZE:
0673             return new CSSPrimitiveValueImpl(CSS_VAL_NS_RESIZE);
0674         case CURSOR_NESW_RESIZE:
0675             return new CSSPrimitiveValueImpl(CSS_VAL_NESW_RESIZE);
0676         case CURSOR_NWSE_RESIZE:
0677             return new CSSPrimitiveValueImpl(CSS_VAL_NWSE_RESIZE);
0678         case CURSOR_COL_RESIZE:
0679             return new CSSPrimitiveValueImpl(CSS_VAL_COL_RESIZE);
0680         case CURSOR_ROW_RESIZE:
0681             return new CSSPrimitiveValueImpl(CSS_VAL_ROW_RESIZE);
0682         case CURSOR_ALL_SCROLL:
0683             return new CSSPrimitiveValueImpl(CSS_VAL_ALL_SCROLL);
0684         }
0685         Q_ASSERT(0);
0686         break;
0687     case CSS_PROP_DIRECTION:
0688         switch (style->direction()) {
0689         case LTR:
0690             return new CSSPrimitiveValueImpl(CSS_VAL_LTR);
0691         case RTL:
0692             return new CSSPrimitiveValueImpl(CSS_VAL_RTL);
0693         }
0694         Q_ASSERT(0);
0695         break;
0696     case CSS_PROP_DISPLAY:
0697         switch (style->display()) {
0698         case INLINE:
0699             return new CSSPrimitiveValueImpl(CSS_VAL_INLINE);
0700         case BLOCK:
0701             return new CSSPrimitiveValueImpl(CSS_VAL_BLOCK);
0702         case LIST_ITEM:
0703             return new CSSPrimitiveValueImpl(CSS_VAL_LIST_ITEM);
0704         case RUN_IN:
0705             return new CSSPrimitiveValueImpl(CSS_VAL_RUN_IN);
0706         case COMPACT:
0707             return new CSSPrimitiveValueImpl(CSS_VAL_COMPACT);
0708         case INLINE_BLOCK:
0709             return new CSSPrimitiveValueImpl(CSS_VAL_INLINE_BLOCK);
0710         case TABLE:
0711             return new CSSPrimitiveValueImpl(CSS_VAL_TABLE);
0712         case INLINE_TABLE:
0713             return new CSSPrimitiveValueImpl(CSS_VAL_INLINE_TABLE);
0714         case TABLE_ROW_GROUP:
0715             return new CSSPrimitiveValueImpl(CSS_VAL_TABLE_ROW_GROUP);
0716         case TABLE_HEADER_GROUP:
0717             return new CSSPrimitiveValueImpl(CSS_VAL_TABLE_HEADER_GROUP);
0718         case TABLE_FOOTER_GROUP:
0719             return new CSSPrimitiveValueImpl(CSS_VAL_TABLE_FOOTER_GROUP);
0720         case TABLE_ROW:
0721             return new CSSPrimitiveValueImpl(CSS_VAL_TABLE_ROW);
0722         case TABLE_COLUMN_GROUP:
0723             return new CSSPrimitiveValueImpl(CSS_VAL_TABLE_COLUMN_GROUP);
0724         case TABLE_COLUMN:
0725             return new CSSPrimitiveValueImpl(CSS_VAL_TABLE_COLUMN);
0726         case TABLE_CELL:
0727             return new CSSPrimitiveValueImpl(CSS_VAL_TABLE_CELL);
0728         case TABLE_CAPTION:
0729             return new CSSPrimitiveValueImpl(CSS_VAL_TABLE_CAPTION);
0730         case NONE:
0731             return new CSSPrimitiveValueImpl(CSS_VAL_NONE);
0732         }
0733         Q_ASSERT(0);
0734         break;
0735     case CSS_PROP_EMPTY_CELLS:
0736         switch (style->emptyCells()) {
0737         case SHOW:
0738             return new CSSPrimitiveValueImpl(CSS_VAL_SHOW);
0739         case HIDE:
0740             return new CSSPrimitiveValueImpl(CSS_VAL_HIDE);
0741         }
0742         Q_ASSERT(0);
0743         break;
0744     case CSS_PROP_FLOAT: {
0745         switch (style->floating()) {
0746         case FNONE:
0747             return new CSSPrimitiveValueImpl(CSS_VAL_NONE);
0748         case FLEFT:
0749             return new CSSPrimitiveValueImpl(CSS_VAL_LEFT);
0750         case FRIGHT:
0751             return new CSSPrimitiveValueImpl(CSS_VAL_RIGHT);
0752         case FLEFT_ALIGN:
0753             return new CSSPrimitiveValueImpl(CSS_VAL__KHTML_LEFT);
0754         case FRIGHT_ALIGN:
0755             return new CSSPrimitiveValueImpl(CSS_VAL__KHTML_RIGHT);
0756         }
0757         Q_ASSERT(0);
0758         break;
0759     }
0760     case CSS_PROP_FONT_FAMILY: {
0761         FontDef def = style->htmlFont().getFontDef();
0762         return new CSSPrimitiveValueImpl(DOMString(def.family), CSSPrimitiveValue::CSS_STRING);
0763     }
0764     case CSS_PROP_FONT_SIZE: {
0765         FontDef def = style->htmlFont().getFontDef();
0766         return new CSSPrimitiveValueImpl(def.size, CSSPrimitiveValue::CSS_PX);
0767     }
0768     case CSS_PROP_FONT_STYLE: {
0769         // FIXME: handle oblique
0770         FontDef def = style->htmlFont().getFontDef();
0771         if (def.italic) {
0772             return new CSSPrimitiveValueImpl(CSS_VAL_ITALIC);
0773         } else {
0774             return new CSSPrimitiveValueImpl(CSS_VAL_NORMAL);
0775         }
0776     }
0777     case CSS_PROP_FONT_VARIANT: {
0778         FontDef def = style->htmlFont().getFontDef();
0779         if (def.smallCaps) {
0780             return new CSSPrimitiveValueImpl(CSS_VAL_SMALL_CAPS);
0781         } else {
0782             return new CSSPrimitiveValueImpl(CSS_VAL_NORMAL);
0783         }
0784     }
0785     case CSS_PROP_FONT_WEIGHT: {
0786         // FIXME: this does not reflect the full range of weights
0787         // that can be expressed with CSS
0788         FontDef def = style->htmlFont().getFontDef();
0789         switch (def.weight) {
0790         case QFont::Light:
0791             return new CSSPrimitiveValueImpl(CSS_VAL_300);
0792         case QFont::Normal:
0793             //return new CSSPrimitiveValueImpl(CSS_VAL_400);
0794             return new CSSPrimitiveValueImpl(CSS_VAL_NORMAL);
0795         case QFont::DemiBold:
0796             return new CSSPrimitiveValueImpl(CSS_VAL_600);
0797         case QFont::Bold:
0798             //return new CSSPrimitiveValueImpl(CSS_VAL_700);
0799             return new CSSPrimitiveValueImpl(CSS_VAL_BOLD);
0800         case QFont::Black:
0801             return new CSSPrimitiveValueImpl(CSS_VAL_900);
0802         default:
0803             // Should not happen
0804             return new CSSPrimitiveValueImpl(CSS_VAL_NORMAL);
0805         }
0806     }
0807     case CSS_PROP_HEIGHT:
0808         if (renderer) {
0809             return new CSSPrimitiveValueImpl(renderer->contentHeight(), CSSPrimitiveValue::CSS_PX);
0810         }
0811         return valueForLength2(style->height());
0812     case CSS_PROP_LEFT:
0813         RETURN_NULL_ON_NULL(renderer);
0814         return getPositionOffsetValue(renderer, CSS_PROP_LEFT);
0815     case CSS_PROP_LETTER_SPACING:
0816         if (style->letterSpacing() == 0) {
0817             return new CSSPrimitiveValueImpl(CSS_VAL_NORMAL);
0818         }
0819         return new CSSPrimitiveValueImpl(style->letterSpacing(), CSSPrimitiveValue::CSS_PX);
0820     case CSS_PROP_LINE_HEIGHT: {
0821         // Note: internally a specified <number> value gets encoded as a percentage,
0822         // so the isPercent() case corresponds to the <number> case;
0823         // values < 0  are used to mark "normal"; and specified %%
0824         // get computed down to px by the time they get to RenderStyle
0825         // already
0826         Length length(style->lineHeight());
0827         if (length.isNegative()) {
0828             return new CSSPrimitiveValueImpl(CSS_VAL_NORMAL);
0829         }
0830         if (length.isPercent()) {
0831             //XXX: merge from webcore the computedStyle/specifiedStyle distinction in rendering/font.h
0832             float computedSize = style->htmlFont().getFontDef().size;
0833             return new CSSPrimitiveValueImpl((int)(length.percent() * computedSize) / 100, CSSPrimitiveValue::CSS_PX);
0834         } else {
0835             return new CSSPrimitiveValueImpl(length.value(), CSSPrimitiveValue::CSS_PX);
0836         }
0837     }
0838     case CSS_PROP_LIST_STYLE_IMAGE:
0839         if (style->listStyleImage()) {
0840             return new CSSPrimitiveValueImpl(style->listStyleImage()->url(), CSSPrimitiveValue::CSS_URI);
0841         }
0842         return new CSSPrimitiveValueImpl(CSS_VAL_NONE);
0843     case CSS_PROP_LIST_STYLE_POSITION:
0844         switch (style->listStylePosition()) {
0845         case OUTSIDE:
0846             return new CSSPrimitiveValueImpl(CSS_VAL_OUTSIDE);
0847         case INSIDE:
0848             return new CSSPrimitiveValueImpl(CSS_VAL_INSIDE);
0849         }
0850         Q_ASSERT(0);
0851         break;
0852     case CSS_PROP_LIST_STYLE_TYPE:
0853         return new CSSPrimitiveValueImpl(stringForListStyleType(style->listStyleType()), CSSPrimitiveValue::CSS_STRING);
0854     case CSS_PROP_MARGIN_TOP:
0855         if (renderer) {
0856             return new CSSPrimitiveValueImpl(renderer->marginTop(), CSSPrimitiveValue::CSS_PX);
0857         }
0858         return valueForLength2(style->marginTop());
0859     case CSS_PROP_MARGIN_RIGHT:
0860         if (renderer) {
0861             return new CSSPrimitiveValueImpl(renderer->marginRight(), CSSPrimitiveValue::CSS_PX);
0862         }
0863         return valueForLength2(style->marginRight());
0864     case CSS_PROP_MARGIN_BOTTOM:
0865         if (renderer) {
0866             return new CSSPrimitiveValueImpl(renderer->marginBottom(), CSSPrimitiveValue::CSS_PX);
0867         }
0868         return valueForLength2(style->marginBottom());
0869     case CSS_PROP_MARGIN_LEFT:
0870         if (renderer) {
0871             return new CSSPrimitiveValueImpl(renderer->marginLeft(), CSSPrimitiveValue::CSS_PX);
0872         }
0873         return valueForLength2(style->marginLeft());
0874     case CSS_PROP__KHTML_MARQUEE:
0875         // FIXME: unimplemented
0876         break;
0877     case CSS_PROP__KHTML_MARQUEE_DIRECTION:
0878         switch (style->marqueeDirection()) {
0879         case MFORWARD:
0880             return new CSSPrimitiveValueImpl(CSS_VAL_FORWARDS);
0881         case MBACKWARD:
0882             return new CSSPrimitiveValueImpl(CSS_VAL_BACKWARDS);
0883         case MAUTO:
0884             return new CSSPrimitiveValueImpl(CSS_VAL_AUTO);
0885         case MUP:
0886             return new CSSPrimitiveValueImpl(CSS_VAL_UP);
0887         case MDOWN:
0888             return new CSSPrimitiveValueImpl(CSS_VAL_DOWN);
0889         case MLEFT:
0890             return new CSSPrimitiveValueImpl(CSS_VAL_LEFT);
0891         case MRIGHT:
0892             return new CSSPrimitiveValueImpl(CSS_VAL_RIGHT);
0893         }
0894         Q_ASSERT(0);
0895         return nullptr;
0896     case CSS_PROP__KHTML_MARQUEE_INCREMENT:
0897         RETURN_NULL_ON_NULL(renderer);
0898         return valueForLength(style->marqueeIncrement(), renderer->contentWidth());
0899     case CSS_PROP__KHTML_MARQUEE_REPETITION:
0900         if (style->marqueeLoopCount() < 0) {
0901             return new CSSPrimitiveValueImpl(CSS_VAL_INFINITE);
0902         }
0903         return new CSSPrimitiveValueImpl(style->marqueeLoopCount(), CSSPrimitiveValue::CSS_NUMBER);
0904     case CSS_PROP__KHTML_MARQUEE_SPEED:
0905         // FIXME: unimplemented
0906         break;
0907     case CSS_PROP__KHTML_MARQUEE_STYLE:
0908         switch (style->marqueeBehavior()) {
0909         case MNONE:
0910             return new CSSPrimitiveValueImpl(CSS_VAL_NONE);
0911         case MSCROLL:
0912             return new CSSPrimitiveValueImpl(CSS_VAL_SCROLL);
0913         case MSLIDE:
0914             return new CSSPrimitiveValueImpl(CSS_VAL_SLIDE);
0915         case MALTERNATE:
0916             return new CSSPrimitiveValueImpl(CSS_VAL_ALTERNATE);
0917         case MUNFURL:
0918             return new CSSPrimitiveValueImpl(CSS_VAL_UNFURL);
0919         }
0920         Q_ASSERT(0);
0921         return nullptr;
0922     case CSS_PROP_MAX_HEIGHT:
0923         RETURN_NULL_ON_NULL(renderer);
0924         return new CSSPrimitiveValueImpl(renderer->availableHeight(),
0925                                          CSSPrimitiveValue::CSS_PX);
0926         break;
0927     case CSS_PROP_MAX_WIDTH:
0928         RETURN_NULL_ON_NULL(renderer);
0929         return new CSSPrimitiveValueImpl(renderer->maxWidth(),
0930                                          CSSPrimitiveValue::CSS_PX);
0931         break;
0932     case CSS_PROP_MIN_HEIGHT:
0933         RETURN_NULL_ON_NULL(renderer);
0934         return new CSSPrimitiveValueImpl(renderer->contentHeight(),
0935                                          CSSPrimitiveValue::CSS_PX);
0936         break;
0937     case CSS_PROP_MIN_WIDTH:
0938         RETURN_NULL_ON_NULL(renderer);
0939         return new CSSPrimitiveValueImpl(renderer->minWidth(),
0940                                          CSSPrimitiveValue::CSS_PX);
0941         break;
0942     case CSS_PROP_OPACITY:
0943         return new CSSPrimitiveValueImpl(style->opacity(), CSSPrimitiveValue::CSS_NUMBER);
0944     case CSS_PROP_ORPHANS:
0945         return new CSSPrimitiveValueImpl(style->orphans(), CSSPrimitiveValue::CSS_NUMBER);
0946     case CSS_PROP_OUTLINE_COLOR:
0947         break;
0948     case CSS_PROP_OUTLINE_OFFSET:
0949         break;
0950     case CSS_PROP_OUTLINE_STYLE:
0951         if (style->outlineStyleIsAuto()) {
0952             return new CSSPrimitiveValueImpl(CSS_VAL_AUTO);
0953         }
0954         return valueForBorderStyle(style->outlineStyle());
0955     case CSS_PROP_OUTLINE_WIDTH:
0956         break;
0957     case CSS_PROP_OVERFLOW:
0958     case CSS_PROP_OVERFLOW_X:
0959     case CSS_PROP_OVERFLOW_Y: {
0960         EOverflow overflow;
0961         switch (propertyID) {
0962         case CSS_PROP_OVERFLOW_X:
0963             overflow = style->overflowX();
0964             break;
0965         case CSS_PROP_OVERFLOW_Y:
0966             overflow = style->overflowY();
0967             break;
0968         default:
0969             overflow = qMax(style->overflowX(), style->overflowY());
0970         }
0971         switch (overflow) {
0972         case OVISIBLE:
0973             return new CSSPrimitiveValueImpl(CSS_VAL_VISIBLE);
0974         case OHIDDEN:
0975             return new CSSPrimitiveValueImpl(CSS_VAL_HIDDEN);
0976         case OSCROLL:
0977             return new CSSPrimitiveValueImpl(CSS_VAL_SCROLL);
0978         case OAUTO:
0979             return new CSSPrimitiveValueImpl(CSS_VAL_AUTO);
0980         case OMARQUEE:
0981             return new CSSPrimitiveValueImpl(CSS_VAL_MARQUEE);
0982         }
0983         Q_ASSERT(0);
0984         return nullptr;
0985     }
0986     case CSS_PROP_PADDING_TOP:
0987         if (renderer) {
0988             return new CSSPrimitiveValueImpl(renderer->paddingTop(), CSSPrimitiveValue::CSS_PX);
0989         }
0990         return valueForLength2(style->paddingTop());
0991     case CSS_PROP_PADDING_RIGHT:
0992         if (renderer) {
0993             return new CSSPrimitiveValueImpl(renderer->paddingRight(), CSSPrimitiveValue::CSS_PX);
0994         }
0995         return valueForLength2(style->paddingRight());
0996     case CSS_PROP_PADDING_BOTTOM:
0997         if (renderer) {
0998             return new CSSPrimitiveValueImpl(renderer->paddingBottom(), CSSPrimitiveValue::CSS_PX);
0999         }
1000         return valueForLength2(style->paddingBottom());
1001     case CSS_PROP_PADDING_LEFT:
1002         if (renderer) {
1003             return new CSSPrimitiveValueImpl(renderer->paddingLeft(), CSSPrimitiveValue::CSS_PX);
1004         }
1005         return valueForLength2(style->paddingLeft());
1006     case CSS_PROP_PAGE_BREAK_AFTER:
1007         switch (style->pageBreakAfter()) {
1008         case PBAUTO:
1009             return new CSSPrimitiveValueImpl(CSS_VAL_AUTO);
1010         case PBALWAYS:
1011             return new CSSPrimitiveValueImpl(CSS_VAL_ALWAYS);
1012         case PBAVOID:
1013             return new CSSPrimitiveValueImpl(CSS_VAL_AVOID);
1014         case PBLEFT:
1015             return new CSSPrimitiveValueImpl(CSS_VAL_LEFT);
1016         case PBRIGHT:
1017             return new CSSPrimitiveValueImpl(CSS_VAL_RIGHT);
1018         }
1019         Q_ASSERT(0);
1020         break;
1021     case CSS_PROP_PAGE_BREAK_BEFORE:
1022         switch (style->pageBreakBefore()) {
1023         case PBAUTO:
1024             return new CSSPrimitiveValueImpl(CSS_VAL_AUTO);
1025         case PBALWAYS:
1026             return new CSSPrimitiveValueImpl(CSS_VAL_ALWAYS);
1027         case PBAVOID:
1028             return new CSSPrimitiveValueImpl(CSS_VAL_AVOID);
1029         case PBLEFT:
1030             return new CSSPrimitiveValueImpl(CSS_VAL_LEFT);
1031         case PBRIGHT:
1032             return new CSSPrimitiveValueImpl(CSS_VAL_RIGHT);
1033         }
1034         Q_ASSERT(0);
1035         break;
1036     case CSS_PROP_PAGE_BREAK_INSIDE:
1037         if (style->pageBreakInside()) {
1038             return new CSSPrimitiveValueImpl(CSS_VAL_AUTO);
1039         } else {
1040             return new CSSPrimitiveValueImpl(CSS_VAL_AVOID);
1041         }
1042         Q_ASSERT(0);
1043         break;
1044     case CSS_PROP_POSITION:
1045         switch (style->position()) {
1046         case PSTATIC:
1047             return new CSSPrimitiveValueImpl(CSS_VAL_STATIC);
1048         case PRELATIVE:
1049             return new CSSPrimitiveValueImpl(CSS_VAL_RELATIVE);
1050         case PABSOLUTE:
1051             return new CSSPrimitiveValueImpl(CSS_VAL_ABSOLUTE);
1052         case PFIXED:
1053             return new CSSPrimitiveValueImpl(CSS_VAL_FIXED);
1054         }
1055         Q_ASSERT(0);
1056         break;
1057     case CSS_PROP_QUOTES:
1058         break;
1059     case CSS_PROP_RIGHT:
1060         RETURN_NULL_ON_NULL(renderer);
1061         return getPositionOffsetValue(renderer, CSS_PROP_RIGHT);
1062     case CSS_PROP_SIZE:
1063         break;
1064     case CSS_PROP_TABLE_LAYOUT:
1065         switch (style->tableLayout()) {
1066         case TAUTO:
1067             return new CSSPrimitiveValueImpl(CSS_VAL_AUTO);
1068         case TFIXED:
1069             return new CSSPrimitiveValueImpl(CSS_VAL_FIXED);
1070         }
1071         Q_ASSERT(0);
1072         break;
1073     case CSS_PROP_TEXT_ALIGN:
1074         return valueForTextAlign(style->textAlign());
1075     case CSS_PROP_TEXT_DECORATION: {
1076         QString string;
1077         if (style->textDecoration() & khtml::UNDERLINE) {
1078             string += "underline";
1079         }
1080         if (style->textDecoration() & khtml::OVERLINE) {
1081             if (string.length() > 0) {
1082                 string += " ";
1083             }
1084             string += "overline";
1085         }
1086         if (style->textDecoration() & khtml::LINE_THROUGH) {
1087             if (string.length() > 0) {
1088                 string += " ";
1089             }
1090             string += "line-through";
1091         }
1092         if (style->textDecoration() & khtml::BLINK) {
1093             if (string.length() > 0) {
1094                 string += " ";
1095             }
1096             string += "blink";
1097         }
1098         if (string.length() == 0) {
1099             string = "none";
1100         }
1101         return new CSSPrimitiveValueImpl(DOMString(string), CSSPrimitiveValue::CSS_STRING);
1102     }
1103     case CSS_PROP_TEXT_INDENT:
1104         RETURN_NULL_ON_NULL(renderer);
1105         return valueForLength(style->textIndent(), renderer->contentWidth());
1106     case CSS_PROP_TEXT_SHADOW:
1107         return valueForShadow(style->textShadow());
1108     case CSS_PROP_TEXT_TRANSFORM:
1109         switch (style->textTransform()) {
1110         case CAPITALIZE:
1111             return new CSSPrimitiveValueImpl(CSS_VAL_CAPITALIZE);
1112         case UPPERCASE:
1113             return new CSSPrimitiveValueImpl(CSS_VAL_UPPERCASE);
1114         case LOWERCASE:
1115             return new CSSPrimitiveValueImpl(CSS_VAL_LOWERCASE);
1116         case TTNONE:
1117             return new CSSPrimitiveValueImpl(CSS_VAL_NONE);
1118         }
1119         Q_ASSERT(0);
1120         break;
1121     case CSS_PROP_TOP:
1122         RETURN_NULL_ON_NULL(renderer);
1123         return getPositionOffsetValue(renderer, CSS_PROP_TOP);
1124     case CSS_PROP_UNICODE_BIDI:
1125         switch (style->unicodeBidi()) {
1126         case UBNormal:
1127             return new CSSPrimitiveValueImpl(CSS_VAL_NORMAL);
1128         case Embed:
1129             return new CSSPrimitiveValueImpl(CSS_VAL_EMBED);
1130         case Override:
1131             return new CSSPrimitiveValueImpl(CSS_VAL_BIDI_OVERRIDE);
1132         }
1133         Q_ASSERT(0);
1134         break;
1135     case CSS_PROP_VERTICAL_ALIGN: {
1136         switch (style->verticalAlign()) {
1137         case BASELINE:
1138             return new CSSPrimitiveValueImpl(CSS_VAL_BASELINE);
1139         case MIDDLE:
1140             return new CSSPrimitiveValueImpl(CSS_VAL_MIDDLE);
1141         case SUB:
1142             return new CSSPrimitiveValueImpl(CSS_VAL_SUB);
1143         case SUPER:
1144             return new CSSPrimitiveValueImpl(CSS_VAL_SUPER);
1145         case TEXT_TOP:
1146             return new CSSPrimitiveValueImpl(CSS_VAL_TEXT_TOP);
1147         case TEXT_BOTTOM:
1148             return new CSSPrimitiveValueImpl(CSS_VAL_TEXT_BOTTOM);
1149         case TOP:
1150             return new CSSPrimitiveValueImpl(CSS_VAL_TOP);
1151         case BOTTOM:
1152             return new CSSPrimitiveValueImpl(CSS_VAL_BOTTOM);
1153         case BASELINE_MIDDLE:
1154             return new CSSPrimitiveValueImpl(CSS_VAL__KHTML_BASELINE_MIDDLE);
1155         case LENGTH:
1156             RETURN_NULL_ON_NULL(renderer);
1157             return valueForLength(style->verticalAlignLength(), renderer->contentWidth());
1158         }
1159         Q_ASSERT(0);
1160         break;
1161     }
1162     case CSS_PROP_VISIBILITY:
1163         switch (style->visibility()) {
1164         case khtml::VISIBLE:
1165             return new CSSPrimitiveValueImpl(CSS_VAL_VISIBLE);
1166         case khtml::HIDDEN:
1167             return new CSSPrimitiveValueImpl(CSS_VAL_HIDDEN);
1168         case khtml::COLLAPSE:
1169             return new CSSPrimitiveValueImpl(CSS_VAL_COLLAPSE);
1170         }
1171         Q_ASSERT(0);
1172         break;
1173     case CSS_PROP_WHITE_SPACE: {
1174         switch (style->whiteSpace()) {
1175         case NORMAL:
1176             return new CSSPrimitiveValueImpl(CSS_VAL_NORMAL);
1177         case PRE:
1178             return new CSSPrimitiveValueImpl(CSS_VAL_PRE);
1179         case PRE_WRAP:
1180             return new CSSPrimitiveValueImpl(CSS_VAL_PRE_WRAP);
1181         case PRE_LINE:
1182             return new CSSPrimitiveValueImpl(CSS_VAL_PRE_LINE);
1183         case NOWRAP:
1184             return new CSSPrimitiveValueImpl(CSS_VAL_NOWRAP);
1185         case KHTML_NOWRAP:
1186             return new CSSPrimitiveValueImpl(CSS_VAL__KHTML_NOWRAP);
1187         }
1188         Q_ASSERT(0);
1189         break;
1190     }
1191     case CSS_PROP_WIDOWS:
1192         return new CSSPrimitiveValueImpl(style->widows(), CSSPrimitiveValue::CSS_NUMBER);
1193     case CSS_PROP_WIDTH:
1194         if (renderer)
1195             return new CSSPrimitiveValueImpl(renderer->contentWidth(),
1196                                              CSSPrimitiveValue::CSS_PX);
1197         return valueForLength2(style->width());
1198     case CSS_PROP_WORD_SPACING:
1199         return new CSSPrimitiveValueImpl(style->wordSpacing(), CSSPrimitiveValue::CSS_PX);
1200     case CSS_PROP_Z_INDEX:
1201         if (style->hasAutoZIndex()) {
1202             return new CSSPrimitiveValueImpl(CSS_VAL_AUTO);
1203         }
1204         return new CSSPrimitiveValueImpl(style->zIndex(), CSSPrimitiveValue::CSS_NUMBER);
1205     case CSS_PROP_BACKGROUND:
1206         break;
1207     case CSS_PROP_BORDER:
1208         break;
1209     case CSS_PROP_BORDER_COLOR:
1210         break;
1211     case CSS_PROP_BORDER_STYLE:
1212         break;
1213     case CSS_PROP_BORDER_TOP:
1214         RETURN_NULL_ON_NULL(renderer);
1215         return new CSSPrimitiveValueImpl(renderer->borderTop(),
1216                                          CSSPrimitiveValue::CSS_PX);
1217         break;
1218     case CSS_PROP_BORDER_RIGHT:
1219         RETURN_NULL_ON_NULL(renderer);
1220         return new CSSPrimitiveValueImpl(renderer->borderRight(),
1221                                          CSSPrimitiveValue::CSS_PX);
1222         break;
1223     case CSS_PROP_BORDER_BOTTOM:
1224         RETURN_NULL_ON_NULL(renderer);
1225         return new CSSPrimitiveValueImpl(renderer->borderBottom(),
1226                                          CSSPrimitiveValue::CSS_PX);
1227         break;
1228     case CSS_PROP_BORDER_LEFT:
1229         RETURN_NULL_ON_NULL(renderer);
1230         return new CSSPrimitiveValueImpl(renderer->borderLeft(),
1231                                          CSSPrimitiveValue::CSS_PX);
1232         break;
1233     case CSS_PROP_BORDER_WIDTH:
1234         break;
1235     case CSS_PROP_FONT:
1236         break;
1237     case CSS_PROP_LIST_STYLE:
1238         break;
1239     case CSS_PROP_MARGIN:
1240         break;
1241     case CSS_PROP_OUTLINE:
1242         break;
1243     case CSS_PROP_PADDING:
1244         break;
1245     case CSS_PROP_SCROLLBAR_BASE_COLOR:
1246         break;
1247     case CSS_PROP_SCROLLBAR_FACE_COLOR:
1248         break;
1249     case CSS_PROP_SCROLLBAR_SHADOW_COLOR:
1250         break;
1251     case CSS_PROP_SCROLLBAR_HIGHLIGHT_COLOR:
1252         break;
1253     case CSS_PROP_SCROLLBAR_3DLIGHT_COLOR:
1254         break;
1255     case CSS_PROP_SCROLLBAR_DARKSHADOW_COLOR:
1256         break;
1257     case CSS_PROP_SCROLLBAR_TRACK_COLOR:
1258         break;
1259     case CSS_PROP_SCROLLBAR_ARROW_COLOR:
1260         break;
1261     case CSS_PROP__KHTML_FLOW_MODE:
1262         break;
1263     case CSS_PROP__KHTML_USER_INPUT:
1264         break;
1265     case CSS_PROP_TEXT_OVERFLOW:
1266         if (style->textOverflow()) {
1267             return new CSSPrimitiveValueImpl(CSS_VAL_ELLIPSIS);
1268         } else {
1269             return new CSSPrimitiveValueImpl(CSS_VAL_CLIP);
1270         }
1271         break;
1272     default:
1273         qCWarning(KHTML_LOG) << "Unhandled property:" << getPropertyName(propertyID);
1274         //Q_ASSERT( 0 );
1275         break;
1276     }
1277     return nullptr;
1278 }
1279 
1280 #undef RETURN_NULL_ON_NULL
1281 
1282 DOMString RenderStyleDeclarationImpl::getPropertyValue(int propertyID) const
1283 {
1284     CSSValueImpl *value = getPropertyCSSValue(propertyID);
1285     if (value) {
1286         DOMString val = value->cssText();
1287         delete value;
1288         return val;
1289     }
1290     return "";
1291 }
1292 
1293 bool RenderStyleDeclarationImpl::getPropertyPriority(int) const
1294 {
1295     // All computed styles have a priority of false (not "important").
1296     return false;
1297 }
1298 
1299 void RenderStyleDeclarationImpl::removeProperty(int, DOM::DOMString *)
1300 {
1301     // ### emit error since we're read-only
1302 }
1303 
1304 bool RenderStyleDeclarationImpl::removePropertiesInSet(const int *, unsigned)
1305 {
1306     // ### emit error since we're read-only
1307     return false;
1308 }
1309 
1310 bool RenderStyleDeclarationImpl::setProperty(int, const DOM::DOMString &, bool, int &ec)
1311 {
1312     ec = DOMException::NO_MODIFICATION_ALLOWED_ERR;
1313     return false;
1314 }
1315 
1316 bool RenderStyleDeclarationImpl::setProperty(int, const DOM::DOMString &, bool)
1317 {
1318     // ### emit error since we're read-only
1319     return false;
1320 }
1321 
1322 void RenderStyleDeclarationImpl::setProperty(int, int, bool)
1323 {
1324     // ### emit error since we're read-only
1325 }
1326 
1327 void RenderStyleDeclarationImpl::setLengthProperty(int, const DOM::DOMString &, bool,
1328         bool)
1329 {
1330     // ### emit error since we're read-only
1331 }
1332 
1333 void RenderStyleDeclarationImpl::setProperty(const DOMString &)
1334 {
1335     // ### emit error since we're read-only
1336 }
1337 
1338 unsigned long RenderStyleDeclarationImpl::length() const
1339 {
1340     return numComputedProperties;
1341 }
1342 
1343 DOM::DOMString RenderStyleDeclarationImpl::item(unsigned long i) const
1344 {
1345     if (i >= numComputedProperties) {
1346         return DOMString();
1347     }
1348 
1349     return getPropertyName(computedProperties[i]);
1350 }
1351 
1352 CSSProperty RenderStyleDeclarationImpl::property(int id) const
1353 {
1354     CSSProperty prop;
1355     prop.m_id = id;
1356     prop.m_important = false;
1357 
1358     CSSValueImpl *v = getPropertyCSSValue(id);
1359     if (!v) {
1360         v = new CSSPrimitiveValueImpl;
1361     }
1362     prop.setValue(v);
1363     return prop;
1364 }
1365