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