1 /* 2 * Copyright (C) 2004 Zack Rusin <zack (at) kde.org> 3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 4 * Copyright (C) 2007 Alexey Proskuryakov <ap (at) webkit.org> 5 * Copyright (C) 2007 Nicholas Shanks <webkit (at) nickshanks.com> 6 * 7 * This library is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Lesser General Public 9 * License as published by the Free Software Foundation; either 10 * version 2 of the License, or (at your option) any later version. 11 * 12 * This library is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with this library; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 20 * 02110-1301 USA 21 */ 22 23 #include "config.h" 24 #include "CSSComputedStyleDeclaration.h" 25 26 #include "AnimationController.h" 27 #include "CSSBorderImageValue.h" 28 #include "CSSMutableStyleDeclaration.h" 29 #include "CSSPrimitiveValue.h" 30 #include "CSSPrimitiveValueMappings.h" 31 #include "CSSProperty.h" 32 #include "CSSPropertyNames.h" 33 #include "CSSReflectValue.h" 34 #include "CSSTimingFunctionValue.h" 35 #include "CSSValueList.h" 36 #include "Document.h" 37 #include "ExceptionCode.h" 38 #include "Rect.h" 39 #include "RenderBox.h" 40 #include "RenderLayer.h" 41 #include "ShadowValue.h" 42 #ifdef ANDROID_LAYOUT 43 #include "Frame.h" 44 #include "Settings.h" 45 #endif 46 #include "WebKitCSSTransformValue.h" 47 48 #if ENABLE(DASHBOARD_SUPPORT) 49 #include "DashboardRegion.h" 50 #endif 51 52 namespace WebCore { 53 54 // List of all properties we know how to compute, omitting shorthands. 55 static const int computedProperties[] = { 56 CSSPropertyBackgroundAttachment, 57 CSSPropertyBackgroundClip, 58 CSSPropertyBackgroundColor, 59 CSSPropertyBackgroundImage, 60 CSSPropertyBackgroundOrigin, 61 CSSPropertyBackgroundPosition, // more-specific background-position-x/y are non-standard 62 CSSPropertyBackgroundRepeat, 63 CSSPropertyBackgroundSize, 64 CSSPropertyBorderBottomColor, 65 CSSPropertyBorderBottomLeftRadius, 66 CSSPropertyBorderBottomRightRadius, 67 CSSPropertyBorderBottomStyle, 68 CSSPropertyBorderBottomWidth, 69 CSSPropertyBorderCollapse, 70 CSSPropertyBorderLeftColor, 71 CSSPropertyBorderLeftStyle, 72 CSSPropertyBorderLeftWidth, 73 CSSPropertyBorderRightColor, 74 CSSPropertyBorderRightStyle, 75 CSSPropertyBorderRightWidth, 76 CSSPropertyBorderTopColor, 77 CSSPropertyBorderTopLeftRadius, 78 CSSPropertyBorderTopRightRadius, 79 CSSPropertyBorderTopStyle, 80 CSSPropertyBorderTopWidth, 81 CSSPropertyBottom, 82 CSSPropertyCaptionSide, 83 CSSPropertyClear, 84 CSSPropertyClip, 85 CSSPropertyColor, 86 CSSPropertyCursor, 87 CSSPropertyDirection, 88 CSSPropertyDisplay, 89 CSSPropertyEmptyCells, 90 CSSPropertyFloat, 91 CSSPropertyFontFamily, 92 CSSPropertyFontSize, 93 CSSPropertyFontStyle, 94 CSSPropertyFontVariant, 95 CSSPropertyFontWeight, 96 CSSPropertyHeight, 97 CSSPropertyLeft, 98 CSSPropertyLetterSpacing, 99 CSSPropertyLineHeight, 100 CSSPropertyListStyleImage, 101 CSSPropertyListStylePosition, 102 CSSPropertyListStyleType, 103 CSSPropertyMarginBottom, 104 CSSPropertyMarginLeft, 105 CSSPropertyMarginRight, 106 CSSPropertyMarginTop, 107 CSSPropertyMaxHeight, 108 CSSPropertyMaxWidth, 109 CSSPropertyMinHeight, 110 CSSPropertyMinWidth, 111 CSSPropertyOpacity, 112 CSSPropertyOrphans, 113 CSSPropertyOutlineColor, 114 CSSPropertyOutlineStyle, 115 CSSPropertyOutlineWidth, 116 CSSPropertyOverflowX, 117 CSSPropertyOverflowY, 118 CSSPropertyPaddingBottom, 119 CSSPropertyPaddingLeft, 120 CSSPropertyPaddingRight, 121 CSSPropertyPaddingTop, 122 CSSPropertyPageBreakAfter, 123 CSSPropertyPageBreakBefore, 124 CSSPropertyPageBreakInside, 125 CSSPropertyPointerEvents, 126 CSSPropertyPosition, 127 CSSPropertyResize, 128 CSSPropertyRight, 129 CSSPropertyTableLayout, 130 CSSPropertyTextAlign, 131 CSSPropertyTextDecoration, 132 CSSPropertyTextIndent, 133 CSSPropertyTextRendering, 134 CSSPropertyTextShadow, 135 CSSPropertyTextOverflow, 136 CSSPropertyTextTransform, 137 CSSPropertyTop, 138 CSSPropertyUnicodeBidi, 139 CSSPropertyVerticalAlign, 140 CSSPropertyVisibility, 141 CSSPropertyWhiteSpace, 142 CSSPropertyWidows, 143 CSSPropertyWidth, 144 CSSPropertyWordBreak, 145 CSSPropertyWordSpacing, 146 CSSPropertyWordWrap, 147 CSSPropertyZIndex, 148 CSSPropertyZoom, 149 150 CSSPropertyWebkitAnimationDelay, 151 CSSPropertyWebkitAnimationDirection, 152 CSSPropertyWebkitAnimationDuration, 153 CSSPropertyWebkitAnimationIterationCount, 154 CSSPropertyWebkitAnimationName, 155 CSSPropertyWebkitAnimationPlayState, 156 CSSPropertyWebkitAnimationTimingFunction, 157 CSSPropertyWebkitAppearance, 158 CSSPropertyWebkitBackfaceVisibility, 159 CSSPropertyWebkitBackgroundClip, 160 CSSPropertyWebkitBackgroundComposite, 161 CSSPropertyWebkitBackgroundOrigin, 162 CSSPropertyWebkitBackgroundSize, 163 CSSPropertyWebkitBorderFit, 164 CSSPropertyWebkitBorderHorizontalSpacing, 165 CSSPropertyWebkitBorderImage, 166 CSSPropertyWebkitBorderVerticalSpacing, 167 CSSPropertyWebkitBoxAlign, 168 CSSPropertyWebkitBoxDirection, 169 CSSPropertyWebkitBoxFlex, 170 CSSPropertyWebkitBoxFlexGroup, 171 CSSPropertyWebkitBoxLines, 172 CSSPropertyWebkitBoxOrdinalGroup, 173 CSSPropertyWebkitBoxOrient, 174 CSSPropertyWebkitBoxPack, 175 CSSPropertyWebkitBoxReflect, 176 CSSPropertyWebkitBoxShadow, 177 CSSPropertyWebkitBoxSizing, 178 CSSPropertyWebkitColorCorrection, 179 CSSPropertyWebkitColumnBreakAfter, 180 CSSPropertyWebkitColumnBreakBefore, 181 CSSPropertyWebkitColumnBreakInside, 182 CSSPropertyWebkitColumnCount, 183 CSSPropertyWebkitColumnGap, 184 CSSPropertyWebkitColumnRuleColor, 185 CSSPropertyWebkitColumnRuleStyle, 186 CSSPropertyWebkitColumnRuleWidth, 187 CSSPropertyWebkitColumnWidth, 188 #if ENABLE(DASHBOARD_SUPPORT) 189 CSSPropertyWebkitDashboardRegion, 190 #endif 191 CSSPropertyWebkitFontSmoothing, 192 CSSPropertyWebkitHighlight, 193 CSSPropertyWebkitLineBreak, 194 CSSPropertyWebkitLineClamp, 195 CSSPropertyWebkitMarginBottomCollapse, 196 CSSPropertyWebkitMarginTopCollapse, 197 CSSPropertyWebkitMarqueeDirection, 198 CSSPropertyWebkitMarqueeIncrement, 199 CSSPropertyWebkitMarqueeRepetition, 200 CSSPropertyWebkitMarqueeStyle, 201 CSSPropertyWebkitMaskAttachment, 202 CSSPropertyWebkitMaskBoxImage, 203 CSSPropertyWebkitMaskClip, 204 CSSPropertyWebkitMaskComposite, 205 CSSPropertyWebkitMaskImage, 206 CSSPropertyWebkitMaskOrigin, 207 CSSPropertyWebkitMaskPosition, 208 CSSPropertyWebkitMaskRepeat, 209 CSSPropertyWebkitMaskSize, 210 CSSPropertyWebkitNbspMode, 211 CSSPropertyWebkitPerspective, 212 CSSPropertyWebkitPerspectiveOrigin, 213 CSSPropertyWebkitRtlOrdering, 214 CSSPropertyWebkitTextDecorationsInEffect, 215 CSSPropertyWebkitTextFillColor, 216 CSSPropertyWebkitTextSecurity, 217 CSSPropertyWebkitTextStrokeColor, 218 CSSPropertyWebkitTextStrokeWidth, 219 CSSPropertyWebkitTransform, 220 CSSPropertyWebkitTransformOrigin, 221 CSSPropertyWebkitTransformStyle, 222 CSSPropertyWebkitTransitionDelay, 223 CSSPropertyWebkitTransitionDuration, 224 CSSPropertyWebkitTransitionProperty, 225 CSSPropertyWebkitTransitionTimingFunction, 226 CSSPropertyWebkitUserDrag, 227 CSSPropertyWebkitUserModify, 228 CSSPropertyWebkitUserSelect 229 230 #if ENABLE(SVG) 231 , 232 CSSPropertyClipPath, 233 CSSPropertyClipRule, 234 CSSPropertyMask, 235 CSSPropertyFilter, 236 CSSPropertyFloodColor, 237 CSSPropertyFloodOpacity, 238 CSSPropertyLightingColor, 239 CSSPropertyStopColor, 240 CSSPropertyStopOpacity, 241 CSSPropertyColorInterpolation, 242 CSSPropertyColorInterpolationFilters, 243 CSSPropertyColorRendering, 244 CSSPropertyFill, 245 CSSPropertyFillOpacity, 246 CSSPropertyFillRule, 247 CSSPropertyImageRendering, 248 CSSPropertyMarkerEnd, 249 CSSPropertyMarkerMid, 250 CSSPropertyMarkerStart, 251 CSSPropertyShapeRendering, 252 CSSPropertyStroke, 253 CSSPropertyStrokeDasharray, 254 CSSPropertyStrokeDashoffset, 255 CSSPropertyStrokeLinecap, 256 CSSPropertyStrokeLinejoin, 257 CSSPropertyStrokeMiterlimit, 258 CSSPropertyStrokeOpacity, 259 CSSPropertyStrokeWidth, 260 CSSPropertyAlignmentBaseline, 261 CSSPropertyBaselineShift, 262 CSSPropertyDominantBaseline, 263 CSSPropertyKerning, 264 CSSPropertyTextAnchor, 265 CSSPropertyWritingMode, 266 CSSPropertyGlyphOrientationHorizontal, 267 CSSPropertyGlyphOrientationVertical, 268 CSSPropertyWebkitSvgShadow 269 #endif 270 #ifdef ANDROID_CSS_TAP_HIGHLIGHT_COLOR 271 , 272 CSSPropertyWebkitTapHighlightColor 273 #endif 274 }; 275 276 const unsigned numComputedProperties = sizeof(computedProperties) / sizeof(computedProperties[0]); 277 278 static int valueForRepeatRule(int rule) 279 { 280 switch (rule) { 281 case RepeatImageRule: 282 return CSSValueRepeat; 283 case RoundImageRule: 284 return CSSValueRound; 285 default: 286 return CSSValueStretch; 287 } 288 } 289 290 static PassRefPtr<CSSValue> valueForNinePieceImage(const NinePieceImage& image) 291 { 292 if (!image.hasImage()) 293 return CSSPrimitiveValue::createIdentifier(CSSValueNone); 294 295 // Image first. 296 RefPtr<CSSValue> imageValue; 297 if (image.image()) 298 imageValue = image.image()->cssValue(); 299 300 // Create the slices. 301 RefPtr<CSSPrimitiveValue> top; 302 if (image.m_slices.top().isPercent()) 303 top = CSSPrimitiveValue::create(image.m_slices.top().value(), CSSPrimitiveValue::CSS_PERCENTAGE); 304 else 305 top = CSSPrimitiveValue::create(image.m_slices.top().value(), CSSPrimitiveValue::CSS_NUMBER); 306 307 RefPtr<CSSPrimitiveValue> right; 308 if (image.m_slices.right().isPercent()) 309 right = CSSPrimitiveValue::create(image.m_slices.right().value(), CSSPrimitiveValue::CSS_PERCENTAGE); 310 else 311 right = CSSPrimitiveValue::create(image.m_slices.right().value(), CSSPrimitiveValue::CSS_NUMBER); 312 313 RefPtr<CSSPrimitiveValue> bottom; 314 if (image.m_slices.bottom().isPercent()) 315 bottom = CSSPrimitiveValue::create(image.m_slices.bottom().value(), CSSPrimitiveValue::CSS_PERCENTAGE); 316 else 317 bottom = CSSPrimitiveValue::create(image.m_slices.bottom().value(), CSSPrimitiveValue::CSS_NUMBER); 318 319 RefPtr<CSSPrimitiveValue> left; 320 if (image.m_slices.left().isPercent()) 321 left = CSSPrimitiveValue::create(image.m_slices.left().value(), CSSPrimitiveValue::CSS_PERCENTAGE); 322 else 323 left = CSSPrimitiveValue::create(image.m_slices.left().value(), CSSPrimitiveValue::CSS_NUMBER); 324 325 RefPtr<Rect> rect = Rect::create(); 326 rect->setTop(top); 327 rect->setRight(right); 328 rect->setBottom(bottom); 329 rect->setLeft(left); 330 331 return CSSBorderImageValue::create(imageValue, rect, valueForRepeatRule(image.m_horizontalRule), valueForRepeatRule(image.m_verticalRule)); 332 } 333 334 static PassRefPtr<CSSValue> valueForReflection(const StyleReflection* reflection) 335 { 336 if (!reflection) 337 return CSSPrimitiveValue::createIdentifier(CSSValueNone); 338 339 RefPtr<CSSPrimitiveValue> offset; 340 if (reflection->offset().isPercent()) 341 offset = CSSPrimitiveValue::create(reflection->offset().percent(), CSSPrimitiveValue::CSS_PERCENTAGE); 342 else 343 offset = CSSPrimitiveValue::create(reflection->offset().value(), CSSPrimitiveValue::CSS_PX); 344 345 return CSSReflectValue::create(reflection->direction(), offset.release(), valueForNinePieceImage(reflection->mask())); 346 } 347 348 static PassRefPtr<CSSValue> getPositionOffsetValue(RenderStyle* style, int propertyID) 349 { 350 if (!style) 351 return 0; 352 353 Length l; 354 switch (propertyID) { 355 case CSSPropertyLeft: 356 l = style->left(); 357 break; 358 case CSSPropertyRight: 359 l = style->right(); 360 break; 361 case CSSPropertyTop: 362 l = style->top(); 363 break; 364 case CSSPropertyBottom: 365 l = style->bottom(); 366 break; 367 default: 368 return 0; 369 } 370 371 if (style->position() == AbsolutePosition || style->position() == FixedPosition) 372 return CSSPrimitiveValue::create(l); 373 374 if (style->position() == RelativePosition) 375 // FIXME: It's not enough to simply return "auto" values for one offset if the other side is defined. 376 // In other words if left is auto and right is not auto, then left's computed value is negative right(). 377 // So we should get the opposite length unit and see if it is auto. 378 return CSSPrimitiveValue::create(l); 379 380 return CSSPrimitiveValue::createIdentifier(CSSValueAuto); 381 } 382 383 static PassRefPtr<CSSPrimitiveValue> currentColorOrValidColor(RenderStyle* style, const Color& color) 384 { 385 if (!color.isValid()) 386 return CSSPrimitiveValue::createColor(style->color().rgb()); 387 return CSSPrimitiveValue::createColor(color.rgb()); 388 } 389 390 static PassRefPtr<CSSValue> getBorderRadiusCornerValue(IntSize radius) 391 { 392 if (radius.width() == radius.height()) 393 return CSSPrimitiveValue::create(radius.width(), CSSPrimitiveValue::CSS_PX); 394 395 RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); 396 list->append(CSSPrimitiveValue::create(radius.width(), CSSPrimitiveValue::CSS_PX)); 397 list->append(CSSPrimitiveValue::create(radius.height(), CSSPrimitiveValue::CSS_PX)); 398 return list.release(); 399 } 400 401 static IntRect sizingBox(RenderObject* renderer) 402 { 403 if (!renderer->isBox()) 404 return IntRect(); 405 406 RenderBox* box = toRenderBox(renderer); 407 return box->style()->boxSizing() == CONTENT_BOX ? box->contentBoxRect() : box->borderBoxRect(); 408 } 409 410 static inline bool hasCompositedLayer(RenderObject* renderer) 411 { 412 return renderer && renderer->hasLayer() && toRenderBoxModelObject(renderer)->layer()->isComposited(); 413 } 414 415 static PassRefPtr<CSSValue> computedTransform(RenderObject* renderer, const RenderStyle* style) 416 { 417 if (!renderer || style->transform().operations().isEmpty()) 418 return CSSPrimitiveValue::createIdentifier(CSSValueNone); 419 420 IntRect box = sizingBox(renderer); 421 422 TransformationMatrix transform; 423 style->applyTransform(transform, box.size(), RenderStyle::ExcludeTransformOrigin); 424 // Note that this does not flatten to an affine transform if ENABLE(3D_RENDERING) is off, by design. 425 426 RefPtr<WebKitCSSTransformValue> transformVal; 427 428 // FIXME: Need to print out individual functions (https://bugs.webkit.org/show_bug.cgi?id=23924) 429 if (transform.isAffine()) { 430 transformVal = WebKitCSSTransformValue::create(WebKitCSSTransformValue::MatrixTransformOperation); 431 432 transformVal->append(CSSPrimitiveValue::create(transform.a(), CSSPrimitiveValue::CSS_NUMBER)); 433 transformVal->append(CSSPrimitiveValue::create(transform.b(), CSSPrimitiveValue::CSS_NUMBER)); 434 transformVal->append(CSSPrimitiveValue::create(transform.c(), CSSPrimitiveValue::CSS_NUMBER)); 435 transformVal->append(CSSPrimitiveValue::create(transform.d(), CSSPrimitiveValue::CSS_NUMBER)); 436 transformVal->append(CSSPrimitiveValue::create(transform.e(), CSSPrimitiveValue::CSS_NUMBER)); 437 transformVal->append(CSSPrimitiveValue::create(transform.f(), CSSPrimitiveValue::CSS_NUMBER)); 438 } else { 439 transformVal = WebKitCSSTransformValue::create(WebKitCSSTransformValue::Matrix3DTransformOperation); 440 441 transformVal->append(CSSPrimitiveValue::create(transform.m11(), CSSPrimitiveValue::CSS_NUMBER)); 442 transformVal->append(CSSPrimitiveValue::create(transform.m12(), CSSPrimitiveValue::CSS_NUMBER)); 443 transformVal->append(CSSPrimitiveValue::create(transform.m13(), CSSPrimitiveValue::CSS_NUMBER)); 444 transformVal->append(CSSPrimitiveValue::create(transform.m14(), CSSPrimitiveValue::CSS_NUMBER)); 445 446 transformVal->append(CSSPrimitiveValue::create(transform.m21(), CSSPrimitiveValue::CSS_NUMBER)); 447 transformVal->append(CSSPrimitiveValue::create(transform.m22(), CSSPrimitiveValue::CSS_NUMBER)); 448 transformVal->append(CSSPrimitiveValue::create(transform.m23(), CSSPrimitiveValue::CSS_NUMBER)); 449 transformVal->append(CSSPrimitiveValue::create(transform.m24(), CSSPrimitiveValue::CSS_NUMBER)); 450 451 transformVal->append(CSSPrimitiveValue::create(transform.m31(), CSSPrimitiveValue::CSS_NUMBER)); 452 transformVal->append(CSSPrimitiveValue::create(transform.m32(), CSSPrimitiveValue::CSS_NUMBER)); 453 transformVal->append(CSSPrimitiveValue::create(transform.m33(), CSSPrimitiveValue::CSS_NUMBER)); 454 transformVal->append(CSSPrimitiveValue::create(transform.m34(), CSSPrimitiveValue::CSS_NUMBER)); 455 456 transformVal->append(CSSPrimitiveValue::create(transform.m41(), CSSPrimitiveValue::CSS_NUMBER)); 457 transformVal->append(CSSPrimitiveValue::create(transform.m42(), CSSPrimitiveValue::CSS_NUMBER)); 458 transformVal->append(CSSPrimitiveValue::create(transform.m43(), CSSPrimitiveValue::CSS_NUMBER)); 459 transformVal->append(CSSPrimitiveValue::create(transform.m44(), CSSPrimitiveValue::CSS_NUMBER)); 460 } 461 462 RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); 463 list->append(transformVal); 464 465 return list.release(); 466 } 467 468 static PassRefPtr<CSSValue> getDelayValue(const AnimationList* animList) 469 { 470 RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); 471 if (animList) { 472 for (size_t i = 0; i < animList->size(); ++i) 473 list->append(CSSPrimitiveValue::create(animList->animation(i)->delay(), CSSPrimitiveValue::CSS_S)); 474 } else { 475 // Note that initialAnimationDelay() is used for both transitions and animations 476 list->append(CSSPrimitiveValue::create(Animation::initialAnimationDelay(), CSSPrimitiveValue::CSS_S)); 477 } 478 return list.release(); 479 } 480 481 static PassRefPtr<CSSValue> getDurationValue(const AnimationList* animList) 482 { 483 RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); 484 if (animList) { 485 for (size_t i = 0; i < animList->size(); ++i) 486 list->append(CSSPrimitiveValue::create(animList->animation(i)->duration(), CSSPrimitiveValue::CSS_S)); 487 } else { 488 // Note that initialAnimationDuration() is used for both transitions and animations 489 list->append(CSSPrimitiveValue::create(Animation::initialAnimationDuration(), CSSPrimitiveValue::CSS_S)); 490 } 491 return list.release(); 492 } 493 494 static PassRefPtr<CSSValue> getTimingFunctionValue(const AnimationList* animList) 495 { 496 RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); 497 if (animList) { 498 for (size_t i = 0; i < animList->size(); ++i) { 499 const TimingFunction& tf = animList->animation(i)->timingFunction(); 500 list->append(CSSTimingFunctionValue::create(tf.x1(), tf.y1(), tf.x2(), tf.y2())); 501 } 502 } else { 503 // Note that initialAnimationTimingFunction() is used for both transitions and animations 504 const TimingFunction& tf = Animation::initialAnimationTimingFunction(); 505 list->append(CSSTimingFunctionValue::create(tf.x1(), tf.y1(), tf.x2(), tf.y2())); 506 } 507 return list.release(); 508 } 509 510 CSSComputedStyleDeclaration::CSSComputedStyleDeclaration(PassRefPtr<Node> n) 511 : m_node(n) 512 { 513 } 514 515 CSSComputedStyleDeclaration::~CSSComputedStyleDeclaration() 516 { 517 } 518 519 String CSSComputedStyleDeclaration::cssText() const 520 { 521 String result(""); 522 523 for (unsigned i = 0; i < numComputedProperties; i++) { 524 if (i) 525 result += " "; 526 result += getPropertyName(static_cast<CSSPropertyID>(computedProperties[i])); 527 result += ": "; 528 result += getPropertyValue(computedProperties[i]); 529 result += ";"; 530 } 531 532 return result; 533 } 534 535 void CSSComputedStyleDeclaration::setCssText(const String&, ExceptionCode& ec) 536 { 537 ec = NO_MODIFICATION_ALLOWED_ERR; 538 } 539 540 static int cssIdentifierForFontSizeKeyword(int keywordSize) 541 { 542 ASSERT_ARG(keywordSize, keywordSize); 543 ASSERT_ARG(keywordSize, keywordSize <= 8); 544 return CSSValueXxSmall + keywordSize - 1; 545 } 546 547 PassRefPtr<CSSValue> CSSComputedStyleDeclaration::getFontSizeCSSValuePreferringKeyword() const 548 { 549 Node* node = m_node.get(); 550 if (!node) 551 return 0; 552 553 node->document()->updateLayoutIgnorePendingStylesheets(); 554 555 RefPtr<RenderStyle> style = node->computedStyle(); 556 if (!style) 557 return 0; 558 559 if (int keywordSize = style->fontDescription().keywordSize()) 560 return CSSPrimitiveValue::createIdentifier(cssIdentifierForFontSizeKeyword(keywordSize)); 561 562 return CSSPrimitiveValue::create(style->fontDescription().computedPixelSize(), CSSPrimitiveValue::CSS_PX); 563 } 564 565 PassRefPtr<CSSValue> CSSComputedStyleDeclaration::valueForShadow(const ShadowData* shadow, int id) const 566 { 567 if (!shadow) 568 return CSSPrimitiveValue::createIdentifier(CSSValueNone); 569 570 CSSPropertyID propertyID = static_cast<CSSPropertyID>(id); 571 572 RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); 573 for (const ShadowData* s = shadow; s; s = s->next) { 574 RefPtr<CSSPrimitiveValue> x = CSSPrimitiveValue::create(s->x, CSSPrimitiveValue::CSS_PX); 575 RefPtr<CSSPrimitiveValue> y = CSSPrimitiveValue::create(s->y, CSSPrimitiveValue::CSS_PX); 576 RefPtr<CSSPrimitiveValue> blur = CSSPrimitiveValue::create(s->blur, CSSPrimitiveValue::CSS_PX); 577 RefPtr<CSSPrimitiveValue> spread = propertyID == CSSPropertyTextShadow ? 0 : CSSPrimitiveValue::create(s->spread, CSSPrimitiveValue::CSS_PX); 578 RefPtr<CSSPrimitiveValue> style = propertyID == CSSPropertyTextShadow || s->style == Normal ? 0 : CSSPrimitiveValue::createIdentifier(CSSValueInset); 579 RefPtr<CSSPrimitiveValue> color = CSSPrimitiveValue::createColor(s->color.rgb()); 580 list->prepend(ShadowValue::create(x.release(), y.release(), blur.release(), spread.release(), style.release(), color.release())); 581 } 582 return list.release(); 583 } 584 585 PassRefPtr<CSSValue> CSSComputedStyleDeclaration::getPropertyCSSValue(int propertyID) const 586 { 587 return getPropertyCSSValue(propertyID, UpdateLayout); 588 } 589 590 static int identifierForFamily(const AtomicString& family) 591 { 592 DEFINE_STATIC_LOCAL(AtomicString, cursiveFamily, ("-webkit-cursive")); 593 DEFINE_STATIC_LOCAL(AtomicString, fantasyFamily, ("-webkit-fantasy")); 594 DEFINE_STATIC_LOCAL(AtomicString, monospaceFamily, ("-webkit-monospace")); 595 DEFINE_STATIC_LOCAL(AtomicString, sansSerifFamily, ("-webkit-sans-serif")); 596 DEFINE_STATIC_LOCAL(AtomicString, serifFamily, ("-webkit-serif")); 597 if (family == cursiveFamily) 598 return CSSValueCursive; 599 if (family == fantasyFamily) 600 return CSSValueFantasy; 601 if (family == monospaceFamily) 602 return CSSValueMonospace; 603 if (family == sansSerifFamily) 604 return CSSValueSansSerif; 605 if (family == serifFamily) 606 return CSSValueSerif; 607 return 0; 608 } 609 610 static PassRefPtr<CSSPrimitiveValue> valueForFamily(const AtomicString& family) 611 { 612 if (int familyIdentifier = identifierForFamily(family)) 613 return CSSPrimitiveValue::createIdentifier(familyIdentifier); 614 return CSSPrimitiveValue::create(family.string(), CSSPrimitiveValue::CSS_STRING); 615 } 616 617 static PassRefPtr<CSSValue> renderTextDecorationFlagsToCSSValue(int textDecoration) 618 { 619 RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); 620 if (textDecoration & UNDERLINE) 621 list->append(CSSPrimitiveValue::createIdentifier(CSSValueUnderline)); 622 if (textDecoration & OVERLINE) 623 list->append(CSSPrimitiveValue::createIdentifier(CSSValueOverline)); 624 if (textDecoration & LINE_THROUGH) 625 list->append(CSSPrimitiveValue::createIdentifier(CSSValueLineThrough)); 626 if (textDecoration & BLINK) 627 list->append(CSSPrimitiveValue::createIdentifier(CSSValueBlink)); 628 629 if (!list->length()) 630 return CSSPrimitiveValue::createIdentifier(CSSValueNone); 631 return list; 632 } 633 634 static PassRefPtr<CSSValue> fillRepeatToCSSValue(EFillRepeat xRepeat, EFillRepeat yRepeat) 635 { 636 // For backwards compatibility, if both values are equal, just return one of them. And 637 // if the two values are equivalent to repeat-x or repeat-y, just return the shorthand. 638 if (xRepeat == yRepeat) 639 return CSSPrimitiveValue::create(xRepeat); 640 if (xRepeat == CSSValueRepeat && yRepeat == CSSValueNoRepeat) 641 return CSSPrimitiveValue::createIdentifier(CSSValueRepeatX); 642 if (xRepeat == CSSValueNoRepeat && yRepeat == CSSValueRepeat) 643 return CSSPrimitiveValue::createIdentifier(CSSValueRepeatY); 644 645 RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); 646 list->append(CSSPrimitiveValue::create(xRepeat)); 647 list->append(CSSPrimitiveValue::create(yRepeat)); 648 return list.release(); 649 } 650 651 static void logUnimplementedPropertyID(int propertyID) 652 { 653 DEFINE_STATIC_LOCAL(HashSet<int>, propertyIDSet, ()); 654 if (!propertyIDSet.add(propertyID).second) 655 return; 656 657 LOG_ERROR("WebKit does not yet implement getComputedStyle for '%s'.", getPropertyName(static_cast<CSSPropertyID>(propertyID))); 658 } 659 660 PassRefPtr<CSSValue> CSSComputedStyleDeclaration::getPropertyCSSValue(int propertyID, EUpdateLayout updateLayout) const 661 { 662 Node* node = m_node.get(); 663 if (!node) 664 return 0; 665 666 // Make sure our layout is up to date before we allow a query on these attributes. 667 if (updateLayout) 668 node->document()->updateLayoutIgnorePendingStylesheets(); 669 670 RenderObject* renderer = node->renderer(); 671 672 RefPtr<RenderStyle> style; 673 if (renderer && hasCompositedLayer(renderer) && AnimationController::supportsAcceleratedAnimationOfProperty(static_cast<CSSPropertyID>(propertyID))) 674 style = renderer->animation()->getAnimatedStyleForRenderer(renderer); 675 else 676 style = node->computedStyle(); 677 if (!style) 678 return 0; 679 680 #ifdef ANDROID_LAYOUT 681 const Settings * settings = node->document()->frame() ? node->document()->frame()->settings() : 0; 682 #endif 683 684 switch (static_cast<CSSPropertyID>(propertyID)) { 685 case CSSPropertyInvalid: 686 break; 687 688 case CSSPropertyBackgroundColor: 689 return CSSPrimitiveValue::createColor(style->backgroundColor().rgb()); 690 case CSSPropertyBackgroundImage: 691 if (style->backgroundImage()) 692 return style->backgroundImage()->cssValue(); 693 return CSSPrimitiveValue::createIdentifier(CSSValueNone); 694 case CSSPropertyBackgroundSize: 695 case CSSPropertyWebkitBackgroundSize: { 696 EFillSizeType size = style->backgroundSizeType(); 697 if (size == Contain) 698 return CSSPrimitiveValue::createIdentifier(CSSValueContain); 699 if (size == Cover) 700 return CSSPrimitiveValue::createIdentifier(CSSValueCover); 701 RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); 702 list->append(CSSPrimitiveValue::create(style->backgroundSizeLength().width())); 703 list->append(CSSPrimitiveValue::create(style->backgroundSizeLength().height())); 704 return list.release(); 705 } 706 case CSSPropertyBackgroundRepeat: 707 return fillRepeatToCSSValue(style->backgroundRepeatX(), style->backgroundRepeatY()); 708 case CSSPropertyWebkitBackgroundComposite: 709 return CSSPrimitiveValue::create(style->backgroundComposite()); 710 case CSSPropertyBackgroundAttachment: 711 return CSSPrimitiveValue::create(style->backgroundAttachment()); 712 case CSSPropertyBackgroundClip: 713 case CSSPropertyBackgroundOrigin: 714 case CSSPropertyWebkitBackgroundClip: 715 case CSSPropertyWebkitBackgroundOrigin: { 716 EFillBox box = (propertyID == CSSPropertyWebkitBackgroundClip || propertyID == CSSPropertyBackgroundClip) ? style->backgroundClip() : style->backgroundOrigin(); 717 return CSSPrimitiveValue::create(box); 718 } 719 case CSSPropertyBackgroundPosition: { 720 RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); 721 722 list->append(CSSPrimitiveValue::create(style->backgroundXPosition())); 723 list->append(CSSPrimitiveValue::create(style->backgroundYPosition())); 724 725 return list.release(); 726 } 727 case CSSPropertyBackgroundPositionX: 728 return CSSPrimitiveValue::create(style->backgroundXPosition()); 729 case CSSPropertyBackgroundPositionY: 730 return CSSPrimitiveValue::create(style->backgroundYPosition()); 731 case CSSPropertyBorderCollapse: 732 if (style->borderCollapse()) 733 return CSSPrimitiveValue::createIdentifier(CSSValueCollapse); 734 return CSSPrimitiveValue::createIdentifier(CSSValueSeparate); 735 case CSSPropertyBorderSpacing: { 736 RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); 737 list->append(CSSPrimitiveValue::create(style->horizontalBorderSpacing(), CSSPrimitiveValue::CSS_PX)); 738 list->append(CSSPrimitiveValue::create(style->verticalBorderSpacing(), CSSPrimitiveValue::CSS_PX)); 739 return list.release(); 740 } 741 case CSSPropertyWebkitBorderHorizontalSpacing: 742 return CSSPrimitiveValue::create(style->horizontalBorderSpacing(), CSSPrimitiveValue::CSS_PX); 743 case CSSPropertyWebkitBorderVerticalSpacing: 744 return CSSPrimitiveValue::create(style->verticalBorderSpacing(), CSSPrimitiveValue::CSS_PX); 745 case CSSPropertyBorderTopColor: 746 return currentColorOrValidColor(style.get(), style->borderTopColor()); 747 case CSSPropertyBorderRightColor: 748 return currentColorOrValidColor(style.get(), style->borderRightColor()); 749 case CSSPropertyBorderBottomColor: 750 return currentColorOrValidColor(style.get(), style->borderBottomColor()); 751 case CSSPropertyBorderLeftColor: 752 return currentColorOrValidColor(style.get(), style->borderLeftColor()); 753 case CSSPropertyBorderTopStyle: 754 return CSSPrimitiveValue::create(style->borderTopStyle()); 755 case CSSPropertyBorderRightStyle: 756 return CSSPrimitiveValue::create(style->borderRightStyle()); 757 case CSSPropertyBorderBottomStyle: 758 return CSSPrimitiveValue::create(style->borderBottomStyle()); 759 case CSSPropertyBorderLeftStyle: 760 return CSSPrimitiveValue::create(style->borderLeftStyle()); 761 case CSSPropertyBorderTopWidth: 762 return CSSPrimitiveValue::create(style->borderTopWidth(), CSSPrimitiveValue::CSS_PX); 763 case CSSPropertyBorderRightWidth: 764 return CSSPrimitiveValue::create(style->borderRightWidth(), CSSPrimitiveValue::CSS_PX); 765 case CSSPropertyBorderBottomWidth: 766 return CSSPrimitiveValue::create(style->borderBottomWidth(), CSSPrimitiveValue::CSS_PX); 767 case CSSPropertyBorderLeftWidth: 768 return CSSPrimitiveValue::create(style->borderLeftWidth(), CSSPrimitiveValue::CSS_PX); 769 case CSSPropertyBottom: 770 return getPositionOffsetValue(style.get(), CSSPropertyBottom); 771 case CSSPropertyWebkitBoxAlign: 772 return CSSPrimitiveValue::create(style->boxAlign()); 773 case CSSPropertyWebkitBoxDirection: 774 return CSSPrimitiveValue::create(style->boxDirection()); 775 case CSSPropertyWebkitBoxFlex: 776 return CSSPrimitiveValue::create(style->boxFlex(), CSSPrimitiveValue::CSS_NUMBER); 777 case CSSPropertyWebkitBoxFlexGroup: 778 return CSSPrimitiveValue::create(style->boxFlexGroup(), CSSPrimitiveValue::CSS_NUMBER); 779 case CSSPropertyWebkitBoxLines: 780 return CSSPrimitiveValue::create(style->boxLines()); 781 case CSSPropertyWebkitBoxOrdinalGroup: 782 return CSSPrimitiveValue::create(style->boxOrdinalGroup(), CSSPrimitiveValue::CSS_NUMBER); 783 case CSSPropertyWebkitBoxOrient: 784 return CSSPrimitiveValue::create(style->boxOrient()); 785 case CSSPropertyWebkitBoxPack: { 786 EBoxAlignment boxPack = style->boxPack(); 787 ASSERT(boxPack != BSTRETCH); 788 ASSERT(boxPack != BBASELINE); 789 if (boxPack == BJUSTIFY || boxPack== BBASELINE) 790 return 0; 791 return CSSPrimitiveValue::create(boxPack); 792 } 793 case CSSPropertyWebkitBoxReflect: 794 return valueForReflection(style->boxReflect()); 795 case CSSPropertyWebkitBoxShadow: 796 return valueForShadow(style->boxShadow(), propertyID); 797 case CSSPropertyCaptionSide: 798 return CSSPrimitiveValue::create(style->captionSide()); 799 case CSSPropertyClear: 800 return CSSPrimitiveValue::create(style->clear()); 801 case CSSPropertyColor: 802 return CSSPrimitiveValue::createColor(style->color().rgb()); 803 case CSSPropertyWebkitColumnCount: 804 if (style->hasAutoColumnCount()) 805 return CSSPrimitiveValue::createIdentifier(CSSValueAuto); 806 return CSSPrimitiveValue::create(style->columnCount(), CSSPrimitiveValue::CSS_NUMBER); 807 case CSSPropertyWebkitColumnGap: 808 if (style->hasNormalColumnGap()) 809 return CSSPrimitiveValue::createIdentifier(CSSValueNormal); 810 return CSSPrimitiveValue::create(style->columnGap(), CSSPrimitiveValue::CSS_NUMBER); 811 case CSSPropertyWebkitColumnRuleColor: 812 return currentColorOrValidColor(style.get(), style->columnRuleColor()); 813 case CSSPropertyWebkitColumnRuleStyle: 814 return CSSPrimitiveValue::create(style->columnRuleStyle()); 815 case CSSPropertyWebkitColumnRuleWidth: 816 return CSSPrimitiveValue::create(style->columnRuleWidth(), CSSPrimitiveValue::CSS_PX); 817 case CSSPropertyWebkitColumnBreakAfter: 818 return CSSPrimitiveValue::create(style->columnBreakAfter()); 819 case CSSPropertyWebkitColumnBreakBefore: 820 return CSSPrimitiveValue::create(style->columnBreakBefore()); 821 case CSSPropertyWebkitColumnBreakInside: 822 return CSSPrimitiveValue::create(style->columnBreakInside()); 823 case CSSPropertyWebkitColumnWidth: 824 if (style->hasAutoColumnWidth()) 825 return CSSPrimitiveValue::createIdentifier(CSSValueAuto); 826 return CSSPrimitiveValue::create(style->columnWidth(), CSSPrimitiveValue::CSS_NUMBER); 827 case CSSPropertyCursor: { 828 RefPtr<CSSValueList> list; 829 CursorList* cursors = style->cursors(); 830 if (cursors && cursors->size() > 0) { 831 list = CSSValueList::createCommaSeparated(); 832 for (unsigned i = 0; i < cursors->size(); ++i) 833 list->append(CSSPrimitiveValue::create((*cursors)[i].cursorImage->url(), CSSPrimitiveValue::CSS_URI)); 834 } 835 RefPtr<CSSValue> value = CSSPrimitiveValue::create(style->cursor()); 836 if (list) { 837 list->append(value); 838 return list.release(); 839 } 840 return value.release(); 841 } 842 case CSSPropertyDirection: 843 return CSSPrimitiveValue::create(style->direction()); 844 case CSSPropertyDisplay: 845 return CSSPrimitiveValue::create(style->display()); 846 case CSSPropertyEmptyCells: 847 return CSSPrimitiveValue::create(style->emptyCells()); 848 case CSSPropertyFloat: 849 #ifdef ANDROID_LAYOUT 850 if (settings && settings->layoutAlgorithm() == Settings::kLayoutSSR) 851 return CSSPrimitiveValue::createIdentifier(CSSValueNone); 852 #endif 853 return CSSPrimitiveValue::create(style->floating()); 854 case CSSPropertyFontFamily: { 855 const FontFamily& firstFamily = style->fontDescription().family(); 856 if (!firstFamily.next()) 857 return valueForFamily(firstFamily.family()); 858 RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); 859 for (const FontFamily* family = &firstFamily; family; family = family->next()) 860 list->append(valueForFamily(family->family())); 861 return list.release(); 862 } 863 case CSSPropertyFontSize: 864 return CSSPrimitiveValue::create(style->fontDescription().computedPixelSize(), CSSPrimitiveValue::CSS_PX); 865 case CSSPropertyWebkitBinding: 866 break; 867 case CSSPropertyFontStyle: 868 if (style->fontDescription().italic()) 869 return CSSPrimitiveValue::createIdentifier(CSSValueItalic); 870 return CSSPrimitiveValue::createIdentifier(CSSValueNormal); 871 case CSSPropertyFontVariant: 872 if (style->fontDescription().smallCaps()) 873 return CSSPrimitiveValue::createIdentifier(CSSValueSmallCaps); 874 return CSSPrimitiveValue::createIdentifier(CSSValueNormal); 875 case CSSPropertyFontWeight: 876 switch (style->fontDescription().weight()) { 877 case FontWeight100: 878 return CSSPrimitiveValue::createIdentifier(CSSValue100); 879 case FontWeight200: 880 return CSSPrimitiveValue::createIdentifier(CSSValue200); 881 case FontWeight300: 882 return CSSPrimitiveValue::createIdentifier(CSSValue300); 883 case FontWeightNormal: 884 return CSSPrimitiveValue::createIdentifier(CSSValueNormal); 885 case FontWeight500: 886 return CSSPrimitiveValue::createIdentifier(CSSValue500); 887 case FontWeight600: 888 return CSSPrimitiveValue::createIdentifier(CSSValue600); 889 case FontWeightBold: 890 return CSSPrimitiveValue::createIdentifier(CSSValueBold); 891 case FontWeight800: 892 return CSSPrimitiveValue::createIdentifier(CSSValue800); 893 case FontWeight900: 894 return CSSPrimitiveValue::createIdentifier(CSSValue900); 895 } 896 ASSERT_NOT_REACHED(); 897 return CSSPrimitiveValue::createIdentifier(CSSValueNormal); 898 case CSSPropertyHeight: 899 if (renderer) 900 return CSSPrimitiveValue::create(sizingBox(renderer).height(), CSSPrimitiveValue::CSS_PX); 901 return CSSPrimitiveValue::create(style->height()); 902 case CSSPropertyWebkitHighlight: 903 if (style->highlight() == nullAtom) 904 return CSSPrimitiveValue::createIdentifier(CSSValueNone); 905 return CSSPrimitiveValue::create(style->highlight(), CSSPrimitiveValue::CSS_STRING); 906 case CSSPropertyWebkitBorderFit: 907 if (style->borderFit() == BorderFitBorder) 908 return CSSPrimitiveValue::createIdentifier(CSSValueBorder); 909 return CSSPrimitiveValue::createIdentifier(CSSValueLines); 910 case CSSPropertyLeft: 911 return getPositionOffsetValue(style.get(), CSSPropertyLeft); 912 case CSSPropertyLetterSpacing: 913 if (!style->letterSpacing()) 914 return CSSPrimitiveValue::createIdentifier(CSSValueNormal); 915 return CSSPrimitiveValue::create(style->letterSpacing(), CSSPrimitiveValue::CSS_PX); 916 case CSSPropertyWebkitLineClamp: 917 if (style->lineClamp().isNone()) 918 return CSSPrimitiveValue::createIdentifier(CSSValueNone); 919 return CSSPrimitiveValue::create(style->lineClamp().value(), style->lineClamp().isPercentage() ? CSSPrimitiveValue::CSS_PERCENTAGE : CSSPrimitiveValue::CSS_NUMBER); 920 case CSSPropertyLineHeight: { 921 Length length = style->lineHeight(); 922 if (length.isNegative()) 923 return CSSPrimitiveValue::createIdentifier(CSSValueNormal); 924 if (length.isPercent()) 925 // This is imperfect, because it doesn't include the zoom factor and the real computation 926 // for how high to be in pixels does include things like minimum font size and the zoom factor. 927 // On the other hand, since font-size doesn't include the zoom factor, we really can't do 928 // that here either. 929 return CSSPrimitiveValue::create(static_cast<int>(length.percent() * style->fontDescription().specifiedSize()) / 100, CSSPrimitiveValue::CSS_PX); 930 return CSSPrimitiveValue::create(length.value(), CSSPrimitiveValue::CSS_PX); 931 } 932 case CSSPropertyListStyleImage: 933 if (style->listStyleImage()) 934 return style->listStyleImage()->cssValue(); 935 return CSSPrimitiveValue::createIdentifier(CSSValueNone); 936 case CSSPropertyListStylePosition: 937 return CSSPrimitiveValue::create(style->listStylePosition()); 938 case CSSPropertyListStyleType: 939 return CSSPrimitiveValue::create(style->listStyleType()); 940 case CSSPropertyMarginTop: 941 if (renderer && renderer->isBox()) 942 // FIXME: Supposed to return the percentage if percentage was specified. 943 return CSSPrimitiveValue::create(toRenderBox(renderer)->marginTop(), CSSPrimitiveValue::CSS_PX); 944 return CSSPrimitiveValue::create(style->marginTop()); 945 case CSSPropertyMarginRight: 946 if (renderer && renderer->isBox()) 947 // FIXME: Supposed to return the percentage if percentage was specified. 948 return CSSPrimitiveValue::create(toRenderBox(renderer)->marginRight(), CSSPrimitiveValue::CSS_PX); 949 return CSSPrimitiveValue::create(style->marginRight()); 950 case CSSPropertyMarginBottom: 951 if (renderer && renderer->isBox()) 952 // FIXME: Supposed to return the percentage if percentage was specified. 953 return CSSPrimitiveValue::create(toRenderBox(renderer)->marginBottom(), CSSPrimitiveValue::CSS_PX); 954 return CSSPrimitiveValue::create(style->marginBottom()); 955 case CSSPropertyMarginLeft: 956 if (renderer && renderer->isBox()) 957 // FIXME: Supposed to return the percentage if percentage was specified. 958 return CSSPrimitiveValue::create(toRenderBox(renderer)->marginLeft(), CSSPrimitiveValue::CSS_PX); 959 return CSSPrimitiveValue::create(style->marginLeft()); 960 case CSSPropertyWebkitMarqueeDirection: 961 return CSSPrimitiveValue::create(style->marqueeDirection()); 962 case CSSPropertyWebkitMarqueeIncrement: 963 return CSSPrimitiveValue::create(style->marqueeIncrement()); 964 case CSSPropertyWebkitMarqueeRepetition: 965 if (style->marqueeLoopCount() < 0) 966 return CSSPrimitiveValue::createIdentifier(CSSValueInfinite); 967 return CSSPrimitiveValue::create(style->marqueeLoopCount(), CSSPrimitiveValue::CSS_NUMBER); 968 case CSSPropertyWebkitMarqueeStyle: 969 return CSSPrimitiveValue::create(style->marqueeBehavior()); 970 case CSSPropertyWebkitMaskImage: 971 if (style->maskImage()) 972 return style->maskImage()->cssValue(); 973 return CSSPrimitiveValue::createIdentifier(CSSValueNone); 974 case CSSPropertyWebkitMaskSize: { 975 RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); 976 list->append(CSSPrimitiveValue::create(style->maskSize().width())); 977 list->append(CSSPrimitiveValue::create(style->maskSize().height())); 978 return list.release(); 979 } 980 case CSSPropertyWebkitMaskRepeat: 981 return fillRepeatToCSSValue(style->maskRepeatX(), style->maskRepeatY()); 982 case CSSPropertyWebkitMaskAttachment: 983 return CSSPrimitiveValue::create(style->maskAttachment()); 984 case CSSPropertyWebkitMaskComposite: 985 return CSSPrimitiveValue::create(style->maskComposite()); 986 case CSSPropertyWebkitMaskClip: 987 case CSSPropertyWebkitMaskOrigin: { 988 EFillBox box = (propertyID == CSSPropertyWebkitMaskClip ? style->maskClip() : style->maskOrigin()); 989 return CSSPrimitiveValue::create(box); 990 } 991 case CSSPropertyWebkitMaskPosition: { 992 RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); 993 994 list->append(CSSPrimitiveValue::create(style->maskXPosition())); 995 list->append(CSSPrimitiveValue::create(style->maskYPosition())); 996 997 return list.release(); 998 } 999 case CSSPropertyWebkitMaskPositionX: 1000 return CSSPrimitiveValue::create(style->maskXPosition()); 1001 case CSSPropertyWebkitMaskPositionY: 1002 return CSSPrimitiveValue::create(style->maskYPosition()); 1003 case CSSPropertyWebkitUserModify: 1004 return CSSPrimitiveValue::create(style->userModify()); 1005 case CSSPropertyMaxHeight: { 1006 const Length& maxHeight = style->maxHeight(); 1007 if (maxHeight.isFixed() && maxHeight.value() == undefinedLength) 1008 return CSSPrimitiveValue::createIdentifier(CSSValueNone); 1009 return CSSPrimitiveValue::create(maxHeight); 1010 } 1011 case CSSPropertyMaxWidth: { 1012 const Length& maxWidth = style->maxWidth(); 1013 if (maxWidth.isFixed() && maxWidth.value() == undefinedLength) 1014 return CSSPrimitiveValue::createIdentifier(CSSValueNone); 1015 return CSSPrimitiveValue::create(maxWidth); 1016 } 1017 case CSSPropertyMinHeight: 1018 return CSSPrimitiveValue::create(style->minHeight()); 1019 case CSSPropertyMinWidth: 1020 return CSSPrimitiveValue::create(style->minWidth()); 1021 case CSSPropertyOpacity: 1022 return CSSPrimitiveValue::create(style->opacity(), CSSPrimitiveValue::CSS_NUMBER); 1023 case CSSPropertyOrphans: 1024 return CSSPrimitiveValue::create(style->orphans(), CSSPrimitiveValue::CSS_NUMBER); 1025 case CSSPropertyOutlineColor: 1026 return currentColorOrValidColor(style.get(), style->outlineColor()); 1027 case CSSPropertyOutlineStyle: 1028 if (style->outlineStyleIsAuto()) 1029 return CSSPrimitiveValue::createIdentifier(CSSValueAuto); 1030 return CSSPrimitiveValue::create(style->outlineStyle()); 1031 case CSSPropertyOutlineWidth: 1032 return CSSPrimitiveValue::create(style->outlineWidth(), CSSPrimitiveValue::CSS_PX); 1033 case CSSPropertyOverflow: 1034 return CSSPrimitiveValue::create(max(style->overflowX(), style->overflowY())); 1035 case CSSPropertyOverflowX: 1036 return CSSPrimitiveValue::create(style->overflowX()); 1037 case CSSPropertyOverflowY: 1038 #ifdef ANDROID_LAYOUT 1039 if (settings && settings->layoutAlgorithm() == Settings::kLayoutSSR) 1040 return CSSPrimitiveValue::createIdentifier(CSSValueVisible); 1041 #endif 1042 return CSSPrimitiveValue::create(style->overflowY()); 1043 case CSSPropertyPaddingTop: 1044 if (renderer && renderer->isBox()) 1045 return CSSPrimitiveValue::create(toRenderBox(renderer)->paddingTop(false), CSSPrimitiveValue::CSS_PX); 1046 return CSSPrimitiveValue::create(style->paddingTop()); 1047 case CSSPropertyPaddingRight: 1048 if (renderer && renderer->isBox()) 1049 return CSSPrimitiveValue::create(toRenderBox(renderer)->paddingRight(false), CSSPrimitiveValue::CSS_PX); 1050 return CSSPrimitiveValue::create(style->paddingRight()); 1051 case CSSPropertyPaddingBottom: 1052 if (renderer && renderer->isBox()) 1053 return CSSPrimitiveValue::create(toRenderBox(renderer)->paddingBottom(false), CSSPrimitiveValue::CSS_PX); 1054 return CSSPrimitiveValue::create(style->paddingBottom()); 1055 case CSSPropertyPaddingLeft: 1056 if (renderer && renderer->isBox()) 1057 return CSSPrimitiveValue::create(toRenderBox(renderer)->paddingLeft(false), CSSPrimitiveValue::CSS_PX); 1058 return CSSPrimitiveValue::create(style->paddingLeft()); 1059 case CSSPropertyPageBreakAfter: 1060 return CSSPrimitiveValue::create(style->pageBreakAfter()); 1061 case CSSPropertyPageBreakBefore: 1062 return CSSPrimitiveValue::create(style->pageBreakBefore()); 1063 case CSSPropertyPageBreakInside: { 1064 EPageBreak pageBreak = style->pageBreakInside(); 1065 ASSERT(pageBreak != PBALWAYS); 1066 if (pageBreak == PBALWAYS) 1067 return 0; 1068 return CSSPrimitiveValue::create(style->pageBreakInside()); 1069 } 1070 case CSSPropertyPosition: 1071 #ifdef ANDROID_LAYOUT 1072 if (settings && settings->layoutAlgorithm() == Settings::kLayoutSSR) 1073 return CSSPrimitiveValue::createIdentifier(CSSValueStatic); 1074 #endif 1075 return CSSPrimitiveValue::create(style->position()); 1076 case CSSPropertyRight: 1077 return getPositionOffsetValue(style.get(), CSSPropertyRight); 1078 case CSSPropertyTableLayout: 1079 return CSSPrimitiveValue::create(style->tableLayout()); 1080 case CSSPropertyTextAlign: 1081 return CSSPrimitiveValue::create(style->textAlign()); 1082 case CSSPropertyTextDecoration: 1083 return renderTextDecorationFlagsToCSSValue(style->textDecoration()); 1084 case CSSPropertyWebkitTextDecorationsInEffect: 1085 return renderTextDecorationFlagsToCSSValue(style->textDecorationsInEffect()); 1086 case CSSPropertyWebkitTextFillColor: 1087 return currentColorOrValidColor(style.get(), style->textFillColor()); 1088 case CSSPropertyTextIndent: 1089 return CSSPrimitiveValue::create(style->textIndent()); 1090 case CSSPropertyTextShadow: 1091 return valueForShadow(style->textShadow(), propertyID); 1092 case CSSPropertyTextRendering: 1093 return CSSPrimitiveValue::create(style->fontDescription().textRenderingMode()); 1094 case CSSPropertyTextOverflow: 1095 if (style->textOverflow()) 1096 return CSSPrimitiveValue::createIdentifier(CSSValueEllipsis); 1097 return CSSPrimitiveValue::createIdentifier(CSSValueClip); 1098 case CSSPropertyWebkitTextSecurity: 1099 return CSSPrimitiveValue::create(style->textSecurity()); 1100 case CSSPropertyWebkitTextSizeAdjust: 1101 if (style->textSizeAdjust()) 1102 return CSSPrimitiveValue::createIdentifier(CSSValueAuto); 1103 return CSSPrimitiveValue::createIdentifier(CSSValueNone); 1104 case CSSPropertyWebkitTextStrokeColor: 1105 return currentColorOrValidColor(style.get(), style->textStrokeColor()); 1106 case CSSPropertyWebkitTextStrokeWidth: 1107 return CSSPrimitiveValue::create(style->textStrokeWidth(), CSSPrimitiveValue::CSS_PX); 1108 case CSSPropertyTextTransform: 1109 return CSSPrimitiveValue::create(style->textTransform()); 1110 case CSSPropertyTop: 1111 return getPositionOffsetValue(style.get(), CSSPropertyTop); 1112 case CSSPropertyUnicodeBidi: 1113 return CSSPrimitiveValue::create(style->unicodeBidi()); 1114 case CSSPropertyVerticalAlign: 1115 switch (style->verticalAlign()) { 1116 case BASELINE: 1117 return CSSPrimitiveValue::createIdentifier(CSSValueBaseline); 1118 case MIDDLE: 1119 return CSSPrimitiveValue::createIdentifier(CSSValueMiddle); 1120 case SUB: 1121 return CSSPrimitiveValue::createIdentifier(CSSValueSub); 1122 case SUPER: 1123 return CSSPrimitiveValue::createIdentifier(CSSValueSuper); 1124 case TEXT_TOP: 1125 return CSSPrimitiveValue::createIdentifier(CSSValueTextTop); 1126 case TEXT_BOTTOM: 1127 return CSSPrimitiveValue::createIdentifier(CSSValueTextBottom); 1128 case TOP: 1129 return CSSPrimitiveValue::createIdentifier(CSSValueTop); 1130 case BOTTOM: 1131 return CSSPrimitiveValue::createIdentifier(CSSValueBottom); 1132 case BASELINE_MIDDLE: 1133 return CSSPrimitiveValue::createIdentifier(CSSValueWebkitBaselineMiddle); 1134 case LENGTH: 1135 return CSSPrimitiveValue::create(style->verticalAlignLength()); 1136 } 1137 ASSERT_NOT_REACHED(); 1138 return 0; 1139 case CSSPropertyVisibility: 1140 #ifdef ANDROID_LAYOUT 1141 if (settings && settings->layoutAlgorithm() == Settings::kLayoutSSR) 1142 return CSSPrimitiveValue::createIdentifier(CSSValueVisible); 1143 #endif 1144 return CSSPrimitiveValue::create(style->visibility()); 1145 case CSSPropertyWhiteSpace: 1146 #ifdef ANDROID_LAYOUT 1147 if (settings && settings->layoutAlgorithm() == Settings::kLayoutSSR) 1148 switch (style->whiteSpace()) { 1149 case NORMAL: 1150 case NOWRAP: 1151 case KHTML_NOWRAP: 1152 return CSSPrimitiveValue::createIdentifier(CSSValueNormal); 1153 case PRE: 1154 case PRE_WRAP: 1155 return CSSPrimitiveValue::createIdentifier(CSSValuePreWrap); 1156 case PRE_LINE: 1157 return CSSPrimitiveValue::createIdentifier(CSSValuePreLine); 1158 } 1159 else 1160 #endif 1161 return CSSPrimitiveValue::create(style->whiteSpace()); 1162 case CSSPropertyWidows: 1163 return CSSPrimitiveValue::create(style->widows(), CSSPrimitiveValue::CSS_NUMBER); 1164 case CSSPropertyWidth: 1165 if (renderer) 1166 return CSSPrimitiveValue::create(sizingBox(renderer).width(), CSSPrimitiveValue::CSS_PX); 1167 return CSSPrimitiveValue::create(style->width()); 1168 case CSSPropertyWordBreak: 1169 return CSSPrimitiveValue::create(style->wordBreak()); 1170 case CSSPropertyWordSpacing: 1171 return CSSPrimitiveValue::create(style->wordSpacing(), CSSPrimitiveValue::CSS_PX); 1172 case CSSPropertyWordWrap: 1173 return CSSPrimitiveValue::create(style->wordWrap()); 1174 case CSSPropertyWebkitLineBreak: 1175 return CSSPrimitiveValue::create(style->khtmlLineBreak()); 1176 case CSSPropertyWebkitNbspMode: 1177 return CSSPrimitiveValue::create(style->nbspMode()); 1178 case CSSPropertyWebkitMatchNearestMailBlockquoteColor: 1179 return CSSPrimitiveValue::create(style->matchNearestMailBlockquoteColor()); 1180 case CSSPropertyResize: 1181 return CSSPrimitiveValue::create(style->resize()); 1182 case CSSPropertyWebkitFontSmoothing: 1183 return CSSPrimitiveValue::create(style->fontDescription().fontSmoothing()); 1184 case CSSPropertyZIndex: 1185 if (style->hasAutoZIndex()) 1186 return CSSPrimitiveValue::createIdentifier(CSSValueAuto); 1187 return CSSPrimitiveValue::create(style->zIndex(), CSSPrimitiveValue::CSS_NUMBER); 1188 case CSSPropertyZoom: 1189 return CSSPrimitiveValue::create(style->zoom(), CSSPrimitiveValue::CSS_NUMBER); 1190 case CSSPropertyWebkitBoxSizing: 1191 if (style->boxSizing() == CONTENT_BOX) 1192 return CSSPrimitiveValue::createIdentifier(CSSValueContentBox); 1193 return CSSPrimitiveValue::createIdentifier(CSSValueBorderBox); 1194 #if ENABLE(DASHBOARD_SUPPORT) 1195 case CSSPropertyWebkitDashboardRegion: 1196 { 1197 const Vector<StyleDashboardRegion>& regions = style->dashboardRegions(); 1198 unsigned count = regions.size(); 1199 if (count == 1 && regions[0].type == StyleDashboardRegion::None) 1200 return CSSPrimitiveValue::createIdentifier(CSSValueNone); 1201 1202 RefPtr<DashboardRegion> firstRegion; 1203 DashboardRegion* previousRegion = 0; 1204 for (unsigned i = 0; i < count; i++) { 1205 RefPtr<DashboardRegion> region = DashboardRegion::create(); 1206 StyleDashboardRegion styleRegion = regions[i]; 1207 1208 region->m_label = styleRegion.label; 1209 LengthBox offset = styleRegion.offset; 1210 region->setTop(CSSPrimitiveValue::create(offset.top().value(), CSSPrimitiveValue::CSS_PX)); 1211 region->setRight(CSSPrimitiveValue::create(offset.right().value(), CSSPrimitiveValue::CSS_PX)); 1212 region->setBottom(CSSPrimitiveValue::create(offset.bottom().value(), CSSPrimitiveValue::CSS_PX)); 1213 region->setLeft(CSSPrimitiveValue::create(offset.left().value(), CSSPrimitiveValue::CSS_PX)); 1214 region->m_isRectangle = (styleRegion.type == StyleDashboardRegion::Rectangle); 1215 region->m_isCircle = (styleRegion.type == StyleDashboardRegion::Circle); 1216 1217 if (previousRegion) 1218 previousRegion->m_next = region; 1219 else 1220 firstRegion = region; 1221 previousRegion = region.get(); 1222 } 1223 return CSSPrimitiveValue::create(firstRegion.release()); 1224 } 1225 #endif 1226 case CSSPropertyWebkitAnimationDelay: 1227 return getDelayValue(style->animations()); 1228 case CSSPropertyWebkitAnimationDirection: { 1229 RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); 1230 const AnimationList* t = style->animations(); 1231 if (t) { 1232 for (size_t i = 0; i < t->size(); ++i) { 1233 if (t->animation(i)->direction()) 1234 list->append(CSSPrimitiveValue::createIdentifier(CSSValueAlternate)); 1235 else 1236 list->append(CSSPrimitiveValue::createIdentifier(CSSValueNormal)); 1237 } 1238 } else 1239 list->append(CSSPrimitiveValue::createIdentifier(CSSValueNormal)); 1240 return list.release(); 1241 } 1242 case CSSPropertyWebkitAnimationDuration: 1243 return getDurationValue(style->animations()); 1244 case CSSPropertyWebkitAnimationIterationCount: { 1245 RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); 1246 const AnimationList* t = style->animations(); 1247 if (t) { 1248 for (size_t i = 0; i < t->size(); ++i) { 1249 int iterationCount = t->animation(i)->iterationCount(); 1250 if (iterationCount == Animation::IterationCountInfinite) 1251 list->append(CSSPrimitiveValue::createIdentifier(CSSValueInfinite)); 1252 else 1253 list->append(CSSPrimitiveValue::create(iterationCount, CSSPrimitiveValue::CSS_NUMBER)); 1254 } 1255 } else 1256 list->append(CSSPrimitiveValue::create(Animation::initialAnimationIterationCount(), CSSPrimitiveValue::CSS_NUMBER)); 1257 return list.release(); 1258 } 1259 case CSSPropertyWebkitAnimationName: { 1260 RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); 1261 const AnimationList* t = style->animations(); 1262 if (t) { 1263 for (size_t i = 0; i < t->size(); ++i) { 1264 list->append(CSSPrimitiveValue::create(t->animation(i)->name(), CSSPrimitiveValue::CSS_STRING)); 1265 } 1266 } else 1267 list->append(CSSPrimitiveValue::createIdentifier(CSSValueNone)); 1268 return list.release(); 1269 } 1270 case CSSPropertyWebkitAnimationPlayState: { 1271 RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); 1272 const AnimationList* t = style->animations(); 1273 if (t) { 1274 for (size_t i = 0; i < t->size(); ++i) { 1275 int prop = t->animation(i)->playState(); 1276 if (prop == AnimPlayStatePlaying) 1277 list->append(CSSPrimitiveValue::createIdentifier(CSSValueRunning)); 1278 else 1279 list->append(CSSPrimitiveValue::createIdentifier(CSSValuePaused)); 1280 } 1281 } else 1282 list->append(CSSPrimitiveValue::createIdentifier(CSSValueRunning)); 1283 return list.release(); 1284 } 1285 case CSSPropertyWebkitAnimationTimingFunction: 1286 return getTimingFunctionValue(style->animations()); 1287 case CSSPropertyWebkitAppearance: 1288 return CSSPrimitiveValue::create(style->appearance()); 1289 case CSSPropertyWebkitBackfaceVisibility: 1290 return CSSPrimitiveValue::createIdentifier((style->backfaceVisibility() == BackfaceVisibilityHidden) ? CSSValueHidden : CSSValueVisible); 1291 case CSSPropertyWebkitBorderImage: 1292 return valueForNinePieceImage(style->borderImage()); 1293 case CSSPropertyWebkitMaskBoxImage: 1294 return valueForNinePieceImage(style->maskBoxImage()); 1295 case CSSPropertyWebkitFontSizeDelta: 1296 // Not a real style property -- used by the editing engine -- so has no computed value. 1297 break; 1298 case CSSPropertyWebkitMarginBottomCollapse: 1299 return CSSPrimitiveValue::create(style->marginBottomCollapse()); 1300 case CSSPropertyWebkitMarginTopCollapse: 1301 return CSSPrimitiveValue::create(style->marginTopCollapse()); 1302 case CSSPropertyWebkitPerspective: 1303 if (!style->hasPerspective()) 1304 return CSSPrimitiveValue::createIdentifier(CSSValueNone); 1305 return CSSPrimitiveValue::create(style->perspective(), CSSPrimitiveValue::CSS_NUMBER); 1306 case CSSPropertyWebkitPerspectiveOrigin: { 1307 RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); 1308 if (renderer) { 1309 IntRect box = sizingBox(renderer); 1310 list->append(CSSPrimitiveValue::create(style->perspectiveOriginX().calcMinValue(box.width()), CSSPrimitiveValue::CSS_PX)); 1311 list->append(CSSPrimitiveValue::create(style->perspectiveOriginY().calcMinValue(box.height()), CSSPrimitiveValue::CSS_PX)); 1312 } 1313 else { 1314 list->append(CSSPrimitiveValue::create(style->perspectiveOriginX())); 1315 list->append(CSSPrimitiveValue::create(style->perspectiveOriginY())); 1316 } 1317 return list.release(); 1318 } 1319 case CSSPropertyWebkitRtlOrdering: 1320 if (style->visuallyOrdered()) 1321 return CSSPrimitiveValue::createIdentifier(CSSValueVisual); 1322 return CSSPrimitiveValue::createIdentifier(CSSValueLogical); 1323 case CSSPropertyWebkitUserDrag: 1324 return CSSPrimitiveValue::create(style->userDrag()); 1325 case CSSPropertyWebkitUserSelect: 1326 return CSSPrimitiveValue::create(style->userSelect()); 1327 case CSSPropertyBorderBottomLeftRadius: 1328 return getBorderRadiusCornerValue(style->borderBottomLeftRadius()); 1329 case CSSPropertyBorderBottomRightRadius: 1330 return getBorderRadiusCornerValue(style->borderBottomRightRadius()); 1331 case CSSPropertyBorderTopLeftRadius: 1332 return getBorderRadiusCornerValue(style->borderTopLeftRadius()); 1333 case CSSPropertyBorderTopRightRadius: 1334 return getBorderRadiusCornerValue(style->borderTopRightRadius()); 1335 case CSSPropertyClip: { 1336 if (!style->hasClip()) 1337 return CSSPrimitiveValue::createIdentifier(CSSValueAuto); 1338 RefPtr<Rect> rect = Rect::create(); 1339 rect->setTop(CSSPrimitiveValue::create(style->clip().top().value(), CSSPrimitiveValue::CSS_PX)); 1340 rect->setRight(CSSPrimitiveValue::create(style->clip().right().value(), CSSPrimitiveValue::CSS_PX)); 1341 rect->setBottom(CSSPrimitiveValue::create(style->clip().bottom().value(), CSSPrimitiveValue::CSS_PX)); 1342 rect->setLeft(CSSPrimitiveValue::create(style->clip().left().value(), CSSPrimitiveValue::CSS_PX)); 1343 return CSSPrimitiveValue::create(rect.release()); 1344 } 1345 case CSSPropertyWebkitTransform: 1346 return computedTransform(renderer, style.get()); 1347 case CSSPropertyWebkitTransformOrigin: { 1348 RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); 1349 if (renderer) { 1350 IntRect box = sizingBox(renderer); 1351 list->append(CSSPrimitiveValue::create(style->transformOriginX().calcMinValue(box.width()), CSSPrimitiveValue::CSS_PX)); 1352 list->append(CSSPrimitiveValue::create(style->transformOriginY().calcMinValue(box.height()), CSSPrimitiveValue::CSS_PX)); 1353 if (style->transformOriginZ() != 0) 1354 list->append(CSSPrimitiveValue::create(style->transformOriginZ(), CSSPrimitiveValue::CSS_PX)); 1355 } else { 1356 list->append(CSSPrimitiveValue::create(style->transformOriginX())); 1357 list->append(CSSPrimitiveValue::create(style->transformOriginY())); 1358 if (style->transformOriginZ() != 0) 1359 list->append(CSSPrimitiveValue::create(style->transformOriginZ(), CSSPrimitiveValue::CSS_PX)); 1360 } 1361 return list.release(); 1362 } 1363 case CSSPropertyWebkitTransformStyle: 1364 return CSSPrimitiveValue::createIdentifier((style->transformStyle3D() == TransformStyle3DPreserve3D) ? CSSValuePreserve3d : CSSValueFlat); 1365 case CSSPropertyWebkitTransitionDelay: 1366 return getDelayValue(style->transitions()); 1367 case CSSPropertyWebkitTransitionDuration: 1368 return getDurationValue(style->transitions()); 1369 case CSSPropertyWebkitTransitionProperty: { 1370 RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); 1371 const AnimationList* t = style->transitions(); 1372 if (t) { 1373 for (size_t i = 0; i < t->size(); ++i) { 1374 int prop = t->animation(i)->property(); 1375 RefPtr<CSSValue> propertyValue; 1376 if (prop == cAnimateNone) 1377 propertyValue = CSSPrimitiveValue::createIdentifier(CSSValueNone); 1378 else if (prop == cAnimateAll) 1379 propertyValue = CSSPrimitiveValue::createIdentifier(CSSValueAll); 1380 else 1381 propertyValue = CSSPrimitiveValue::create(getPropertyName(static_cast<CSSPropertyID>(prop)), CSSPrimitiveValue::CSS_STRING); 1382 list->append(propertyValue); 1383 } 1384 } else 1385 list->append(CSSPrimitiveValue::createIdentifier(CSSValueAll)); 1386 return list.release(); 1387 } 1388 case CSSPropertyWebkitTransitionTimingFunction: 1389 return getTimingFunctionValue(style->transitions()); 1390 case CSSPropertyPointerEvents: 1391 return CSSPrimitiveValue::create(style->pointerEvents()); 1392 case CSSPropertyWebkitColorCorrection: 1393 return CSSPrimitiveValue::create(style->colorSpace()); 1394 1395 /* Shorthand properties, currently not supported see bug 13658*/ 1396 case CSSPropertyBackground: 1397 case CSSPropertyBorder: 1398 case CSSPropertyBorderBottom: 1399 case CSSPropertyBorderColor: 1400 case CSSPropertyBorderLeft: 1401 case CSSPropertyBorderRadius: 1402 case CSSPropertyBorderRight: 1403 case CSSPropertyBorderStyle: 1404 case CSSPropertyBorderTop: 1405 case CSSPropertyBorderWidth: 1406 case CSSPropertyFont: 1407 case CSSPropertyListStyle: 1408 case CSSPropertyMargin: 1409 case CSSPropertyPadding: 1410 break; 1411 1412 /* Unimplemented CSS 3 properties (including CSS3 shorthand properties) */ 1413 case CSSPropertyTextLineThrough: 1414 case CSSPropertyTextLineThroughColor: 1415 case CSSPropertyTextLineThroughMode: 1416 case CSSPropertyTextLineThroughStyle: 1417 case CSSPropertyTextLineThroughWidth: 1418 case CSSPropertyTextOverline: 1419 case CSSPropertyTextOverlineColor: 1420 case CSSPropertyTextOverlineMode: 1421 case CSSPropertyTextOverlineStyle: 1422 case CSSPropertyTextOverlineWidth: 1423 case CSSPropertyTextUnderline: 1424 case CSSPropertyTextUnderlineColor: 1425 case CSSPropertyTextUnderlineMode: 1426 case CSSPropertyTextUnderlineStyle: 1427 case CSSPropertyTextUnderlineWidth: 1428 break; 1429 1430 /* Unimplemented @font-face properties */ 1431 case CSSPropertyFontStretch: 1432 case CSSPropertySrc: 1433 case CSSPropertyUnicodeRange: 1434 break; 1435 1436 /* Other unimplemented properties */ 1437 case CSSPropertyContent: // FIXME: needs implementation, bug 23668 1438 case CSSPropertyCounterIncrement: 1439 case CSSPropertyCounterReset: 1440 case CSSPropertyOutline: // FIXME: needs implementation 1441 case CSSPropertyOutlineOffset: // FIXME: needs implementation 1442 case CSSPropertyPage: // for @page 1443 case CSSPropertyQuotes: // FIXME: needs implementation 1444 case CSSPropertySize: // for @page 1445 break; 1446 1447 /* Unimplemented -webkit- properties */ 1448 case CSSPropertyWebkitAnimation: 1449 case CSSPropertyWebkitBorderRadius: 1450 case CSSPropertyWebkitColumns: 1451 case CSSPropertyWebkitColumnRule: 1452 case CSSPropertyWebkitMarginCollapse: 1453 case CSSPropertyWebkitMarginStart: 1454 case CSSPropertyWebkitMarquee: 1455 case CSSPropertyWebkitMarqueeSpeed: 1456 case CSSPropertyWebkitMask: 1457 case CSSPropertyWebkitPaddingStart: 1458 case CSSPropertyWebkitPerspectiveOriginX: 1459 case CSSPropertyWebkitPerspectiveOriginY: 1460 case CSSPropertyWebkitTextStroke: 1461 case CSSPropertyWebkitTransformOriginX: 1462 case CSSPropertyWebkitTransformOriginY: 1463 case CSSPropertyWebkitTransformOriginZ: 1464 case CSSPropertyWebkitTransition: 1465 case CSSPropertyWebkitVariableDeclarationBlock: 1466 break; 1467 #ifdef ANDROID_CSS_TAP_HIGHLIGHT_COLOR 1468 case CSSPropertyWebkitTapHighlightColor: 1469 return CSSPrimitiveValue::createColor(style->tapHighlightColor().rgb()); 1470 #endif 1471 #if ENABLE(SVG) 1472 // FIXME: This default case ruins the point of using an enum for 1473 // properties -- it prevents us from getting a warning when we 1474 // forget to list a property above. 1475 default: 1476 return getSVGPropertyCSSValue(propertyID, DoNotUpdateLayout); 1477 #endif 1478 } 1479 1480 logUnimplementedPropertyID(propertyID); 1481 return 0; 1482 } 1483 1484 String CSSComputedStyleDeclaration::getPropertyValue(int propertyID) const 1485 { 1486 RefPtr<CSSValue> value = getPropertyCSSValue(propertyID); 1487 if (value) 1488 return value->cssText(); 1489 return ""; 1490 } 1491 1492 bool CSSComputedStyleDeclaration::getPropertyPriority(int /*propertyID*/) const 1493 { 1494 // All computed styles have a priority of false (not "important"). 1495 return false; 1496 } 1497 1498 String CSSComputedStyleDeclaration::removeProperty(int /*propertyID*/, ExceptionCode& ec) 1499 { 1500 ec = NO_MODIFICATION_ALLOWED_ERR; 1501 return String(); 1502 } 1503 1504 void CSSComputedStyleDeclaration::setProperty(int /*propertyID*/, const String& /*value*/, bool /*important*/, ExceptionCode& ec) 1505 { 1506 ec = NO_MODIFICATION_ALLOWED_ERR; 1507 } 1508 1509 unsigned CSSComputedStyleDeclaration::length() const 1510 { 1511 Node* node = m_node.get(); 1512 if (!node) 1513 return 0; 1514 1515 RenderStyle* style = node->computedStyle(); 1516 if (!style) 1517 return 0; 1518 1519 return numComputedProperties; 1520 } 1521 1522 String CSSComputedStyleDeclaration::item(unsigned i) const 1523 { 1524 if (i >= length()) 1525 return ""; 1526 1527 return getPropertyName(static_cast<CSSPropertyID>(computedProperties[i])); 1528 } 1529 1530 bool CSSComputedStyleDeclaration::cssPropertyMatches(const CSSProperty* property) const 1531 { 1532 if (property->id() == CSSPropertyFontSize && property->value()->isPrimitiveValue() && m_node) { 1533 m_node->document()->updateLayoutIgnorePendingStylesheets(); 1534 RenderStyle* style = m_node->computedStyle(); 1535 if (style && style->fontDescription().keywordSize()) { 1536 int sizeValue = cssIdentifierForFontSizeKeyword(style->fontDescription().keywordSize()); 1537 CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(property->value()); 1538 if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_IDENT && primitiveValue->getIdent() == sizeValue) 1539 return true; 1540 } 1541 } 1542 1543 return CSSStyleDeclaration::cssPropertyMatches(property); 1544 } 1545 1546 PassRefPtr<CSSMutableStyleDeclaration> CSSComputedStyleDeclaration::copy() const 1547 { 1548 return copyPropertiesInSet(computedProperties, numComputedProperties); 1549 } 1550 1551 PassRefPtr<CSSMutableStyleDeclaration> CSSComputedStyleDeclaration::makeMutable() 1552 { 1553 return copy(); 1554 } 1555 1556 } // namespace WebCore 1557