void SVGSVGElement::svgAttributeChanged(const QualifiedName& attrName) { bool updateRelativeLengthsOrViewBox = false; bool widthChanged = attrName == SVGNames::widthAttr; bool heightChanged = attrName == SVGNames::heightAttr; if (widthChanged || heightChanged || attrName == SVGNames::xAttr || attrName == SVGNames::yAttr) { updateRelativeLengthsOrViewBox = true; updateRelativeLengthsInformation(); invalidateRelativeLengthClients(); // At the SVG/HTML boundary (aka LayoutSVGRoot), the width and // height attributes can affect the replaced size so we need // to mark it for updating. // // FIXME: For width/height animated as XML attributes on SVG // roots, there is an attribute synchronization missing. See // http://crbug.com/364807 if (widthChanged || heightChanged) { LayoutObject* layoutObject = this->layoutObject(); if (layoutObject && layoutObject->isSVGRoot()) { invalidateSVGPresentationAttributeStyle(); setNeedsStyleRecalc(LocalStyleChange, StyleChangeReasonForTracing::create(StyleChangeReason::SVGContainerSizeChange)); } } else { invalidateSVGPresentationAttributeStyle(); setNeedsStyleRecalc(LocalStyleChange, StyleChangeReasonForTracing::fromAttribute(attrName)); } } if (SVGFitToViewBox::isKnownAttribute(attrName)) { updateRelativeLengthsOrViewBox = true; invalidateRelativeLengthClients(); if (LayoutObject* object = layoutObject()) object->setNeedsTransformUpdate(); } if (updateRelativeLengthsOrViewBox || SVGZoomAndPan::isKnownAttribute(attrName)) { SVGElement::InvalidationGuard invalidationGuard(this); if (layoutObject()) markForLayoutAndParentResourceInvalidation(layoutObject()); return; } SVGGraphicsElement::svgAttributeChanged(attrName); }
void SVGMaskElement::svgAttributeChanged(const QualifiedName& attrName) { bool isLengthAttr = attrName == SVGNames::xAttr || attrName == SVGNames::yAttr || attrName == SVGNames::widthAttr || attrName == SVGNames::heightAttr; if (isLengthAttr || attrName == SVGNames::maskUnitsAttr || attrName == SVGNames::maskContentUnitsAttr || SVGTests::isKnownAttribute(attrName)) { SVGElement::InvalidationGuard invalidationGuard(this); if (isLengthAttr) { invalidateSVGPresentationAttributeStyle(); setNeedsStyleRecalc(LocalStyleChange, StyleChangeReasonForTracing::fromAttribute(attrName)); updateRelativeLengthsInformation(); } LayoutSVGResourceContainer* layoutObject = toLayoutSVGResourceContainer(this->layoutObject()); if (layoutObject) layoutObject->invalidateCacheAndMarkForLayout(); return; } SVGElement::svgAttributeChanged(attrName); }
void SVGSVGElement::svgAttributeChanged(const QualifiedName& attrName) { bool updateRelativeLengthsOrViewBox = false; if (attrName == SVGNames::widthAttr || attrName == SVGNames::heightAttr || attrName == SVGNames::xAttr || attrName == SVGNames::yAttr) { invalidateSVGPresentationAttributeStyle(); updateRelativeLengthsOrViewBox = true; } if (SVGFitToViewBox::isKnownAttribute(attrName)) { updateRelativeLengthsOrViewBox = true; if (auto* renderer = this->renderer()) renderer->setNeedsTransformUpdate(); } InstanceInvalidationGuard guard(*this); if (updateRelativeLengthsOrViewBox || SVGLangSpace::isKnownAttribute(attrName) || SVGExternalResourcesRequired::isKnownAttribute(attrName) || SVGZoomAndPan::isKnownAttribute(attrName)) { if (auto renderer = this->renderer()) RenderSVGResource::markForLayoutAndParentResourceInvalidation(*renderer); return; } SVGGraphicsElement::svgAttributeChanged(attrName); }
void SVGUseElement::svgAttributeChanged(const QualifiedName& attrName) { if (attrName == SVGNames::xAttr || attrName == SVGNames::yAttr || attrName == SVGNames::widthAttr || attrName == SVGNames::heightAttr) { SVGElement::InvalidationGuard invalidationGuard(this); if (attrName == SVGNames::xAttr || attrName == SVGNames::yAttr) { invalidateSVGPresentationAttributeStyle(); setNeedsStyleRecalc(LocalStyleChange, StyleChangeReasonForTracing::fromAttribute(attrName)); } updateRelativeLengthsInformation(); if (m_targetElementInstance) { ASSERT(m_targetElementInstance->correspondingElement()); transferUseWidthAndHeightIfNeeded( *this, *m_targetElementInstance, *m_targetElementInstance->correspondingElement()); } LayoutObject* object = this->layoutObject(); if (object) markForLayoutAndParentResourceInvalidation(object); return; } if (SVGURIReference::isKnownAttribute(attrName)) { SVGElement::InvalidationGuard invalidationGuard(this); updateTargetReference(); invalidateShadowTree(); return; } SVGGraphicsElement::svgAttributeChanged(attrName); }
void SVGForeignObjectElement::svgAttributeChanged( const QualifiedName& attrName) { bool isWidthHeightAttribute = attrName == SVGNames::widthAttr || attrName == SVGNames::heightAttr; bool isXYAttribute = attrName == SVGNames::xAttr || attrName == SVGNames::yAttr; if (isXYAttribute || isWidthHeightAttribute) { SVGElement::InvalidationGuard invalidationGuard(this); invalidateSVGPresentationAttributeStyle(); setNeedsStyleRecalc( LocalStyleChange, isWidthHeightAttribute ? StyleChangeReasonForTracing::create( StyleChangeReason::SVGContainerSizeChange) : StyleChangeReasonForTracing::fromAttribute(attrName)); updateRelativeLengthsInformation(); if (LayoutObject* layoutObject = this->layoutObject()) markForLayoutAndParentResourceInvalidation(layoutObject); return; } SVGGraphicsElement::svgAttributeChanged(attrName); }
void SVGEllipseElement::svgAttributeChanged(const QualifiedName& attrName) { if (!isSupportedAttribute(attrName)) { SVGGraphicsElement::svgAttributeChanged(attrName); return; } SVGElementInstance::InvalidationGuard invalidationGuard(this); if (attrName == SVGNames::cxAttr || attrName == SVGNames::cyAttr || attrName == SVGNames::rxAttr || attrName == SVGNames::ryAttr) { invalidateSVGPresentationAttributeStyle(); return; } RenderSVGShape* renderer = toRenderSVGShape(this->renderer()); if (!renderer) return; if (SVGLangSpace::isKnownAttribute(attrName) || SVGExternalResourcesRequired::isKnownAttribute(attrName)) { RenderSVGResource::markForLayoutAndParentResourceInvalidation(*renderer); return; } ASSERT_NOT_REACHED(); }
void SVGPathElement::svgAttributeChanged(const QualifiedName& attrName) { if (attrName == SVGNames::dAttr) { SVGElement::InvalidationGuard invalidationGuard(this); invalidateSVGPresentationAttributeStyle(); setNeedsStyleRecalc(LocalStyleChange, StyleChangeReasonForTracing::fromAttribute(attrName)); if (LayoutSVGShape* layoutPath = toLayoutSVGShape(this->layoutObject())) layoutPath->setNeedsShapeUpdate(); invalidateMPathDependencies(); if (layoutObject()) markForLayoutAndParentResourceInvalidation(layoutObject()); return; } if (attrName == SVGNames::pathLengthAttr) { SVGElement::InvalidationGuard invalidationGuard(this); if (layoutObject()) markForLayoutAndParentResourceInvalidation(layoutObject()); return; } SVGGeometryElement::svgAttributeChanged(attrName); }
void SVGForeignObjectElement::svgAttributeChanged(const QualifiedName& attrName) { if (!isSupportedAttribute(attrName)) { SVGGraphicsElement::svgAttributeChanged(attrName); return; } if (attrName == SVGNames::widthAttr || attrName == SVGNames::heightAttr) { invalidateSVGPresentationAttributeStyle(); setNeedsStyleRecalc(LocalStyleChange); } SVGElement::InvalidationGuard invalidationGuard(this); bool isLengthAttribute = attrName == SVGNames::xAttr || attrName == SVGNames::yAttr || attrName == SVGNames::widthAttr || attrName == SVGNames::heightAttr; if (isLengthAttribute) updateRelativeLengthsInformation(); if (RenderObject* renderer = this->renderer()) RenderSVGResource::markForLayoutAndParentResourceInvalidation(renderer); }
void SVGUseElement::svgAttributeChanged(const QualifiedName& attrName) { if (attrName == SVGNames::xAttr || attrName == SVGNames::yAttr || attrName == SVGNames::widthAttr || attrName == SVGNames::heightAttr) { SVGElement::InvalidationGuard invalidationGuard(this); if (attrName == SVGNames::xAttr || attrName == SVGNames::yAttr) { invalidateSVGPresentationAttributeStyle(); setNeedsStyleRecalc(LocalStyleChange, StyleChangeReasonForTracing::fromAttribute(attrName)); } updateRelativeLengthsInformation(); if (m_targetElementInstance) { ASSERT(m_targetElementInstance->correspondingElement()); transferUseWidthAndHeightIfNeeded(*this, m_targetElementInstance.get(), *m_targetElementInstance->correspondingElement()); } LayoutObject* object = this->layoutObject(); if (object) markForLayoutAndParentResourceInvalidation(object); return; } if (SVGURIReference::isKnownAttribute(attrName)) { SVGElement::InvalidationGuard invalidationGuard(this); if (isStructurallyExternal()) { KURL url = document().completeURL(hrefString()); const KURL& existingURL = m_resource ? m_resource->url() : KURL(); if (url.hasFragmentIdentifier() && !equalIgnoringFragmentIdentifier(url, existingURL)) { FetchRequest request(ResourceRequest(url), localName()); setDocumentResource(DocumentResource::fetchSVGDocument(request, document().fetcher())); } } else { setDocumentResource(nullptr); } invalidateShadowTree(); return; } SVGGraphicsElement::svgAttributeChanged(attrName); }
void SVGImageElement::svgAttributeChanged(const QualifiedName& attrName) { if (!isSupportedAttribute(attrName)) { SVGGraphicsElement::svgAttributeChanged(attrName); return; } InstanceInvalidationGuard guard(*this); if (attrName == SVGNames::widthAttr || attrName == SVGNames::heightAttr) { invalidateSVGPresentationAttributeStyle(); return; } bool isLengthAttribute = attrName == SVGNames::xAttr || attrName == SVGNames::yAttr || attrName == SVGNames::widthAttr || attrName == SVGNames::heightAttr; if (isLengthAttribute) updateRelativeLengthsInformation(); if (SVGURIReference::isKnownAttribute(attrName)) { m_imageLoader.updateFromElementIgnoringPreviousError(); return; } auto* renderer = this->renderer(); if (!renderer) return; if (isLengthAttribute) { if (downcast<RenderSVGImage>(*renderer).updateImageViewport()) RenderSVGResource::markForLayoutAndParentResourceInvalidation(*renderer); return; } if (attrName == SVGNames::preserveAspectRatioAttr || SVGLangSpace::isKnownAttribute(attrName) || SVGExternalResourcesRequired::isKnownAttribute(attrName)) { RenderSVGResource::markForLayoutAndParentResourceInvalidation(*renderer); return; } ASSERT_NOT_REACHED(); }
void SVGFilterElement::svgAttributeChanged(const QualifiedName& attrName) { if (!isSupportedAttribute(attrName)) { SVGElement::svgAttributeChanged(attrName); return; } InstanceInvalidationGuard guard(*this); if (attrName == SVGNames::xAttr || attrName == SVGNames::yAttr || attrName == SVGNames::widthAttr || attrName == SVGNames::heightAttr) { invalidateSVGPresentationAttributeStyle(); return; } if (auto* renderer = this->renderer()) renderer->setNeedsLayout(); }
void SVGRectElement::svgAttributeChanged(const QualifiedName& attrName) { if (attrName == SVGNames::xAttr || attrName == SVGNames::yAttr || attrName == SVGNames::widthAttr || attrName == SVGNames::heightAttr || attrName == SVGNames::rxAttr || attrName == SVGNames::ryAttr) { InstanceInvalidationGuard guard(*this); invalidateSVGPresentationAttributeStyle(); return; } if (SVGLangSpace::isKnownAttribute(attrName) || SVGExternalResourcesRequired::isKnownAttribute(attrName)) { if (auto* renderer = downcast<RenderSVGShape>(this->renderer())) { InstanceInvalidationGuard guard(*this); RenderSVGResource::markForLayoutAndParentResourceInvalidation(*renderer); } return; } SVGGraphicsElement::svgAttributeChanged(attrName); }
void SVGPatternElement::svgAttributeChanged(const QualifiedName& attrName) { if (!isSupportedAttribute(attrName)) { SVGElement::svgAttributeChanged(attrName); return; } SVGElementInstance::InvalidationGuard invalidationGuard(this); if (attrName == SVGNames::xAttr || attrName == SVGNames::yAttr || attrName == SVGNames::widthAttr || attrName == SVGNames::heightAttr) { invalidateSVGPresentationAttributeStyle(); return; } if (RenderObject* object = renderer()) object->setNeedsLayout(); }
void SVGForeignObjectElement::svgAttributeChanged(const QualifiedName& attrName) { if (!isSupportedAttribute(attrName)) { SVGGraphicsElement::svgAttributeChanged(attrName); return; } InstanceInvalidationGuard guard(*this); if (attrName == SVGNames::widthAttr || attrName == SVGNames::heightAttr) { invalidateSVGPresentationAttributeStyle(); return; } if (attrName == SVGNames::xAttr || attrName == SVGNames::yAttr) updateRelativeLengthsInformation(); if (auto renderer = this->renderer()) RenderSVGResource::markForLayoutAndParentResourceInvalidation(*renderer); }
void SVGCircleElement::svgAttributeChanged(const QualifiedName& attrName) { if (attrName == SVGNames::rAttr || attrName == SVGNames::cxAttr || attrName == SVGNames::cyAttr) { SVGElement::InvalidationGuard invalidationGuard(this); invalidateSVGPresentationAttributeStyle(); setNeedsStyleRecalc(LocalStyleChange, StyleChangeReasonForTracing::fromAttribute(attrName)); updateRelativeLengthsInformation(); LayoutSVGShape* layoutObject = toLayoutSVGShape(this->layoutObject()); if (!layoutObject) return; layoutObject->setNeedsShapeUpdate(); markForLayoutAndParentResourceInvalidation(layoutObject); return; } SVGGraphicsElement::svgAttributeChanged(attrName); }
void SVGImageElement::svgAttributeChanged(const QualifiedName& attrName) { bool isLengthAttribute = attrName == SVGNames::xAttr || attrName == SVGNames::yAttr || attrName == SVGNames::widthAttr || attrName == SVGNames::heightAttr; if (isLengthAttribute || attrName == SVGNames::preserveAspectRatioAttr) { SVGElement::InvalidationGuard invalidationGuard(this); if (isLengthAttribute) { invalidateSVGPresentationAttributeStyle(); setNeedsStyleRecalc(LocalStyleChange, StyleChangeReasonForTracing::fromAttribute(attrName)); updateRelativeLengthsInformation(); } LayoutObject* object = this->layoutObject(); if (!object) return; // FIXME: if isLengthAttribute then we should avoid this // call if the viewport didn't change, however since we don't // have the computed style yet we can't use updateImageViewport. // See http://crbug.com/466200. markForLayoutAndParentResourceInvalidation(object); return; } if (SVGURIReference::isKnownAttribute(attrName)) { SVGElement::InvalidationGuard invalidationGuard(this); if (inDocument()) imageLoader().updateFromElement(ImageLoader::UpdateIgnorePreviousError); else m_needsLoaderURIUpdate = true; return; } SVGGraphicsElement::svgAttributeChanged(attrName); }
void SVGRectElement::svgAttributeChanged(const QualifiedName& attrName) { if (!isSupportedAttribute(attrName)) { SVGGraphicsElement::svgAttributeChanged(attrName); return; } SVGElementInstance::InvalidationGuard invalidationGuard(this); if (attrName == SVGNames::xAttr || attrName == SVGNames::yAttr || attrName == SVGNames::widthAttr || attrName == SVGNames::heightAttr) { invalidateSVGPresentationAttributeStyle(); return; } bool isLengthAttribute = attrName == SVGNames::rxAttr || attrName == SVGNames::ryAttr; if (isLengthAttribute) updateRelativeLengthsInformation(); RenderSVGShape* renderer = toRenderSVGShape(this->renderer()); if (!renderer) return; if (isLengthAttribute) { renderer->setNeedsShapeUpdate(); RenderSVGResource::markForLayoutAndParentResourceInvalidation(*renderer); return; } if (SVGLangSpace::isKnownAttribute(attrName) || SVGExternalResourcesRequired::isKnownAttribute(attrName)) { RenderSVGResource::markForLayoutAndParentResourceInvalidation(*renderer); return; } ASSERT_NOT_REACHED(); }