Index: Source/core/svg/SVGStyledElement.cpp |
diff --git a/Source/core/svg/SVGStyledElement.cpp b/Source/core/svg/SVGStyledElement.cpp |
deleted file mode 100644 |
index 2fdfa7c9273071f551ae0fd2d62e87bca8b9545e..0000000000000000000000000000000000000000 |
--- a/Source/core/svg/SVGStyledElement.cpp |
+++ /dev/null |
@@ -1,472 +0,0 @@ |
-/* |
- * Copyright (C) 2004, 2005, 2006, 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org> |
- * Copyright (C) 2004, 2005, 2007, 2008 Rob Buis <buis@kde.org> |
- * |
- * This library is free software; you can redistribute it and/or |
- * modify it under the terms of the GNU Library General Public |
- * License as published by the Free Software Foundation; either |
- * version 2 of the License, or (at your option) any later version. |
- * |
- * This library is distributed in the hope that it will be useful, |
- * but WITHOUT ANY WARRANTY; without even the implied warranty of |
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
- * Library General Public License for more details. |
- * |
- * You should have received a copy of the GNU Library General Public License |
- * along with this library; see the file COPYING.LIB. If not, write to |
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
- * Boston, MA 02110-1301, USA. |
- */ |
- |
-#include "config.h" |
- |
-#include "core/svg/SVGStyledElement.h" |
- |
-#include "HTMLNames.h" |
-#include "SVGNames.h" |
-#include "core/css/CSSParser.h" |
-#include "core/dom/Attr.h" |
-#include "core/dom/Document.h" |
-#include "core/dom/EventNames.h" |
-#include "core/dom/NodeTraversal.h" |
-#include "core/dom/shadow/ShadowRoot.h" |
-#include "core/rendering/RenderObject.h" |
-#include "core/rendering/style/SVGRenderStyle.h" |
-#include "core/rendering/svg/RenderSVGResource.h" |
-#include "core/rendering/svg/RenderSVGResourceClipper.h" |
-#include "core/rendering/svg/RenderSVGResourceFilter.h" |
-#include "core/rendering/svg/RenderSVGResourceMasker.h" |
-#include "core/rendering/svg/SVGRenderSupport.h" |
-#include "core/svg/SVGElement.h" |
-#include "core/svg/SVGElementInstance.h" |
-#include "core/svg/SVGElementRareData.h" |
-#include "core/svg/SVGSVGElement.h" |
-#include "core/svg/SVGUseElement.h" |
-#include "wtf/Assertions.h" |
-#include "wtf/HashMap.h" |
-#include "wtf/StdLibExtras.h" |
-#include "wtf/text/WTFString.h" |
- |
-namespace WebCore { |
- |
-// Animated property definitions |
-DEFINE_ANIMATED_STRING(SVGStyledElement, HTMLNames::classAttr, ClassName, className) |
- |
-BEGIN_REGISTER_ANIMATED_PROPERTIES(SVGStyledElement) |
- REGISTER_LOCAL_ANIMATED_PROPERTY(className) |
-END_REGISTER_ANIMATED_PROPERTIES |
- |
-using namespace SVGNames; |
- |
-void mapAttributeToCSSProperty(HashMap<StringImpl*, CSSPropertyID>* propertyNameToIdMap, const QualifiedName& attrName) |
-{ |
- // FIXME: when CSS supports "transform-origin" the special case for transform_originAttr can be removed. |
- CSSPropertyID propertyId = cssPropertyID(attrName.localName()); |
- if (!propertyId && attrName == transform_originAttr) |
- propertyId = CSSPropertyWebkitTransformOrigin; // cssPropertyID("-webkit-transform-origin") |
- ASSERT(propertyId > 0); |
- propertyNameToIdMap->set(attrName.localName().impl(), propertyId); |
-} |
- |
-SVGStyledElement::SVGStyledElement(const QualifiedName& tagName, Document* document, ConstructionType constructionType) |
- : SVGElement(tagName, document, constructionType) |
-{ |
- ScriptWrappable::init(this); |
- registerAnimatedPropertiesForSVGStyledElement(); |
-} |
- |
-String SVGStyledElement::title() const |
-{ |
- // According to spec, we should not return titles when hovering over root <svg> elements (those |
- // <title> elements are the title of the document, not a tooltip) so we instantly return. |
- if (isOutermostSVGSVGElement()) |
- return String(); |
- |
- // Walk up the tree, to find out whether we're inside a <use> shadow tree, to find the right title. |
- if (isInShadowTree()) { |
- Element* shadowHostElement = toShadowRoot(treeScope()->rootNode())->host(); |
- // At this time, SVG nodes are not allowed in non-<use> shadow trees, so any shadow root we do |
- // have should be a use. The assert and following test is here to catch future shadow DOM changes |
- // that do enable SVG in a shadow tree. |
- ASSERT(!shadowHostElement || shadowHostElement->hasTagName(SVGNames::useTag)); |
- if (shadowHostElement && shadowHostElement->hasTagName(SVGNames::useTag)) { |
- SVGUseElement* useElement = toSVGUseElement(shadowHostElement); |
- |
- // If the <use> title is not empty we found the title to use. |
- String useTitle(useElement->title()); |
- if (!useTitle.isEmpty()) |
- return useTitle; |
- } |
- } |
- |
- // If we aren't an instance in a <use> or the <use> title was not found, then find the first |
- // <title> child of this element. |
- Element* titleElement = ElementTraversal::firstWithin(this); |
- for (; titleElement; titleElement = ElementTraversal::nextSkippingChildren(titleElement, this)) { |
- if (titleElement->hasTagName(SVGNames::titleTag) && titleElement->isSVGElement()) |
- break; |
- } |
- |
- // If a title child was found, return the text contents. |
- if (titleElement) |
- return titleElement->innerText(); |
- |
- // Otherwise return a null/empty string. |
- return String(); |
-} |
- |
-bool SVGStyledElement::rendererIsNeeded(const NodeRenderingContext& context) |
-{ |
- // http://www.w3.org/TR/SVG/extend.html#PrivateData |
- // Prevent anything other than SVG renderers from appearing in our render tree |
- // Spec: SVG allows inclusion of elements from foreign namespaces anywhere |
- // with the SVG content. In general, the SVG user agent will include the unknown |
- // elements in the DOM but will otherwise ignore unknown elements. |
- if (!parentOrShadowHostElement() || parentOrShadowHostElement()->isSVGElement()) |
- return Element::rendererIsNeeded(context); |
- |
- return false; |
-} |
- |
-CSSPropertyID SVGStyledElement::cssPropertyIdForSVGAttributeName(const QualifiedName& attrName) |
-{ |
- if (!attrName.namespaceURI().isNull()) |
- return CSSPropertyInvalid; |
- |
- static HashMap<StringImpl*, CSSPropertyID>* propertyNameToIdMap = 0; |
- if (!propertyNameToIdMap) { |
- propertyNameToIdMap = new HashMap<StringImpl*, CSSPropertyID>; |
- // This is a list of all base CSS and SVG CSS properties which are exposed as SVG XML attributes |
- mapAttributeToCSSProperty(propertyNameToIdMap, alignment_baselineAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, baseline_shiftAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, buffered_renderingAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, clipAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, clip_pathAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, clip_ruleAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, SVGNames::colorAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, color_interpolationAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, color_interpolation_filtersAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, color_profileAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, color_renderingAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, cursorAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, SVGNames::directionAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, displayAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, dominant_baselineAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, enable_backgroundAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, fillAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, fill_opacityAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, fill_ruleAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, filterAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, flood_colorAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, flood_opacityAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, font_familyAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, font_sizeAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, font_stretchAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, font_styleAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, font_variantAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, font_weightAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, glyph_orientation_horizontalAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, glyph_orientation_verticalAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, image_renderingAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, kerningAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, letter_spacingAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, lighting_colorAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, marker_endAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, marker_midAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, marker_startAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, maskAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, mask_typeAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, opacityAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, overflowAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, pointer_eventsAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, shape_renderingAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, stop_colorAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, stop_opacityAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, strokeAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, stroke_dasharrayAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, stroke_dashoffsetAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, stroke_linecapAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, stroke_linejoinAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, stroke_miterlimitAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, stroke_opacityAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, stroke_widthAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, text_anchorAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, text_decorationAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, text_renderingAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, transform_originAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, unicode_bidiAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, vector_effectAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, visibilityAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, word_spacingAttr); |
- mapAttributeToCSSProperty(propertyNameToIdMap, writing_modeAttr); |
- } |
- |
- return propertyNameToIdMap->get(attrName.localName().impl()); |
-} |
- |
-typedef HashMap<QualifiedName, AnimatedPropertyType> AttributeToPropertyTypeMap; |
-static inline AttributeToPropertyTypeMap& cssPropertyToTypeMap() |
-{ |
- DEFINE_STATIC_LOCAL(AttributeToPropertyTypeMap, s_cssPropertyMap, ()); |
- |
- if (!s_cssPropertyMap.isEmpty()) |
- return s_cssPropertyMap; |
- |
- // Fill the map for the first use. |
- s_cssPropertyMap.set(alignment_baselineAttr, AnimatedString); |
- s_cssPropertyMap.set(baseline_shiftAttr, AnimatedString); |
- s_cssPropertyMap.set(buffered_renderingAttr, AnimatedString); |
- s_cssPropertyMap.set(clipAttr, AnimatedRect); |
- s_cssPropertyMap.set(clip_pathAttr, AnimatedString); |
- s_cssPropertyMap.set(clip_ruleAttr, AnimatedString); |
- s_cssPropertyMap.set(SVGNames::colorAttr, AnimatedColor); |
- s_cssPropertyMap.set(color_interpolationAttr, AnimatedString); |
- s_cssPropertyMap.set(color_interpolation_filtersAttr, AnimatedString); |
- s_cssPropertyMap.set(color_profileAttr, AnimatedString); |
- s_cssPropertyMap.set(color_renderingAttr, AnimatedString); |
- s_cssPropertyMap.set(cursorAttr, AnimatedString); |
- s_cssPropertyMap.set(displayAttr, AnimatedString); |
- s_cssPropertyMap.set(dominant_baselineAttr, AnimatedString); |
- s_cssPropertyMap.set(fillAttr, AnimatedColor); |
- s_cssPropertyMap.set(fill_opacityAttr, AnimatedNumber); |
- s_cssPropertyMap.set(fill_ruleAttr, AnimatedString); |
- s_cssPropertyMap.set(filterAttr, AnimatedString); |
- s_cssPropertyMap.set(flood_colorAttr, AnimatedColor); |
- s_cssPropertyMap.set(flood_opacityAttr, AnimatedNumber); |
- s_cssPropertyMap.set(font_familyAttr, AnimatedString); |
- s_cssPropertyMap.set(font_sizeAttr, AnimatedLength); |
- s_cssPropertyMap.set(font_stretchAttr, AnimatedString); |
- s_cssPropertyMap.set(font_styleAttr, AnimatedString); |
- s_cssPropertyMap.set(font_variantAttr, AnimatedString); |
- s_cssPropertyMap.set(font_weightAttr, AnimatedString); |
- s_cssPropertyMap.set(image_renderingAttr, AnimatedString); |
- s_cssPropertyMap.set(kerningAttr, AnimatedLength); |
- s_cssPropertyMap.set(letter_spacingAttr, AnimatedLength); |
- s_cssPropertyMap.set(lighting_colorAttr, AnimatedColor); |
- s_cssPropertyMap.set(marker_endAttr, AnimatedString); |
- s_cssPropertyMap.set(marker_midAttr, AnimatedString); |
- s_cssPropertyMap.set(marker_startAttr, AnimatedString); |
- s_cssPropertyMap.set(maskAttr, AnimatedString); |
- s_cssPropertyMap.set(mask_typeAttr, AnimatedString); |
- s_cssPropertyMap.set(opacityAttr, AnimatedNumber); |
- s_cssPropertyMap.set(overflowAttr, AnimatedString); |
- s_cssPropertyMap.set(pointer_eventsAttr, AnimatedString); |
- s_cssPropertyMap.set(shape_renderingAttr, AnimatedString); |
- s_cssPropertyMap.set(stop_colorAttr, AnimatedColor); |
- s_cssPropertyMap.set(stop_opacityAttr, AnimatedNumber); |
- s_cssPropertyMap.set(strokeAttr, AnimatedColor); |
- s_cssPropertyMap.set(stroke_dasharrayAttr, AnimatedLengthList); |
- s_cssPropertyMap.set(stroke_dashoffsetAttr, AnimatedLength); |
- s_cssPropertyMap.set(stroke_linecapAttr, AnimatedString); |
- s_cssPropertyMap.set(stroke_linejoinAttr, AnimatedString); |
- s_cssPropertyMap.set(stroke_miterlimitAttr, AnimatedNumber); |
- s_cssPropertyMap.set(stroke_opacityAttr, AnimatedNumber); |
- s_cssPropertyMap.set(stroke_widthAttr, AnimatedLength); |
- s_cssPropertyMap.set(text_anchorAttr, AnimatedString); |
- s_cssPropertyMap.set(text_decorationAttr, AnimatedString); |
- s_cssPropertyMap.set(text_renderingAttr, AnimatedString); |
- s_cssPropertyMap.set(vector_effectAttr, AnimatedString); |
- s_cssPropertyMap.set(visibilityAttr, AnimatedString); |
- s_cssPropertyMap.set(word_spacingAttr, AnimatedLength); |
- return s_cssPropertyMap; |
-} |
- |
-void SVGStyledElement::animatedPropertyTypeForAttribute(const QualifiedName& attrName, Vector<AnimatedPropertyType>& propertyTypes) |
-{ |
- SVGElement::animatedPropertyTypeForAttribute(attrName, propertyTypes); |
- if (!propertyTypes.isEmpty()) |
- return; |
- |
- AttributeToPropertyTypeMap& cssPropertyTypeMap = cssPropertyToTypeMap(); |
- if (cssPropertyTypeMap.contains(attrName)) |
- propertyTypes.append(cssPropertyTypeMap.get(attrName)); |
-} |
- |
-bool SVGStyledElement::isAnimatableCSSProperty(const QualifiedName& attrName) |
-{ |
- return cssPropertyToTypeMap().contains(attrName); |
-} |
- |
-bool SVGStyledElement::isPresentationAttribute(const QualifiedName& name) const |
-{ |
- if (SVGStyledElement::cssPropertyIdForSVGAttributeName(name) > 0) |
- return true; |
- return SVGElement::isPresentationAttribute(name); |
-} |
- |
-void SVGStyledElement::collectStyleForPresentationAttribute(const QualifiedName& name, const AtomicString& value, MutableStylePropertySet* style) |
-{ |
- CSSPropertyID propertyID = SVGStyledElement::cssPropertyIdForSVGAttributeName(name); |
- if (propertyID > 0) |
- addPropertyToPresentationAttributeStyle(style, propertyID, value); |
-} |
- |
-void SVGStyledElement::parseAttribute(const QualifiedName& name, const AtomicString& value) |
-{ |
- // SVG animation has currently requires special storage of values so we set |
- // the className here. svgAttributeChanged actually causes the resulting |
- // style updates (instead of Element::parseAttribute). We don't |
- // tell Element about the change to avoid parsing the class list twice |
- if (name == HTMLNames::classAttr) { |
- setClassNameBaseValue(value); |
- return; |
- } |
- |
- // id is handled by Element which SVGElement inherits from |
- SVGElement::parseAttribute(name, value); |
-} |
- |
-bool SVGStyledElement::isKnownAttribute(const QualifiedName& attrName) |
-{ |
- return isIdAttributeName(attrName); |
-} |
- |
-void SVGStyledElement::svgAttributeChanged(const QualifiedName& attrName) |
-{ |
- CSSPropertyID propId = SVGStyledElement::cssPropertyIdForSVGAttributeName(attrName); |
- if (propId > 0) { |
- SVGElementInstance::invalidateAllInstancesOfElement(this); |
- return; |
- } |
- |
- if (attrName == HTMLNames::classAttr) { |
- classAttributeChanged(classNameCurrentValue()); |
- SVGElementInstance::invalidateAllInstancesOfElement(this); |
- return; |
- } |
- |
- if (isIdAttributeName(attrName)) { |
- RenderObject* object = renderer(); |
- // Notify resources about id changes, this is important as we cache resources by id in SVGDocumentExtensions |
- if (object && object->isSVGResourceContainer()) |
- object->toRenderSVGResourceContainer()->idChanged(); |
- if (inDocument()) |
- buildPendingResourcesIfNeeded(); |
- SVGElementInstance::invalidateAllInstancesOfElement(this); |
- return; |
- } |
-} |
- |
-Node::InsertionNotificationRequest SVGStyledElement::insertedInto(ContainerNode* rootParent) |
-{ |
- SVGElement::insertedInto(rootParent); |
- updateRelativeLengthsInformation(); |
- buildPendingResourcesIfNeeded(); |
- return InsertionDone; |
-} |
- |
-void SVGStyledElement::buildPendingResourcesIfNeeded() |
-{ |
- Document* document = this->document(); |
- if (!needsPendingResourceHandling() || !document || !inDocument() || isInShadowTree()) |
- return; |
- |
- SVGDocumentExtensions* extensions = document->accessSVGExtensions(); |
- String resourceId = getIdAttribute(); |
- if (!extensions->hasPendingResource(resourceId)) |
- return; |
- |
- // Mark pending resources as pending for removal. |
- extensions->markPendingResourcesForRemoval(resourceId); |
- |
- // Rebuild pending resources for each client of a pending resource that is being removed. |
- while (Element* clientElement = extensions->removeElementFromPendingResourcesForRemoval(resourceId)) { |
- ASSERT(clientElement->hasPendingResources()); |
- if (clientElement->hasPendingResources()) { |
- clientElement->buildPendingResource(); |
- extensions->clearHasPendingResourcesIfPossible(clientElement); |
- } |
- } |
-} |
- |
-void SVGStyledElement::removedFrom(ContainerNode* rootParent) |
-{ |
- if (rootParent->inDocument()) |
- updateRelativeLengthsInformation(false, this); |
- SVGElement::removedFrom(rootParent); |
- SVGElementInstance::invalidateAllInstancesOfElement(this); |
-} |
- |
-void SVGStyledElement::childrenChanged(bool changedByParser, Node* beforeChange, Node* afterChange, int childCountDelta) |
-{ |
- SVGElement::childrenChanged(changedByParser, beforeChange, afterChange, childCountDelta); |
- |
- // Invalidate all SVGElementInstances associated with us |
- if (!changedByParser) |
- SVGElementInstance::invalidateAllInstancesOfElement(this); |
-} |
- |
-PassRefPtr<CSSValue> SVGStyledElement::getPresentationAttribute(const String& name) |
-{ |
- if (!hasAttributesWithoutUpdate()) |
- return 0; |
- |
- QualifiedName attributeName(nullAtom, name, nullAtom); |
- const Attribute* attr = getAttributeItem(attributeName); |
- if (!attr) |
- return 0; |
- |
- RefPtr<MutableStylePropertySet> style = MutableStylePropertySet::create(SVGAttributeMode); |
- CSSPropertyID propertyID = SVGStyledElement::cssPropertyIdForSVGAttributeName(attr->name()); |
- style->setProperty(propertyID, attr->value()); |
- RefPtr<CSSValue> cssValue = style->getPropertyCSSValue(propertyID); |
- return cssValue ? cssValue->cloneForCSSOM() : 0; |
-} |
- |
-bool SVGStyledElement::instanceUpdatesBlocked() const |
-{ |
- return hasSVGRareData() && svgRareData()->instanceUpdatesBlocked(); |
-} |
- |
-void SVGStyledElement::setInstanceUpdatesBlocked(bool value) |
-{ |
- if (hasSVGRareData()) |
- svgRareData()->setInstanceUpdatesBlocked(value); |
-} |
- |
-AffineTransform SVGStyledElement::localCoordinateSpaceTransform(SVGLocatable::CTMScope) const |
-{ |
- // To be overriden by SVGStyledLocatableElement/SVGGraphicsElement (or as special case SVGTextElement and SVGPatternElement) |
- return AffineTransform(); |
-} |
- |
-void SVGStyledElement::updateRelativeLengthsInformation(bool hasRelativeLengths, SVGStyledElement* element) |
-{ |
- // If we're not yet in a document, this function will be called again from insertedInto(). Do nothing now. |
- if (!inDocument()) |
- return; |
- |
- // An element wants to notify us that its own relative lengths state changed. |
- // Register it in the relative length map, and register us in the parent relative length map. |
- // Register the parent in the grandparents map, etc. Repeat procedure until the root of the SVG tree. |
- |
- if (hasRelativeLengths) |
- m_elementsWithRelativeLengths.add(element); |
- else { |
- if (!m_elementsWithRelativeLengths.contains(element)) { |
- // We were never registered. Do nothing. |
- return; |
- } |
- |
- m_elementsWithRelativeLengths.remove(element); |
- } |
- |
- // Find first styled parent node, and notify it that we've changed our relative length state. |
- ContainerNode* node = parentNode(); |
- while (node) { |
- if (!node->isSVGElement()) |
- break; |
- |
- SVGElement* element = toSVGElement(node); |
- if (!element->isSVGStyledElement()) { |
- node = node->parentNode(); |
- continue; |
- } |
- |
- // Register us in the parent element map. |
- toSVGStyledElement(element)->updateRelativeLengthsInformation(hasRelativeLengths, this); |
- break; |
- } |
-} |
- |
-} |