summaryrefslogtreecommitdiffstats
path: root/WebCore/bindings/js/JSSVGPODTypeWrapper.h
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/bindings/js/JSSVGPODTypeWrapper.h')
-rw-r--r--WebCore/bindings/js/JSSVGPODTypeWrapper.h410
1 files changed, 0 insertions, 410 deletions
diff --git a/WebCore/bindings/js/JSSVGPODTypeWrapper.h b/WebCore/bindings/js/JSSVGPODTypeWrapper.h
deleted file mode 100644
index 2329365..0000000
--- a/WebCore/bindings/js/JSSVGPODTypeWrapper.h
+++ /dev/null
@@ -1,410 +0,0 @@
-/*
- * Copyright (C) 2006, 2008 Nikolas Zimmermann <zimmermann@kde.org>
- * Copyright (C) 2008 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef JSSVGPODTypeWrapper_h
-#define JSSVGPODTypeWrapper_h
-
-#if ENABLE(SVG)
-#include "JSSVGContextCache.h"
-#include "SVGElement.h"
-#include <wtf/StdLibExtras.h>
-
-namespace WebCore {
-
-class DOMObject;
-
-template<typename PODType>
-class JSSVGPODTypeWrapper : public RefCounted<JSSVGPODTypeWrapper<PODType> > {
-public:
- virtual ~JSSVGPODTypeWrapper() { }
-
- virtual operator PODType() = 0;
- virtual void commitChange(PODType, DOMObject*) = 0;
-};
-
-// This file contains JS wrapper objects for SVG datatypes, that are passed around by value
-// in WebCore/svg (aka. 'POD types'). For instance SVGMatrix is mapped to AffineTransform, and
-// passed around as const reference. SVG DOM demands these objects to be "live", changes to any
-// of the writable attributes of SVGMatrix need to be reflected in the object which exposed the
-// SVGMatrix object (i.e. 'someElement.transform.matrix.a = 50.0', in that case 'SVGTransform').
-// The SVGTransform class stores its "AffineTransform m_matrix" object on the stack. If it would
-// be stored as pointer we could just build an auto-generated JSSVG* wrapper object around it
-// and all changes to that object would automatically affect the AffineTransform* object stored
-// in the SVGTransform object. For the sake of efficiency and memory we don't pass around any
-// primitive values as pointers, so a custom JS wrapper object is needed for all SVG types, that
-// are internally represented by POD types (SVGRect <-> FloatRect, SVGPoint <-> FloatPoint, ...).
-// Those custom wrappers are called JSSVGPODTypeWrapper and are capable of updating the POD types
-// by taking function pointers to the getter & setter functions of the "creator object", the object
-// which exposed a SVG POD type. For example, the JSSVGPODTypeWrapper object wrapping a SVGMatrix
-// object takes (SVGTransform*, &SVGTransform::matrix, &SVGTransform::setMatrix). A JS call like
-// "someElement.transform.matrix.a = 50.0' causes the JSSVGMatrix object to call SVGTransform::setMatrix,
-// method, which in turn notifies 'someElement' that the 'SVGNames::transformAttr' has changed.
-// That's a short sketch of our SVG DOM implementation.
-
-// Represents a JS wrapper object for SVGAnimated* classes, exposing SVG POD types that contain writable properties
-// (Two cases: SVGAnimatedLength exposing SVGLength, SVGAnimatedRect exposing SVGRect)
-
-#if COMPILER(MSVC)
-// GetterMethod and SetterMethod are each 12 bytes. We have to pack to a size
-// greater than or equal to that to avoid an alignment warning (C4121). 16 is
-// the next-largest size allowed for packing, so we use that.
-#pragma pack(push, 16)
-#endif
-template<typename PODType, typename PODTypeCreator>
-class JSSVGDynamicPODTypeWrapper : public JSSVGPODTypeWrapper<PODType> {
-public:
- typedef PODType (PODTypeCreator::*GetterMethod)() const;
- typedef void (PODTypeCreator::*SetterMethod)(const PODType&);
-
- static PassRefPtr<JSSVGDynamicPODTypeWrapper> create(PassRefPtr<PODTypeCreator> creator, GetterMethod getter, SetterMethod setter)
- {
- return adoptRef(new JSSVGDynamicPODTypeWrapper(creator, getter, setter));
- }
-
- virtual operator PODType()
- {
- return (m_creator.get()->*m_getter)();
- }
-
- virtual void commitChange(PODType type, DOMObject* wrapper)
- {
- (m_creator.get()->*m_setter)(type);
- JSSVGContextCache::propagateSVGDOMChange(wrapper, m_creator->associatedAttributeName());
- }
-
-private:
- JSSVGDynamicPODTypeWrapper(PassRefPtr<PODTypeCreator> creator, GetterMethod getter, SetterMethod setter)
- : m_creator(creator)
- , m_getter(getter)
- , m_setter(setter)
- {
- ASSERT(m_creator);
- ASSERT(m_getter);
- ASSERT(m_setter);
- }
-
- virtual ~JSSVGDynamicPODTypeWrapper();
-
- // Update callbacks
- RefPtr<PODTypeCreator> m_creator;
- GetterMethod m_getter;
- SetterMethod m_setter;
-};
-#if COMPILER(MSVC)
-#pragma pack(pop)
-#endif
-
-// Represents a JS wrapper object for SVG POD types (not for SVGAnimated* classes). Any modification to the SVG POD
-// types don't cause any updates unlike JSSVGDynamicPODTypeWrapper. This class is used for return values (ie. getBBox())
-// and for properties where SVG specification explicitly states, that the contents of the POD type are immutable.
-
-template<typename PODType>
-class JSSVGStaticPODTypeWrapper : public JSSVGPODTypeWrapper<PODType> {
-public:
- static PassRefPtr<JSSVGStaticPODTypeWrapper> create(PODType type)
- {
- return adoptRef(new JSSVGStaticPODTypeWrapper(type));
- }
-
- virtual operator PODType()
- {
- return m_podType;
- }
-
- virtual void commitChange(PODType type, DOMObject*)
- {
- m_podType = type;
- }
-
-protected:
- JSSVGStaticPODTypeWrapper(PODType type)
- : m_podType(type)
- {
- }
-
- PODType m_podType;
-};
-
-template<typename PODType, typename ParentTypeArg>
-class JSSVGStaticPODTypeWrapperWithPODTypeParent : public JSSVGStaticPODTypeWrapper<PODType> {
-public:
- typedef JSSVGPODTypeWrapper<ParentTypeArg> ParentType;
-
- static PassRefPtr<JSSVGStaticPODTypeWrapperWithPODTypeParent> create(PODType type, PassRefPtr<ParentType> parent)
- {
- return adoptRef(new JSSVGStaticPODTypeWrapperWithPODTypeParent(type, parent));
- }
-
- virtual void commitChange(PODType type, DOMObject* wrapper)
- {
- JSSVGStaticPODTypeWrapper<PODType>::commitChange(type, wrapper);
- m_parentType->commitChange(ParentTypeArg(type), wrapper);
- }
-
-private:
- JSSVGStaticPODTypeWrapperWithPODTypeParent(PODType type, PassRefPtr<ParentType> parent)
- : JSSVGStaticPODTypeWrapper<PODType>(type)
- , m_parentType(parent)
- {
- }
-
- RefPtr<ParentType> m_parentType;
-};
-
-#if COMPILER(MSVC)
-// GetterMethod and SetterMethod are each 12 bytes. We have to pack to a size
-// greater than or equal to that to avoid an alignment warning (C4121). 16 is
-// the next-largest size allowed for packing, so we use that.
-#pragma pack(push, 16)
-#endif
-template<typename PODType, typename ParentType>
-class JSSVGStaticPODTypeWrapperWithParent : public JSSVGPODTypeWrapper<PODType> {
-public:
- typedef PODType (ParentType::*GetterMethod)() const;
- typedef void (ParentType::*SetterMethod)(const PODType&);
-
- static PassRefPtr<JSSVGStaticPODTypeWrapperWithParent> create(PassRefPtr<ParentType> parent, GetterMethod getter, SetterMethod setter)
- {
- return adoptRef(new JSSVGStaticPODTypeWrapperWithParent(parent, getter, setter));
- }
-
- virtual operator PODType()
- {
- return (m_parent.get()->*m_getter)();
- }
-
- virtual void commitChange(PODType type, DOMObject*)
- {
- (m_parent.get()->*m_setter)(type);
- }
-
-private:
- JSSVGStaticPODTypeWrapperWithParent(PassRefPtr<ParentType> parent, GetterMethod getter, SetterMethod setter)
- : m_parent(parent)
- , m_getter(getter)
- , m_setter(setter)
- {
- ASSERT(m_parent);
- ASSERT(m_getter);
- ASSERT(m_setter);
- }
-
- // Update callbacks
- RefPtr<ParentType> m_parent;
- GetterMethod m_getter;
- SetterMethod m_setter;
-};
-
-template<typename PODType>
-class SVGPODListItem;
-
-// Just like JSSVGDynamicPODTypeWrapper, but only used for SVGList* objects wrapping around POD values.
-
-template<typename PODType>
-class JSSVGPODTypeWrapperCreatorForList : public JSSVGPODTypeWrapper<PODType> {
-public:
- typedef SVGPODListItem<PODType> PODListItemPtrType;
-
- typedef PODType (SVGPODListItem<PODType>::*GetterMethod)() const;
- typedef void (SVGPODListItem<PODType>::*SetterMethod)(const PODType&);
-
- static PassRefPtr<JSSVGPODTypeWrapperCreatorForList> create(PassRefPtr<PODListItemPtrType> creator, const QualifiedName& attributeName)
- {
- return adoptRef(new JSSVGPODTypeWrapperCreatorForList(creator, attributeName));
- }
-
- virtual operator PODType()
- {
- return (m_creator.get()->*m_getter)();
- }
-
- virtual void commitChange(PODType type, DOMObject* wrapper)
- {
- if (!m_setter)
- return;
-
- (m_creator.get()->*m_setter)(type);
- JSSVGContextCache::propagateSVGDOMChange(wrapper, m_associatedAttributeName);
- }
-
-private:
- JSSVGPODTypeWrapperCreatorForList(PassRefPtr<PODListItemPtrType> creator, const QualifiedName& attributeName)
- : m_creator(creator)
- , m_getter(&PODListItemPtrType::value)
- , m_setter(&PODListItemPtrType::setValue)
- , m_associatedAttributeName(attributeName)
- {
- ASSERT(m_creator);
- ASSERT(m_getter);
- ASSERT(m_setter);
- }
-
- // Update callbacks
- RefPtr<PODListItemPtrType> m_creator;
- GetterMethod m_getter;
- SetterMethod m_setter;
- const QualifiedName& m_associatedAttributeName;
-};
-
-// Caching facilities
-template<typename PODType, typename PODTypeCreator>
-struct PODTypeWrapperCacheInfo {
- typedef PODType (PODTypeCreator::*GetterMethod)() const;
- typedef void (PODTypeCreator::*SetterMethod)(const PODType&);
-
- // Empty value
- PODTypeWrapperCacheInfo()
- : creator(0)
- , getter(0)
- , setter(0)
- {
- }
-
- // Deleted value
- PODTypeWrapperCacheInfo(WTF::HashTableDeletedValueType)
- : creator(reinterpret_cast<PODTypeCreator*>(-1))
- , getter(0)
- , setter(0)
- {
- }
- bool isHashTableDeletedValue() const
- {
- return creator == reinterpret_cast<PODTypeCreator*>(-1);
- }
-
- PODTypeWrapperCacheInfo(PODTypeCreator* _creator, GetterMethod _getter, SetterMethod _setter)
- : creator(_creator)
- , getter(_getter)
- , setter(_setter)
- {
- ASSERT(creator);
- ASSERT(getter);
- }
-
- bool operator==(const PODTypeWrapperCacheInfo& other) const
- {
- return creator == other.creator && getter == other.getter && setter == other.setter;
- }
-
- PODTypeCreator* creator;
- GetterMethod getter;
- SetterMethod setter;
-};
-#if COMPILER(MSVC)
-#pragma pack(pop)
-#endif
-
-template<typename PODType, typename PODTypeCreator>
-struct PODTypeWrapperCacheInfoHash {
- typedef PODTypeWrapperCacheInfo<PODType, PODTypeCreator> CacheInfo;
-
- static unsigned hash(const CacheInfo& info)
- {
- return WTF::StringHasher::createBlobHash<sizeof(CacheInfo)>(&info);
- }
-
- static bool equal(const CacheInfo& a, const CacheInfo& b)
- {
- return a == b;
- }
-
- static const bool safeToCompareToEmptyOrDeleted = true;
-};
-
-template<typename PODType, typename PODTypeCreator>
-struct PODTypeWrapperCacheInfoTraits : WTF::GenericHashTraits<PODTypeWrapperCacheInfo<PODType, PODTypeCreator> > {
- typedef PODTypeWrapperCacheInfo<PODType, PODTypeCreator> CacheInfo;
-
- static const bool emptyValueIsZero = true;
- static const bool needsDestruction = false;
-
- static const CacheInfo& emptyValue()
- {
- DEFINE_STATIC_LOCAL(CacheInfo, key, ());
- return key;
- }
-
- static void constructDeletedValue(CacheInfo& slot)
- {
- new (&slot) CacheInfo(WTF::HashTableDeletedValue);
- }
-
- static bool isDeletedValue(const CacheInfo& value)
- {
- return value.isHashTableDeletedValue();
- }
-};
-
-// Used for dynamic read-write attributes
-template<typename PODType, typename PODTypeCreator>
-class JSSVGDynamicPODTypeWrapperCache {
-public:
- typedef PODType (PODTypeCreator::*GetterMethod)() const;
- typedef void (PODTypeCreator::*SetterMethod)(const PODType&);
-
- typedef PODTypeWrapperCacheInfo<PODType, PODTypeCreator> CacheInfo;
- typedef PODTypeWrapperCacheInfoHash<PODType, PODTypeCreator> CacheInfoHash;
- typedef PODTypeWrapperCacheInfoTraits<PODType, PODTypeCreator> CacheInfoTraits;
-
- typedef JSSVGPODTypeWrapper<PODType> WrapperBase;
- typedef JSSVGDynamicPODTypeWrapper<PODType, PODTypeCreator> Wrapper;
- typedef HashMap<CacheInfo, Wrapper*, CacheInfoHash, CacheInfoTraits> WrapperMap;
-
- static WrapperMap& wrapperMap()
- {
- DEFINE_STATIC_LOCAL(WrapperMap, s_wrapperMap, ());
- return s_wrapperMap;
- }
-
- static PassRefPtr<WrapperBase> lookupOrCreateWrapper(PODTypeCreator* creator, GetterMethod getter, SetterMethod setter)
- {
- CacheInfo info(creator, getter, setter);
- pair<typename WrapperMap::iterator, bool> result = wrapperMap().add(info, 0);
- if (!result.second) // pre-existing entry
- return result.first->second;
-
- RefPtr<Wrapper> wrapper = Wrapper::create(creator, getter, setter);
- result.first->second = wrapper.get();
- return wrapper.release();
- }
-
- static void forgetWrapper(PODTypeCreator* creator, GetterMethod getter, SetterMethod setter)
- {
- CacheInfo info(creator, getter, setter);
- wrapperMap().remove(info);
- }
-};
-
-template<typename PODType, typename PODTypeCreator>
-JSSVGDynamicPODTypeWrapper<PODType, PODTypeCreator>::~JSSVGDynamicPODTypeWrapper()
-{
- JSSVGDynamicPODTypeWrapperCache<PODType, PODTypeCreator>::forgetWrapper(m_creator.get(), m_getter, m_setter);
-}
-
-} // namespace WebCore
-
-#endif // ENABLE(SVG)
-#endif // JSSVGPODTypeWrapper_h