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