15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2007 Nikolas Zimmermann <zimmermann@kde.org> 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Rob Buis <rwlbuis@gmail.com> 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version. 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful, 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details. 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB. If not, write to 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA. 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/SVGTextPathElement.h" 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 25e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "XLinkNames.h" 2653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/svg/RenderSVGResource.h" 2753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/svg/RenderSVGTextPath.h" 2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/SVGElementInstance.h" 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore { 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Animated property definitions 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DEFINE_ANIMATED_LENGTH(SVGTextPathElement, SVGNames::startOffsetAttr, StartOffset, startOffset) 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DEFINE_ANIMATED_ENUMERATION(SVGTextPathElement, SVGNames::methodAttr, Method, method, SVGTextPathMethodType) 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DEFINE_ANIMATED_ENUMERATION(SVGTextPathElement, SVGNames::spacingAttr, Spacing, spacing, SVGTextPathSpacingType) 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DEFINE_ANIMATED_STRING(SVGTextPathElement, XLinkNames::hrefAttr, Href, href) 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)BEGIN_REGISTER_ANIMATED_PROPERTIES(SVGTextPathElement) 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) REGISTER_LOCAL_ANIMATED_PROPERTY(startOffset) 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) REGISTER_LOCAL_ANIMATED_PROPERTY(method) 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) REGISTER_LOCAL_ANIMATED_PROPERTY(spacing) 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) REGISTER_LOCAL_ANIMATED_PROPERTY(href) 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) REGISTER_PARENT_ANIMATED_PROPERTIES(SVGTextContentElement) 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)END_REGISTER_ANIMATED_PROPERTIES 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)inline SVGTextPathElement::SVGTextPathElement(Document& document) 4751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) : SVGTextContentElement(SVGNames::textPathTag, document) 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_startOffset(LengthModeOther) 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_method(SVGTextPathMethodAlign) 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_spacing(SVGTextPathSpacingExact) 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) ScriptWrappable::init(this); 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) registerAnimatedPropertiesForSVGTextPathElement(); 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)PassRefPtr<SVGTextPathElement> SVGTextPathElement::create(Document& document) 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return adoptRef(new SVGTextPathElement(document)); 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SVGTextPathElement::~SVGTextPathElement() 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clearResourceReferences(); 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGTextPathElement::clearResourceReferences() 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 688abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) document().accessSVGExtensions()->removeAllTargetReferencesForElement(this); 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool SVGTextPathElement::isSupportedAttribute(const QualifiedName& attrName) 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DEFINE_STATIC_LOCAL(HashSet<QualifiedName>, supportedAttributes, ()); 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (supportedAttributes.isEmpty()) { 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SVGURIReference::addSupportedAttributes(supportedAttributes); 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) supportedAttributes.add(SVGNames::startOffsetAttr); 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) supportedAttributes.add(SVGNames::methodAttr); 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) supportedAttributes.add(SVGNames::spacingAttr); 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 80591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return supportedAttributes.contains<SVGAttributeHashTranslator>(attrName); 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 83926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void SVGTextPathElement::parseAttribute(const QualifiedName& name, const AtomicString& value) 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SVGParsingError parseError = NoError; 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 87926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!isSupportedAttribute(name)) 88926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) SVGTextContentElement::parseAttribute(name, value); 89926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else if (name == SVGNames::startOffsetAttr) 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setStartOffsetBaseValue(SVGLength::construct(LengthModeOther, value, parseError)); 91926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else if (name == SVGNames::methodAttr) { 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SVGTextPathMethodType propertyValue = SVGPropertyTraits<SVGTextPathMethodType>::fromString(value); 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (propertyValue > 0) 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setMethodBaseValue(propertyValue); 95926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } else if (name == SVGNames::spacingAttr) { 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SVGTextPathSpacingType propertyValue = SVGPropertyTraits<SVGTextPathSpacingType>::fromString(value); 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (propertyValue > 0) 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setSpacingBaseValue(propertyValue); 99926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } else if (SVGURIReference::parseAttribute(name, value)) { 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 103926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) reportAttributeParsingError(parseError, name, value); 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGTextPathElement::svgAttributeChanged(const QualifiedName& attrName) 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!isSupportedAttribute(attrName)) { 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SVGTextContentElement::svgAttributeChanged(attrName); 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SVGElementInstance::InvalidationGuard invalidationGuard(this); 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (SVGURIReference::isKnownAttribute(attrName)) { 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) buildPendingResource(); 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (attrName == SVGNames::startOffsetAttr) 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) updateRelativeLengthsInformation(); 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (RenderObject* object = renderer()) 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderSVGResource::markForLayoutAndParentResourceInvalidation(object); 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 127591b958dee2cf159d33a0b931e6231072eaf38d5Ben MurdochRenderObject* SVGTextPathElement::createRenderer(RenderStyle*) 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 129f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) return new RenderSVGTextPath(this); 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1328abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)bool SVGTextPathElement::childShouldCreateRenderer(const Node& child) const 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1348abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (child.isTextNode() 1358abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) || child.hasTagName(SVGNames::aTag) 1368abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) || child.hasTagName(SVGNames::tspanTag)) 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1428abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)bool SVGTextPathElement::rendererIsNeeded(const RenderStyle& style) 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (parentNode() 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) && (parentNode()->hasTagName(SVGNames::aTag) 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || parentNode()->hasTagName(SVGNames::textTag))) 1478abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) return Element::rendererIsNeeded(style); 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGTextPathElement::buildPendingResource() 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clearResourceReferences(); 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!inDocument()) 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String id; 159e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch Element* target = SVGURIReference::targetElementFromIRIString(hrefCurrentValue(), document(), &id); 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!target) { 161926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Do not register as pending if we are already pending this resource. 1628abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (document().accessSVGExtensions()->isElementPendingResource(this, id)) 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 165926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!id.isEmpty()) { 1668abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) document().accessSVGExtensions()->addPendingResource(id, this); 167926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(hasPendingResources()); 168926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 169926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } else if (target->hasTagName(SVGNames::pathTag)) { 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Register us with the target in the dependencies map. Any change of hrefElement 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // that leads to relayout/repainting now informs us, so we can react to it. 1728abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) document().accessSVGExtensions()->addElementReferencingTarget(this, toSVGElement(target)); 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node::InsertionNotificationRequest SVGTextPathElement::insertedInto(ContainerNode* rootParent) 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SVGTextContentElement::insertedInto(rootParent); 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) buildPendingResource(); 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return InsertionDone; 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGTextPathElement::removedFrom(ContainerNode* rootParent) 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SVGTextContentElement::removedFrom(rootParent); 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (rootParent->inDocument()) 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clearResourceReferences(); 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool SVGTextPathElement::selfHasRelativeLengths() const 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 192e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch return startOffsetCurrentValue().isRelative() 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || SVGTextContentElement::selfHasRelativeLengths(); 1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 197