Index: webkit/port/bindings/v8/V8SVGPODTypeWrapper.h |
=================================================================== |
--- webkit/port/bindings/v8/V8SVGPODTypeWrapper.h (revision 19853) |
+++ webkit/port/bindings/v8/V8SVGPODTypeWrapper.h (working copy) |
@@ -1,387 +0,0 @@ |
-/* |
- * Copyright (C) 2006, 2008 Nikolas Zimmermann <zimmermann@kde.org> |
- * Copyright (C) 2008 Apple Inc. All rights reserved. |
- * Copyright (C) 2008 The Chromium Authors. 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 V8SVGPODTypeWrapper_h |
-#define V8SVGPODTypeWrapper_h |
- |
-#if ENABLE(SVG) |
- |
-#include "config.h" |
-#include "SVGElement.h" |
-#include "SVGList.h" |
-#include <wtf/Assertions.h> |
-#include <wtf/RefCounted.h> |
-#include <wtf/HashMap.h> |
-#include "V8Proxy.h" |
- |
-namespace WebCore { |
- |
-template<typename PODType> |
-class V8SVGPODTypeWrapper : public RefCounted<V8SVGPODTypeWrapper<PODType> > { |
-public: |
- V8SVGPODTypeWrapper() { } |
- virtual ~V8SVGPODTypeWrapper() { } |
- virtual operator PODType() = 0; |
- virtual void commitChange(PODType, SVGElement*) = 0; |
-}; |
- |
-template<typename PODType> |
-class V8SVGPODTypeWrapperCreatorForList : public V8SVGPODTypeWrapper<PODType> |
-{ |
-public: |
- typedef PODType (SVGPODListItem<PODType>::*GetterMethod)() const; |
- typedef void (SVGPODListItem<PODType>::*SetterMethod)(PODType); |
- |
- V8SVGPODTypeWrapperCreatorForList(SVGPODListItem<PODType>* creator, const QualifiedName& attributeName) |
- : m_creator(creator) |
- , m_getter(&SVGPODListItem<PODType>::value) |
- , m_setter(&SVGPODListItem<PODType>::setValue) |
- , m_associatedAttributeName(attributeName) |
- { |
- ASSERT(m_creator); |
- ASSERT(m_getter); |
- ASSERT(m_setter); |
- } |
- |
- virtual ~V8SVGPODTypeWrapperCreatorForList() { } |
- |
- // Getter wrapper |
- virtual operator PODType() { return (m_creator.get()->*m_getter)(); } |
- |
- // Setter wrapper |
- virtual void commitChange(PODType type, SVGElement* context) |
- { |
- if (!m_setter) |
- return; |
- |
- (m_creator.get()->*m_setter)(type); |
- |
- if (context) |
- context->svgAttributeChanged(m_associatedAttributeName); |
- } |
- |
-private: |
- // Update callbacks |
- RefPtr<SVGPODListItem<PODType> > m_creator; |
- GetterMethod m_getter; |
- SetterMethod m_setter; |
- const QualifiedName& m_associatedAttributeName; |
-}; |
- |
-template<typename PODType> |
-class V8SVGStaticPODTypeWrapper : public V8SVGPODTypeWrapper<PODType> |
-{ |
-public: |
- V8SVGStaticPODTypeWrapper(PODType type) |
- : m_podType(type) |
- { } |
- |
- virtual ~V8SVGStaticPODTypeWrapper() { } |
- |
- // Getter wrapper |
- virtual operator PODType() { return m_podType; } |
- |
- // Setter wrapper |
- virtual void commitChange(PODType type, SVGElement*) |
- { |
- m_podType = type; |
- } |
- |
-private: |
- PODType m_podType; |
-}; |
- |
-template<typename PODType, typename ParentTypeArg> |
-class V8SVGStaticPODTypeWrapperWithPODTypeParent : public V8SVGStaticPODTypeWrapper<PODType> { |
-public: |
- typedef V8SVGPODTypeWrapper<ParentTypeArg> ParentType; |
- |
- V8SVGStaticPODTypeWrapperWithPODTypeParent(PODType type, ParentType* parent) |
- : V8SVGStaticPODTypeWrapper<PODType>(type) |
- , m_parentType(parent) |
- { |
- } |
- |
- virtual void commitChange(PODType type, SVGElement* context) |
- { |
- V8SVGStaticPODTypeWrapper<PODType>::commitChange(type, context); |
- m_parentType->commitChange(ParentTypeArg(type), context); |
- } |
- |
-private: |
- RefPtr<ParentType> m_parentType; |
-}; |
- |
-template<typename PODType, typename ParentType> |
-class V8SVGStaticPODTypeWrapperWithParent : public V8SVGPODTypeWrapper<PODType> { |
-public: |
- typedef PODType (ParentType::*GetterMethod)() const; |
- typedef void (ParentType::*SetterMethod)(const PODType&); |
- |
- V8SVGStaticPODTypeWrapperWithParent(ParentType* parent, GetterMethod getter, SetterMethod setter) |
- : m_parent(parent) |
- , m_getter(getter) |
- , m_setter(setter) |
- { |
- ASSERT(m_parent); |
- ASSERT(m_getter); |
- ASSERT(m_setter); |
- } |
- |
- virtual operator PODType() |
- { |
- return (m_parent.get()->*m_getter)(); |
- } |
- |
- virtual void commitChange(PODType type, SVGElement* context) |
- { |
- (m_parent.get()->*m_setter)(type); |
- } |
- |
-private: |
- // Update callbacks |
- RefPtr<ParentType> m_parent; |
- GetterMethod m_getter; |
- SetterMethod m_setter; |
-}; |
- |
-template<typename PODType, typename PODTypeCreator> |
-class V8SVGDynamicPODTypeWrapper : public V8SVGPODTypeWrapper<PODType> |
-{ |
-public: |
- typedef PODType (PODTypeCreator::*GetterMethod)() const; |
- typedef void (PODTypeCreator::*SetterMethod)(PODType); |
- typedef void (*CacheRemovalCallback)(V8SVGPODTypeWrapper<PODType>*); |
- |
- V8SVGDynamicPODTypeWrapper(PODTypeCreator* creator, GetterMethod getter, SetterMethod setter, CacheRemovalCallback cacheRemovalCallback) |
- : m_creator(creator) |
- , m_getter(getter) |
- , m_setter(setter) |
- , m_cacheRemovalCallback(cacheRemovalCallback) |
- { |
- ASSERT(creator); |
- ASSERT(getter); |
- ASSERT(setter); |
- ASSERT(cacheRemovalCallback); |
- } |
- |
- virtual ~V8SVGDynamicPODTypeWrapper() { |
- ASSERT(m_cacheRemovalCallback); |
- |
- (*m_cacheRemovalCallback)(this); |
- } |
- |
- // Getter wrapper |
- virtual operator PODType() { return (m_creator.get()->*m_getter)(); } |
- |
- // Setter wrapper |
- virtual void commitChange(PODType type, SVGElement* context) |
- { |
- (m_creator.get()->*m_setter)(type); |
- |
- if (context) |
- context->svgAttributeChanged(m_creator->associatedAttributeName()); |
- } |
- |
-private: |
- // Update callbacks |
- RefPtr<PODTypeCreator> m_creator; |
- GetterMethod m_getter; |
- SetterMethod m_setter; |
- CacheRemovalCallback m_cacheRemovalCallback; |
-}; |
- |
-// Caching facilities |
-template<typename PODType, typename PODTypeCreator> |
-struct PODTypeWrapperCacheInfo { |
- typedef PODType (PODTypeCreator::*GetterMethod)() const; |
- typedef void (PODTypeCreator::*SetterMethod)(PODType); |
- |
- // Empty value |
- PODTypeWrapperCacheInfo() |
- : creator(0) |
- , getter(0) |
- , setter(0) |
- { } |
- |
- // Deleted value |
- explicit 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; |
-}; |
- |
-template<typename PODType, typename PODTypeCreator> |
-struct PODTypeWrapperCacheInfoHash { |
- static unsigned hash(const PODTypeWrapperCacheInfo<PODType, PODTypeCreator>& info) |
- { |
- unsigned creator = reinterpret_cast<unsigned>(info.creator); |
- unsigned getter = reinterpret_cast<unsigned>(*(void**)&info.getter); |
- unsigned setter = reinterpret_cast<unsigned>(*(void**)&info.setter); |
- return (creator * 13) + getter ^ (setter >> 2); |
- } |
- |
- static bool equal(const PODTypeWrapperCacheInfo<PODType, PODTypeCreator>& a, const PODTypeWrapperCacheInfo<PODType, PODTypeCreator>& 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() |
- { |
- static CacheInfo key; |
- return key; |
- } |
- |
- static void constructDeletedValue(CacheInfo& slot) |
- { |
- new (&slot) CacheInfo(WTF::HashTableDeletedValue); |
- } |
- |
- static bool isDeletedValue(const CacheInfo& value) |
- { |
- return value.isHashTableDeletedValue(); |
- } |
-}; |
- |
-template<typename PODType, typename PODTypeCreator> |
-class V8SVGDynamicPODTypeWrapperCache |
-{ |
-public: |
- typedef PODType (PODTypeCreator::*GetterMethod)() const; |
- typedef void (PODTypeCreator::*SetterMethod)(PODType); |
- |
- typedef PODTypeWrapperCacheInfo<PODType, PODTypeCreator> CacheInfo; |
- typedef PODTypeWrapperCacheInfoHash<PODType, PODTypeCreator> CacheInfoHash; |
- typedef PODTypeWrapperCacheInfoTraits<PODType, PODTypeCreator> CacheInfoTraits; |
- |
- typedef V8SVGPODTypeWrapper<PODType> WrapperBase; |
- typedef V8SVGDynamicPODTypeWrapper<PODType, PODTypeCreator> DynamicWrapper; |
- |
- typedef HashMap<CacheInfo, DynamicWrapper*, CacheInfoHash, CacheInfoTraits> DynamicWrapperHashMap; |
- typedef typename DynamicWrapperHashMap::const_iterator DynamicWrapperHashMapIterator; |
- |
- static DynamicWrapperHashMap& dynamicWrapperHashMap() |
- { |
- static DynamicWrapperHashMap _dynamicWrapperHashMap; |
- return _dynamicWrapperHashMap; |
- } |
- |
- // Used for readwrite attributes only |
- static WrapperBase* lookupOrCreateWrapper(PODTypeCreator* creator, GetterMethod getter, SetterMethod setter) |
- { |
- DynamicWrapperHashMap& map(dynamicWrapperHashMap()); |
- CacheInfo info(creator, getter, setter); |
- |
- if (map.contains(info)) |
- return map.get(info); |
- |
- DynamicWrapper* wrapper = new V8SVGDynamicPODTypeWrapper<PODType, PODTypeCreator>( |
- creator, getter, setter, forgetWrapper); |
- map.set(info, wrapper); |
- return wrapper; |
- } |
- |
- static void forgetWrapper(V8SVGPODTypeWrapper<PODType>* wrapper) |
- { |
- DynamicWrapperHashMap& map(dynamicWrapperHashMap()); |
- |
- DynamicWrapperHashMapIterator it = map.begin(); |
- DynamicWrapperHashMapIterator end = map.end(); |
- |
- for (; it != end; ++it) { |
- if (it->second != wrapper) |
- continue; |
- |
- // It's guaranteed that there's just one object we need to take care of. |
- map.remove(it->first); |
- break; |
- } |
- } |
-}; |
- |
- |
-class V8SVGPODTypeUtil { |
-public: |
- template <class P> |
- static P ToSVGPODType(V8ClassIndex::V8WrapperType type, |
- v8::Handle<v8::Value> object, bool& ok); |
-}; |
- |
- |
-template <class P> |
-P V8SVGPODTypeUtil::ToSVGPODType(V8ClassIndex::V8WrapperType type, |
- v8::Handle<v8::Value> object, |
- bool& ok) { |
- void *wrapper = V8Proxy::convertToSVGPODTypeImpl(type, object); |
- if (wrapper == NULL) { |
- ok = false; |
- return P(); |
- } else { |
- ok = true; |
- return *static_cast<V8SVGPODTypeWrapper<P>*>(wrapper); |
- } |
-} |
- |
- |
-} // namespace WebCore |
- |
-#endif // ENABLE(SVG) |
-#endif // V8SVGPODTypeWrapper_h |