void SVGUseElement::transferEventListenersToShadowTree(SVGElementInstance* target) { if (!target) return; SVGElement* originalElement = target->correspondingElement(); ASSERT(originalElement); if (SVGElement* shadowTreeElement = target->shadowTreeElement()) { if (EventTargetData* d = originalElement->eventTargetData()) { EventListenerMap& map = d->eventListenerMap; EventListenerMap::iterator end = map.end(); for (EventListenerMap::iterator it = map.begin(); it != end; ++it) { EventListenerVector& entry = *it->second; for (size_t i = 0; i < entry.size(); ++i) { // Event listeners created from markup have already been transfered to the shadow tree during cloning. if (entry[i].listener->wasCreatedFromMarkup()) continue; shadowTreeElement->addEventListener(it->first, entry[i].listener, entry[i].useCapture); } } } } for (SVGElementInstance* instance = target->firstChild(); instance; instance = instance->nextSibling()) transferEventListenersToShadowTree(instance); }
static void associateReplacementCloneWithOriginal(SVGElement& replacementClone, SVGElement& originalClone) { auto* correspondingElement = originalClone.correspondingElement(); ASSERT(correspondingElement); originalClone.setCorrespondingElement(nullptr); replacementClone.setCorrespondingElement(correspondingElement); }
void SVGUseElement::transferSizeAttributesToTargetClone(SVGElement& shadowElement) const { // FIXME: The check for valueInSpecifiedUnits being non-zero below is a workaround for the fact // that we currently have no good way to tell whether a particular animatable attribute is a value // indicating it was unspecified, or specified but could not be parsed. Would be nice to fix that some day. if (is<SVGSymbolElement>(shadowElement)) { // Spec (<use> on <symbol>): This generated 'svg' will always have explicit values for attributes width and height. // If attributes width and/or height are provided on the 'use' element, then these attributes // will be transferred to the generated 'svg'. If attributes width and/or height are not specified, // the generated 'svg' element will use values of 100% for these attributes. shadowElement.setAttribute(SVGNames::widthAttr, (widthIsValid() && width().valueInSpecifiedUnits()) ? AtomicString(width().valueAsString()) : "100%"); shadowElement.setAttribute(SVGNames::heightAttr, (heightIsValid() && height().valueInSpecifiedUnits()) ? AtomicString(height().valueAsString()) : "100%"); } else if (is<SVGSVGElement>(shadowElement)) { // Spec (<use> on <svg>): If attributes width and/or height are provided on the 'use' element, then these // values will override the corresponding attributes on the 'svg' in the generated tree. SVGElement* correspondingElement = shadowElement.correspondingElement(); shadowElement.setAttribute(SVGNames::widthAttr, (widthIsValid() && width().valueInSpecifiedUnits()) ? AtomicString(width().valueAsString()) : (correspondingElement ? correspondingElement->getAttribute(SVGNames::widthAttr) : nullAtom)); shadowElement.setAttribute(SVGNames::heightAttr, (heightIsValid() && height().valueInSpecifiedUnits()) ? AtomicString(height().valueAsString()) : (correspondingElement ? correspondingElement->getAttribute(SVGNames::heightAttr) : nullAtom)); } }