diff options
author | japhet@chromium.org <japhet@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-02 23:58:48 +0000 |
---|---|---|
committer | japhet@chromium.org <japhet@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-02 23:58:48 +0000 |
commit | d46913561f95449f6afb3ad2609942dd061a723f (patch) | |
tree | 4d8e448b2a53a88f6960b8e8e38dcc19ca8376c7 /webkit | |
parent | ec94b4aeb47ae695d4fe20af71f2652df577a2cf (diff) | |
download | chromium_src-d46913561f95449f6afb3ad2609942dd061a723f.zip chromium_src-d46913561f95449f6afb3ad2609942dd061a723f.tar.gz chromium_src-d46913561f95449f6afb3ad2609942dd061a723f.tar.bz2 |
Upstream V8SVGPODTypeWrapper
BUG=15784
Review URL: http://codereview.chromium.org/155001
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@19862 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit')
-rw-r--r-- | webkit/port/bindings/v8/V8SVGPODTypeWrapper.h | 387 | ||||
-rw-r--r-- | webkit/webkit.gyp | 2 |
2 files changed, 1 insertions, 388 deletions
diff --git a/webkit/port/bindings/v8/V8SVGPODTypeWrapper.h b/webkit/port/bindings/v8/V8SVGPODTypeWrapper.h deleted file mode 100644 index 4373b8e..0000000 --- a/webkit/port/bindings/v8/V8SVGPODTypeWrapper.h +++ /dev/null @@ -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 diff --git a/webkit/webkit.gyp b/webkit/webkit.gyp index 0b7ef44..f611da5 100644 --- a/webkit/webkit.gyp +++ b/webkit/webkit.gyp @@ -1133,6 +1133,7 @@ '../third_party/WebKit/WebCore/bindings/v8/V8ObjectEventListener.h', '../third_party/WebKit/WebCore/bindings/v8/V8Proxy.cpp', '../third_party/WebKit/WebCore/bindings/v8/V8Proxy.h', + '../third_party/WebKit/WebCore/bindings/v8/V8SVGPODTypeWrapper.h', '../third_party/WebKit/WebCore/bindings/v8/V8Utilities.cpp', '../third_party/WebKit/WebCore/bindings/v8/V8Utilities.h', '../third_party/WebKit/WebCore/bindings/v8/V8WorkerContextEventListener.cpp', @@ -1158,7 +1159,6 @@ 'port/bindings/v8/DOMObjectsInclude.h', 'port/bindings/v8/RGBColor.cpp', 'port/bindings/v8/RGBColor.h', - 'port/bindings/v8/V8SVGPODTypeWrapper.h', 'port/bindings/v8/NPV8Object.cpp', 'port/bindings/v8/NPV8Object.h', 'port/bindings/v8/npruntime.cpp', |