1 /* 2 Copyright (C) Research In Motion Limited 2010. All rights reserved. 3 4 This library is free software; you can redistribute it and/or 5 modify it under the terms of the GNU Library General Public 6 License as published by the Free Software Foundation; either 7 version 2 of the License, or (at your option) any later version. 8 9 This library is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 Library General Public License for more details. 13 14 You should have received a copy of the GNU Library General Public License 15 along with this library; see the file COPYING.LIB. If not, write to 16 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 17 Boston, MA 02110-1301, USA. 18 */ 19 20 #ifndef SVGAnimatedPropertySynchronizer_h 21 #define SVGAnimatedPropertySynchronizer_h 22 23 #include "SVGAnimatedPropertyTraits.h" 24 25 #if ENABLE(SVG) 26 namespace WebCore { 27 28 class SVGElement; 29 30 // GetOwnerElementForType implementation 31 template<typename OwnerType, bool isDerivedFromSVGElement> 32 struct GetOwnerElementForType; 33 34 template<typename OwnerType> 35 struct GetOwnerElementForType<OwnerType, true> : public Noncopyable { 36 static SVGElement* ownerElement(OwnerType* type) 37 { 38 return type; 39 } 40 }; 41 42 template<typename OwnerType> 43 struct GetOwnerElementForType<OwnerType, false> : public Noncopyable { 44 static SVGElement* ownerElement(OwnerType* type) 45 { 46 SVGElement* context = type->contextElement(); 47 ASSERT(context); 48 return context; 49 } 50 }; 51 52 // IsDerivedFromSVGElement implementation 53 template<typename OwnerType> 54 struct IsDerivedFromSVGElement : public Noncopyable { 55 static const bool value = true; 56 }; 57 58 class SVGViewSpec; 59 template<> 60 struct IsDerivedFromSVGElement<SVGViewSpec> : public Noncopyable { 61 static const bool value = false; 62 }; 63 64 // Helper template used for synchronizing SVG <-> XML properties 65 template<bool isDerivedFromSVGElement> 66 struct SVGAnimatedPropertySynchronizer { 67 static void synchronize(SVGElement*, const QualifiedName&, const AtomicString&); 68 }; 69 70 template<> 71 struct SVGAnimatedPropertySynchronizer<true> { 72 static void synchronize(SVGElement* ownerElement, const QualifiedName& attrName, const AtomicString& value) 73 { 74 NamedNodeMap* namedAttrMap = ownerElement->attributes(false); 75 Attribute* old = namedAttrMap->getAttributeItem(attrName); 76 if (old && value.isNull()) 77 namedAttrMap->removeAttribute(old->name()); 78 else if (!old && !value.isNull()) 79 namedAttrMap->addAttribute(ownerElement->createAttribute(attrName, value)); 80 else if (old && !value.isNull()) 81 old->setValue(value); 82 } 83 }; 84 85 template<> 86 struct SVGAnimatedPropertySynchronizer<false> { 87 static void synchronize(SVGElement*, const QualifiedName&, const AtomicString&) 88 { 89 // no-op, for types not inheriting from Element, thus nothing to synchronize 90 } 91 }; 92 93 }; 94 95 #endif 96 #endif 97