| Index: Source/core/svg/SVGForeignObjectElement.cpp
|
| diff --git a/Source/core/svg/SVGForeignObjectElement.cpp b/Source/core/svg/SVGForeignObjectElement.cpp
|
| index 58ae096d07ea5e6f9c80a2383c4ef7977f71d8ec..a549ff8327d17e5dc0e13b08801148a210d6f8cc 100644
|
| --- a/Source/core/svg/SVGForeignObjectElement.cpp
|
| +++ b/Source/core/svg/SVGForeignObjectElement.cpp
|
| @@ -74,23 +74,37 @@ void SVGForeignObjectElement::parseAttribute(const QualifiedName& name, const At
|
|
|
| bool SVGForeignObjectElement::isPresentationAttribute(const QualifiedName& name) const
|
| {
|
| - if (name == SVGNames::widthAttr || name == SVGNames::heightAttr)
|
| + if (name == SVGNames::xAttr || name == SVGNames::yAttr
|
| + || name == SVGNames::widthAttr || name == SVGNames::heightAttr)
|
| return true;
|
| return SVGGraphicsElement::isPresentationAttribute(name);
|
| }
|
|
|
| +bool SVGForeignObjectElement::isPresentationAttributeWithSVGDOM(const QualifiedName& attrName) const
|
| +{
|
| + if (attrName == SVGNames::xAttr || attrName== SVGNames::yAttr
|
| + || attrName == SVGNames::widthAttr || attrName == SVGNames::heightAttr)
|
| + return true;
|
| + return SVGGraphicsElement::isPresentationAttributeWithSVGDOM(attrName);
|
| +}
|
| +
|
| void SVGForeignObjectElement::collectStyleForPresentationAttribute(const QualifiedName& name, const AtomicString& value, MutableStylePropertySet* style)
|
| {
|
| - if (name == SVGNames::widthAttr || name == SVGNames::heightAttr) {
|
| + RefPtrWillBeRawPtr<SVGAnimatedPropertyBase> property = propertyFromAttribute(name);
|
| + if (property == m_width || property == m_height) {
|
| RefPtrWillBeRawPtr<SVGLength> length = SVGLength::create(LengthModeOther);
|
| TrackExceptionState exceptionState;
|
| length->setValueAsString(value, exceptionState);
|
| if (!exceptionState.hadException()) {
|
| - if (name == SVGNames::widthAttr)
|
| + if (property == m_width)
|
| addPropertyToPresentationAttributeStyle(style, CSSPropertyWidth, value);
|
| - else if (name == SVGNames::heightAttr)
|
| + else if (property == m_height)
|
| addPropertyToPresentationAttributeStyle(style, CSSPropertyHeight, value);
|
| }
|
| + } else if (property == m_x) {
|
| + addSVGLengthPropertyToPresentationAttributeStyle(style, CSSPropertyX, *m_x->currentValue());
|
| + } else if (property == m_y) {
|
| + addSVGLengthPropertyToPresentationAttributeStyle(style, CSSPropertyY, *m_y->currentValue());
|
| } else {
|
| SVGGraphicsElement::collectStyleForPresentationAttribute(name, value, style);
|
| }
|
| @@ -103,19 +117,17 @@ void SVGForeignObjectElement::svgAttributeChanged(const QualifiedName& attrName)
|
| return;
|
| }
|
|
|
| - if (attrName == SVGNames::widthAttr || attrName == SVGNames::heightAttr) {
|
| - invalidateSVGPresentationAttributeStyle();
|
| - setNeedsStyleRecalc(LocalStyleChange, StyleChangeReasonForTracing::create(StyleChangeReason::SVGContainerSizeChange));
|
| - }
|
| -
|
| SVGElement::InvalidationGuard invalidationGuard(this);
|
|
|
| - bool isLengthAttribute = attrName == SVGNames::xAttr
|
| - || attrName == SVGNames::yAttr
|
| - || attrName == SVGNames::widthAttr
|
| - || attrName == SVGNames::heightAttr;
|
| + bool isWidthHeightAttribute = attrName == SVGNames::widthAttr
|
| + || attrName == SVGNames::heightAttr;
|
| + bool isXYAttribute = attrName == SVGNames::xAttr || attrName == SVGNames::yAttr;
|
| +
|
| + if (isXYAttribute || isWidthHeightAttribute) {
|
| + invalidateSVGPresentationAttributeStyle();
|
| + setNeedsStyleRecalc(LocalStyleChange,
|
| + isWidthHeightAttribute ? StyleChangeReasonForTracing::create(StyleChangeReason::SVGContainerSizeChange) : StyleChangeReasonForTracing::fromAttribute(attrName));
|
|
|
| - if (isLengthAttribute) {
|
| updateRelativeLengthsInformation();
|
| if (LayoutObject* renderer = this->renderer())
|
| markForLayoutAndParentResourceInvalidation(renderer);
|
|
|