📄 csscomputedstyledeclaration.cpp
字号:
default: return CSSValueStretch; }} static PassRefPtr<CSSValue> valueForNinePieceImage(const NinePieceImage& image){ if (!image.hasImage()) return CSSPrimitiveValue::createIdentifier(CSSValueNone); // Image first. RefPtr<CSSValue> imageValue; if (image.image()) imageValue = image.image()->cssValue(); // Create the slices. RefPtr<CSSPrimitiveValue> top; if (image.m_slices.top().isPercent()) top = CSSPrimitiveValue::create(image.m_slices.top().value(), CSSPrimitiveValue::CSS_PERCENTAGE); else top = CSSPrimitiveValue::create(image.m_slices.top().value(), CSSPrimitiveValue::CSS_NUMBER); RefPtr<CSSPrimitiveValue> right; if (image.m_slices.right().isPercent()) right = CSSPrimitiveValue::create(image.m_slices.right().value(), CSSPrimitiveValue::CSS_PERCENTAGE); else right = CSSPrimitiveValue::create(image.m_slices.right().value(), CSSPrimitiveValue::CSS_NUMBER); RefPtr<CSSPrimitiveValue> bottom; if (image.m_slices.bottom().isPercent()) bottom = CSSPrimitiveValue::create(image.m_slices.bottom().value(), CSSPrimitiveValue::CSS_PERCENTAGE); else bottom = CSSPrimitiveValue::create(image.m_slices.bottom().value(), CSSPrimitiveValue::CSS_NUMBER); RefPtr<CSSPrimitiveValue> left; if (image.m_slices.left().isPercent()) left = CSSPrimitiveValue::create(image.m_slices.left().value(), CSSPrimitiveValue::CSS_PERCENTAGE); else left = CSSPrimitiveValue::create(image.m_slices.left().value(), CSSPrimitiveValue::CSS_NUMBER); RefPtr<Rect> rect = Rect::create(); rect->setTop(top); rect->setRight(right); rect->setBottom(bottom); rect->setLeft(left); return CSSBorderImageValue::create(imageValue, rect, valueForRepeatRule(image.m_horizontalRule), valueForRepeatRule(image.m_verticalRule));}static PassRefPtr<CSSValue> valueForReflection(const StyleReflection* reflection){ if (!reflection) return CSSPrimitiveValue::createIdentifier(CSSValueNone); RefPtr<CSSPrimitiveValue> offset; if (reflection->offset().isPercent()) offset = CSSPrimitiveValue::create(reflection->offset().percent(), CSSPrimitiveValue::CSS_PERCENTAGE); else offset = CSSPrimitiveValue::create(reflection->offset().value(), CSSPrimitiveValue::CSS_PX); return CSSReflectValue::create(reflection->direction(), offset.release(), valueForNinePieceImage(reflection->mask()));}static PassRefPtr<CSSValue> getPositionOffsetValue(RenderStyle* style, int propertyID){ if (!style) return 0; Length l; switch (propertyID) { case CSSPropertyLeft: l = style->left(); break; case CSSPropertyRight: l = style->right(); break; case CSSPropertyTop: l = style->top(); break; case CSSPropertyBottom: l = style->bottom(); break; default: return 0; } if (style->position() == AbsolutePosition || style->position() == FixedPosition) return CSSPrimitiveValue::create(l); if (style->position() == RelativePosition) // FIXME: It's not enough to simply return "auto" values for one offset if the other side is defined. // In other words if left is auto and right is not auto, then left's computed value is negative right(). // So we should get the opposite length unit and see if it is auto. return CSSPrimitiveValue::create(l); return CSSPrimitiveValue::createIdentifier(CSSValueAuto);}static PassRefPtr<CSSPrimitiveValue> currentColorOrValidColor(RenderStyle* style, const Color& color){ if (!color.isValid()) return CSSPrimitiveValue::createColor(style->color().rgb()); return CSSPrimitiveValue::createColor(color.rgb());}static PassRefPtr<CSSValue> getBorderRadiusCornerValue(IntSize radius){ if (radius.width() == radius.height()) return CSSPrimitiveValue::create(radius.width(), CSSPrimitiveValue::CSS_PX); RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); list->append(CSSPrimitiveValue::create(radius.width(), CSSPrimitiveValue::CSS_PX)); list->append(CSSPrimitiveValue::create(radius.height(), CSSPrimitiveValue::CSS_PX)); return list.release();}static IntRect sizingBox(RenderObject* renderer){ if (!renderer->isBox()) return IntRect(); RenderBox* box = toRenderBox(renderer); return box->style()->boxSizing() == CONTENT_BOX ? box->contentBoxRect() : box->borderBoxRect();}static inline bool hasCompositedLayer(RenderObject* renderer){ return renderer && renderer->hasLayer() && toRenderBoxModelObject(renderer)->layer()->isComposited();}static PassRefPtr<CSSValue> computedTransform(RenderObject* renderer, const RenderStyle* style){ if (!renderer || style->transform().operations().isEmpty()) return CSSPrimitiveValue::createIdentifier(CSSValueNone); IntRect box = sizingBox(renderer); TransformationMatrix transform; style->applyTransform(transform, box.size(), RenderStyle::ExcludeTransformOrigin); RefPtr<WebKitCSSTransformValue> transformVal; // FIXME: Need to print out individual functions (https://bugs.webkit.org/show_bug.cgi?id=23924) if (transform.isAffine()) { transformVal = WebKitCSSTransformValue::create(WebKitCSSTransformValue::MatrixTransformOperation); transformVal->append(CSSPrimitiveValue::create(transform.a(), CSSPrimitiveValue::CSS_NUMBER)); transformVal->append(CSSPrimitiveValue::create(transform.b(), CSSPrimitiveValue::CSS_NUMBER)); transformVal->append(CSSPrimitiveValue::create(transform.c(), CSSPrimitiveValue::CSS_NUMBER)); transformVal->append(CSSPrimitiveValue::create(transform.d(), CSSPrimitiveValue::CSS_NUMBER)); transformVal->append(CSSPrimitiveValue::create(transform.e(), CSSPrimitiveValue::CSS_NUMBER)); transformVal->append(CSSPrimitiveValue::create(transform.f(), CSSPrimitiveValue::CSS_NUMBER)); } else { transformVal = WebKitCSSTransformValue::create(WebKitCSSTransformValue::Matrix3DTransformOperation); transformVal->append(CSSPrimitiveValue::create(transform.m11(), CSSPrimitiveValue::CSS_NUMBER)); transformVal->append(CSSPrimitiveValue::create(transform.m12(), CSSPrimitiveValue::CSS_NUMBER)); transformVal->append(CSSPrimitiveValue::create(transform.m13(), CSSPrimitiveValue::CSS_NUMBER)); transformVal->append(CSSPrimitiveValue::create(transform.m14(), CSSPrimitiveValue::CSS_NUMBER)); transformVal->append(CSSPrimitiveValue::create(transform.m21(), CSSPrimitiveValue::CSS_NUMBER)); transformVal->append(CSSPrimitiveValue::create(transform.m22(), CSSPrimitiveValue::CSS_NUMBER)); transformVal->append(CSSPrimitiveValue::create(transform.m23(), CSSPrimitiveValue::CSS_NUMBER)); transformVal->append(CSSPrimitiveValue::create(transform.m24(), CSSPrimitiveValue::CSS_NUMBER)); transformVal->append(CSSPrimitiveValue::create(transform.m31(), CSSPrimitiveValue::CSS_NUMBER)); transformVal->append(CSSPrimitiveValue::create(transform.m32(), CSSPrimitiveValue::CSS_NUMBER)); transformVal->append(CSSPrimitiveValue::create(transform.m33(), CSSPrimitiveValue::CSS_NUMBER)); transformVal->append(CSSPrimitiveValue::create(transform.m34(), CSSPrimitiveValue::CSS_NUMBER)); transformVal->append(CSSPrimitiveValue::create(transform.m41(), CSSPrimitiveValue::CSS_NUMBER)); transformVal->append(CSSPrimitiveValue::create(transform.m42(), CSSPrimitiveValue::CSS_NUMBER)); transformVal->append(CSSPrimitiveValue::create(transform.m43(), CSSPrimitiveValue::CSS_NUMBER)); transformVal->append(CSSPrimitiveValue::create(transform.m44(), CSSPrimitiveValue::CSS_NUMBER)); } RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); list->append(transformVal); return list.release();}static PassRefPtr<CSSValue> getDelayValue(const AnimationList* animList){ RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); if (animList) { for (size_t i = 0; i < animList->size(); ++i) list->append(CSSPrimitiveValue::create(animList->animation(i)->delay(), CSSPrimitiveValue::CSS_S)); } else { // Note that initialAnimationDelay() is used for both transitions and animations list->append(CSSPrimitiveValue::create(Animation::initialAnimationDelay(), CSSPrimitiveValue::CSS_S)); } return list.release();}static PassRefPtr<CSSValue> getDurationValue(const AnimationList* animList){ RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); if (animList) { for (size_t i = 0; i < animList->size(); ++i) list->append(CSSPrimitiveValue::create(animList->animation(i)->duration(), CSSPrimitiveValue::CSS_S)); } else { // Note that initialAnimationDuration() is used for both transitions and animations list->append(CSSPrimitiveValue::create(Animation::initialAnimationDuration(), CSSPrimitiveValue::CSS_S)); } return list.release();}static PassRefPtr<CSSValue> getTimingFunctionValue(const AnimationList* animList){ RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); if (animList) { for (size_t i = 0; i < animList->size(); ++i) { const TimingFunction& tf = animList->animation(i)->timingFunction(); list->append(CSSTimingFunctionValue::create(tf.x1(), tf.y1(), tf.x2(), tf.y2())); } } else { // Note that initialAnimationTimingFunction() is used for both transitions and animations const TimingFunction& tf = Animation::initialAnimationTimingFunction(); list->append(CSSTimingFunctionValue::create(tf.x1(), tf.y1(), tf.x2(), tf.y2())); } return list.release();}CSSComputedStyleDeclaration::CSSComputedStyleDeclaration(PassRefPtr<Node> n) : m_node(n){}CSSComputedStyleDeclaration::~CSSComputedStyleDeclaration(){}String CSSComputedStyleDeclaration::cssText() const{ String result(""); for (unsigned i = 0; i < numComputedProperties; i++) { if (i) result += " "; result += getPropertyName(static_cast<CSSPropertyID>(computedProperties[i])); result += ": "; result += getPropertyValue(computedProperties[i]); result += ";"; } return result;}void CSSComputedStyleDeclaration::setCssText(const String&, ExceptionCode& ec){ ec = NO_MODIFICATION_ALLOWED_ERR;}PassRefPtr<CSSValue> CSSComputedStyleDeclaration::getPropertyCSSValue(int propertyID) const{ return getPropertyCSSValue(propertyID, UpdateLayout);}PassRefPtr<CSSValue> CSSComputedStyleDeclaration::getPropertyCSSValue(int propertyID, EUpdateLayout updateLayout) const{ Node* node = m_node.get(); if (!node) return 0; // Make sure our layout is up to date before we allow a query on these attributes. if (updateLayout) node->document()->updateLayoutIgnorePendingStylesheets(); RenderObject* renderer = node->renderer(); RefPtr<RenderStyle> style; if (renderer && hasCompositedLayer(renderer) && AnimationController::supportsAcceleratedAnimationOfProperty(static_cast<CSSPropertyID>(propertyID))) style = renderer->animation()->getAnimatedStyleForRenderer(renderer); else style = node->computedStyle(); if (!style) return 0; switch (static_cast<CSSPropertyID>(propertyID)) { case CSSPropertyInvalid: break; case CSSPropertyBackgroundColor: return CSSPrimitiveValue::createColor(style->backgroundColor().rgb());
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -