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) 26namespace WebCore { 27 28class SVGElement; 29 30// GetOwnerElementForType implementation 31template<typename OwnerType, bool isDerivedFromSVGElement> 32struct GetOwnerElementForType; 33 34template<typename OwnerType> 35struct GetOwnerElementForType<OwnerType, true> : public Noncopyable { 36 static SVGElement* ownerElement(OwnerType* type) 37 { 38 return type; 39 } 40}; 41 42template<typename OwnerType> 43struct 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 53template<typename OwnerType> 54struct IsDerivedFromSVGElement : public Noncopyable { 55 static const bool value = true; 56}; 57 58class SVGViewSpec; 59template<> 60struct IsDerivedFromSVGElement<SVGViewSpec> : public Noncopyable { 61 static const bool value = false; 62}; 63 64// Helper template used for synchronizing SVG <-> XML properties 65template<bool isDerivedFromSVGElement> 66struct SVGAnimatedPropertySynchronizer { 67 static void synchronize(SVGElement*, const QualifiedName&, const AtomicString&); 68}; 69 70template<> 71struct 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 85template<> 86struct 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