Element* SVGURIReference::targetElementFromIRIString(const String& iri, Document& document, String* fragmentIdentifier, Document* externalDocument) { // If there's no fragment identifier contained within the IRI string, we can't lookup an element. String id; KURL url = urlFromIRIStringWithFragmentIdentifier(iri, document, id); if (url == KURL()) return 0; if (fragmentIdentifier) *fragmentIdentifier = id; if (id.isEmpty()) return 0; if (externalDocument) { // Enforce that the referenced url matches the url of the document that we've loaded for it! ASSERT(equalIgnoringFragmentIdentifier(url, externalDocument->url())); return externalDocument->getElementById(id); } // Exit early if the referenced url is external, and we have no externalDocument given. if (isExternalURIReference(iri, document)) return 0; return document.getElementById(id); }
void SVGUseElement::svgAttributeChanged(const QualifiedName& attrName) { if (!isSupportedAttribute(attrName)) { SVGGraphicsElement::svgAttributeChanged(attrName); return; } SVGElementInstance::InvalidationGuard invalidationGuard(this); auto renderer = this->renderer(); if (attrName == SVGNames::xAttr || attrName == SVGNames::yAttr || attrName == SVGNames::widthAttr || attrName == SVGNames::heightAttr) { updateRelativeLengthsInformation(); if (renderer) RenderSVGResource::markForLayoutAndParentResourceInvalidation(*renderer); return; } if (SVGExternalResourcesRequired::handleAttributeChange(this, attrName)) return; if (SVGURIReference::isKnownAttribute(attrName)) { bool isExternalReference = isExternalURIReference(href(), document()); if (isExternalReference) { URL url = document().completeURL(href()); if (url.hasFragmentIdentifier()) { CachedResourceRequest request(ResourceRequest(url.string())); request.setInitiator(this); setCachedDocument(document().cachedResourceLoader()->requestSVGDocument(request)); } } else setCachedDocument(0); if (!m_wasInsertedByParser) buildPendingResource(); return; } if (SVGLangSpace::isKnownAttribute(attrName) || SVGExternalResourcesRequired::isKnownAttribute(attrName)) { invalidateShadowTree(); return; } ASSERT_NOT_REACHED(); }
Document* SVGUseElement::referencedDocument() const { if (!isExternalURIReference(href(), document())) return &document(); return externalDocument(); }