Index: Source/WebCore/bindings/dart/DartDOMWrapper.h |
diff --git a/Source/WebCore/bindings/dart/DartDOMWrapper.h b/Source/WebCore/bindings/dart/DartDOMWrapper.h |
deleted file mode 100644 |
index 162b0f2cb34dce646b998d820a8f04d0611ec0f3..0000000000000000000000000000000000000000 |
--- a/Source/WebCore/bindings/dart/DartDOMWrapper.h |
+++ /dev/null |
@@ -1,611 +0,0 @@ |
-// Copyright 2011, Google 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: |
-// |
-// * Redistributions of source code must retain the above copyright |
-// notice, this list of conditions and the following disclaimer. |
-// * 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. |
-// * Neither the name of Google Inc. nor the names of its |
-// contributors may be used to endorse or promote products derived from |
-// this software without specific prior written permission. |
-// |
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
-// "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 THE COPYRIGHT |
-// OWNER 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 DartDOMWrapper_h |
-#define DartDOMWrapper_h |
- |
-#include "DartUtilities.h" |
-#include "EventListener.h" |
-#include "EventTarget.h" |
-#include "ExceptionCode.h" |
-#include "MediaQueryListListener.h" |
-#include "OptionsObject.h" |
-#include "Range.h" |
-#include "ScriptValue.h" |
-#include "SerializedScriptValue.h" |
-#if ENABLE(SVG) |
-#include "SVGPropertyTearOff.h" |
-#endif |
-#include "VoidCallback.h" |
-#include "npruntime_impl.h" |
- |
-#include <bindings/npruntime.h> |
-#include <dart_api.h> |
-#include <wtf/PassRefPtr.h> |
-#include <wtf/RefPtr.h> |
-#include <wtf/text/AtomicString.h> |
-#include <wtf/text/WTFString.h> |
- |
-namespace WebCore { |
- |
-#if ENABLE(FILE_SYSTEM) |
-class Entry; |
-class EntrySync; |
-#endif |
- |
-#if ENABLE(INDEXED_DATABASE) |
-class IDBAny; |
-class IDBKey; |
-#endif |
- |
-#if ENABLE(SVG) |
-class SVGPathSeg; |
-#endif |
- |
-enum ConversionFlag { |
- ConvertNone = 0, |
- ConvertDefaultToNull = 1 |
-}; |
- |
-// The only purpose of this template declaration is to prohibit implicit |
-// conversions of toDartValue parameter. |
-template <typename Type> |
-Dart_Handle toDartValue(Type value); |
- |
-template <typename Type> |
-Dart_Handle toDartValue(Type value, ConversionFlag); |
- |
-inline Dart_Handle toDartValue(const AtomicString& value, ConversionFlag flag = ConvertNone) |
-{ |
- if ((flag & ConvertDefaultToNull) && value.isNull()) |
- return 0; |
- return DartUtilities::stringToDartString(value); |
-} |
- |
-inline Dart_Handle toDartValue(const String& value, ConversionFlag flag = ConvertNone) |
-{ |
- if ((flag & ConvertDefaultToNull) && value.isNull()) |
- return 0; |
- return DartUtilities::stringToDartString(value); |
-} |
- |
-inline Dart_Handle toDartValue(bool value) |
-{ |
- return Dart_NewBoolean(value); |
-} |
- |
-inline Dart_Handle toDartValue(unsigned long long value) |
-{ |
- // FIXME: WebIDL unsigned long long is guaranteed to fit into 64-bit unsigned, |
- // so we need a dart API for constructing an integer from uint64_t. |
- ASSERT(value <= 0x7fffffffffffffffLL); |
- return Dart_NewInteger(static_cast<int64_t>(value)); |
-} |
- |
-inline Dart_Handle toDartValue(int64_t value) |
-{ |
- return Dart_NewInteger(value); |
-} |
- |
-inline Dart_Handle toDartValue(intptr_t value) |
-{ |
- return Dart_NewInteger(value); |
-} |
- |
-inline Dart_Handle toDartValue(float value) |
-{ |
- return Dart_NewDouble(value); |
-} |
- |
-inline Dart_Handle toDartValue(double value) |
-{ |
- return Dart_NewDouble(value); |
-} |
- |
-inline Dart_Handle toDartValue(const KURL& value, ConversionFlag flag = ConvertNone) |
-{ |
- return toDartValue(value.string(), flag); |
-} |
- |
-inline Dart_Handle toDartValue(const ScriptValue& value) |
-{ |
- // FIXME: dart specific implementation of ScriptValue and |
- // proper conversion. |
- DART_UNIMPLEMENTED(); |
- return 0; |
-} |
- |
-inline Dart_Handle toDartValue(SerializedScriptValue* value) |
-{ |
- return DartUtilities::fromSerializedScriptValue(value); |
-} |
- |
-Dart_Handle toDartValue(NPObject* object); |
- |
-class ContainerNode; |
-Dart_Handle toDartValue(ContainerNode*); |
- |
-class CSSMutableStyleDeclaration; |
-Dart_Handle toDartValue(CSSMutableStyleDeclaration*); |
- |
-class HTMLFormControlElement; |
-Dart_Handle toDartValue(HTMLFormControlElement*); |
- |
-class DartDOMWrapper { |
-public: |
- template <class WebkitClass> |
- static Dart_Handle newWrapper(const char* className, WebkitClass* domObject) |
- { |
- Dart_Handle wrapper = instantiateWrapper(className); |
- installNativePointers(domObject, wrapper); |
- return wrapper; |
- } |
- |
- template <class BindingsClass> |
- static Dart_Handle toDart(typename BindingsClass::NativeType* instance) |
- { |
- return toDart(instance, BindingsClass::dartImplementationClassName); |
- } |
- |
- template <class WebkitClass> |
- static Dart_Handle toDart(WebkitClass* instance, const char* className) |
- { |
- if (!instance) |
- return 0; |
- |
- // FIXME: custom toDartValue implementations should check the cache first. |
- // FIXME: separate maps for nodes, dom objects and active dom objects. |
- DartDOMMap* domMap = DartUtilities::domMapForCurrentIsolate(); |
- Dart_Handle wrapper = domMap->get(instance); |
- if (wrapper) |
- return wrapper; |
- |
- wrapper = instantiateWrapper(className); |
- bindDOMObjectToDartWrapper(instance, wrapper); |
- return wrapper; |
- } |
- |
- template <class WebkitClass> |
- static void bindDOMObjectToDartWrapper(WebkitClass* domObject, Dart_Handle wrapper) |
- { |
- ASSERT(domObject); |
- domObject->ref(); |
- installNativePointers(domObject, wrapper); |
- |
- // FIXME: make persistent handle weak and deref domObject in weak callback. |
- Dart_Handle persistentWrapperHandle = Dart_NewPersistentHandle(wrapper); |
- |
- DartDOMMap* domMap = DartUtilities::domMapForCurrentIsolate(); |
- ASSERT(!domMap->contains(domObject)); |
- domMap->set(domObject, persistentWrapperHandle); |
- } |
- |
- template <class BindingsClass> |
- static typename BindingsClass::NativeType* unwrapDartWrapper(Dart_Handle wrapper, Dart_Handle& exception) |
- { |
- // FIXME: support cross-domain wrappers. |
- if (!instanceOf(BindingsClass::dartImplementationClassName, wrapper, exception)) |
- return 0; |
- ASSERT(!exception); |
- void* nativePointer = readNativePointer(wrapper, kNativeImplementationIndex); |
- return reinterpret_cast<typename BindingsClass::NativeType*>(nativePointer); |
- } |
- |
- static void derefDOMObject(Dart_Handle wrapper, void* domObject); |
- |
- template <class WebkitClass> |
- static WebkitClass* receiver(Dart_NativeArguments args) |
- { |
- // Type of receiver is ensured by Dart VM runtime, so bypass additional checks. |
- void* nativePointer = readNativePointer(Dart_GetNativeArgument(args, 0), kNativeImplementationIndex); |
- WebkitClass* const recv = static_cast<WebkitClass*>(nativePointer); |
- ASSERT(recv); // Never should return 0. |
- return recv; |
- } |
- |
- template <typename Type> |
- static void returnValue(Dart_NativeArguments args, const Type& value) |
- { |
- Dart_Handle result = toDartValue(value); |
- if (result) |
- Dart_SetReturnValue(args, result); |
- } |
- |
- static int wrapperNativeFieldCount() { return kNativeFieldCount; } |
- |
- template <typename Type> |
- static void returnValue(Dart_NativeArguments args, const Type& value, ConversionFlag flag) |
- { |
- Dart_Handle result = toDartValue(value, flag); |
- if (result) |
- Dart_SetReturnValue(args, result); |
- } |
- |
- static Dart_Handle exceptionCodeToDartException(ExceptionCode); |
- |
-private: |
- enum NativeFieldIndices { |
- kNativeImplementationIndex = 0, |
- kDerefObjectFunctionIndex, |
- kNativeFieldCount |
- }; |
- |
- static Dart_Handle instantiateWrapper(const char* className); |
- static bool instanceOf(const char* dartImplementationClassName, Dart_Handle wrapper, Dart_Handle& exception); |
- |
- static void writeNativePointer(Dart_Handle wrapper, int index, void* pointer) |
- { |
- DartApiScope scope; |
- Dart_Handle result = Dart_SetNativeInstanceField(wrapper, index, reinterpret_cast<intptr_t>(pointer)); |
- UNUSED_PARAM(result); |
- ASSERT(!Dart_IsError(result)); |
- } |
- |
- static void* readNativePointer(Dart_Handle wrapper, int index) |
- { |
- // FIXME: Try to remove this scope from the hot path. |
- DartApiScope scope; |
- intptr_t value; |
- Dart_Handle result = Dart_GetNativeInstanceField(wrapper, index, &value); |
- ASSERT(!Dart_IsError(result)); |
- UNUSED_PARAM(result); |
- return reinterpret_cast<void*>(value); |
- } |
- |
- template <class WebkitClass> |
- static void installNativePointers(WebkitClass* domObject, Dart_Handle wrapper) |
- { |
- ASSERT(domObject); |
- DerefObjectFunction derefObjectFunction = &DartDOMWrapper::derefObject<WebkitClass>; |
- writeNativePointer(wrapper, kNativeImplementationIndex, domObject); |
- writeNativePointer(wrapper, kDerefObjectFunctionIndex, reinterpret_cast<void*>(derefObjectFunction)); |
- } |
- |
- typedef void (*DerefObjectFunction)(void*); |
- |
- template<typename T> |
- static void derefObject(void* pointer) |
- { |
- static_cast<T*>(pointer)->deref(); |
- } |
-}; |
- |
-template<> |
-inline void DartDOMWrapper::derefObject<NPObject>(void*) |
-{ |
- // FIXME: proper deref. |
-} |
- |
-// ParameterAdapter. |
- |
-template <typename Value> |
-class ParameterAdapterBase { |
-public: |
- bool conversionSuccessful() const { return !m_exception; } |
- |
- Dart_Handle exception() const |
- { |
- ASSERT(!conversionSuccessful()); |
- return m_exception; |
- } |
- |
-protected: |
- |
- ParameterAdapterBase() |
- : m_value() |
- , m_exception(0) { } |
- |
- void setException(Dart_Handle exception) |
- { |
- ASSERT(exception); |
- m_exception = exception; |
- ASSERT(!conversionSuccessful()); |
- } |
- |
- const Value& value() const |
- { |
- ASSERT(conversionSuccessful()); |
- return m_value; |
- } |
- |
- void setValue(Value value) |
- { |
- m_value = value; |
- } |
- |
-protected: |
- Value m_value; |
- |
-private: |
- Dart_Handle m_exception; |
-}; |
- |
- |
-template <class NativeValue, class DartBindingsClass = void> |
-class ParameterAdapter : public ParameterAdapterBase<NativeValue*> { |
-public: |
- explicit ParameterAdapter(Dart_Handle handle) |
- { |
- Dart_Handle exception = 0; |
- this->setValue(DartBindingsClass::toNative(handle, exception).get()); |
- if (exception) |
- this->setException(exception); |
- } |
- |
- operator PassRefPtr<NativeValue>() const { return this->value(); } |
- operator NativeValue*() const { return this->value(); } |
-}; |
- |
-template <> |
-class ParameterAdapter< RefPtr<EventListener> > : public ParameterAdapterBase< RefPtr<EventListener> > { |
-public: |
- explicit ParameterAdapter(Dart_Handle handle) |
- { |
- // FIXME: abstract away this common pattern of exception management in conversion. |
- Dart_Handle exception = 0; |
- this->setValue(DartUtilities::toEventListener(handle, exception)); |
- if (exception) |
- this->setException(exception); |
- } |
- operator EventListener*() const { return this->value().get(); } |
- operator PassRefPtr<EventListener>() const { return this->value(); } |
-}; |
- |
-template <> |
-class ParameterAdapter< RefPtr<EventTarget> > : public ParameterAdapterBase< RefPtr<EventTarget> > { |
-public: |
- explicit ParameterAdapter(Dart_Handle handle) |
- { |
- // FIXME: abstract away this common pattern of exception management in conversion. |
- Dart_Handle exception = 0; |
- this->setValue(DartUtilities::toEventTarget(handle, exception)); |
- if (exception) |
- this->setException(exception); |
- } |
- operator EventTarget*() const { return this->value().get(); } |
- operator PassRefPtr<EventTarget>() const { return this->value(); } |
-}; |
- |
-template <> |
-class ParameterAdapter< RefPtr<MediaQueryListListener> > : public ParameterAdapterBase<MediaQueryListListener*> { |
-public: |
- explicit ParameterAdapter(Dart_Handle handle) |
- { |
- setException(Dart_NewString("Not supported yet")); |
- } |
- operator MediaQueryListListener*() const { return this->value(); } |
- operator PassRefPtr<MediaQueryListListener>() const { return this->value(); } |
-}; |
- |
-template <> |
-class ParameterAdapter< RefPtr<SerializedScriptValue> > : public ParameterAdapterBase< RefPtr<SerializedScriptValue> > { |
-public: |
- explicit ParameterAdapter(Dart_Handle handle) |
- { |
- // FIXME: abstract away this common pattern of exception management in conversion. |
- Dart_Handle exception = 0; |
- this->setValue(DartUtilities::toSerializedScriptValue(handle, exception)); |
- if (exception) |
- this->setException(exception); |
- } |
- operator SerializedScriptValue*() const { return this->value().get(); } |
- operator PassRefPtr<SerializedScriptValue>() const { return this->value(); } |
- PassRefPtr<SerializedScriptValue> release() { return m_value->release(); } |
-}; |
- |
-template <> |
-class ParameterAdapter< RefPtr<VoidCallback> > : public ParameterAdapterBase<VoidCallback*> { |
-public: |
- explicit ParameterAdapter(Dart_Handle handle) |
- { |
- setException(Dart_NewString("Not supported yet")); |
- } |
- operator VoidCallback*() const { return this->value(); } |
- operator PassRefPtr<VoidCallback>() const { return this->value(); } |
-}; |
- |
-#if ENABLE(SVG) |
-template <class NativeValue, class DartBindingsClass> |
-class ParameterAdapter< RefPtr<SVGPropertyTearOff<NativeValue> >, DartBindingsClass> : public ParameterAdapterBase< RefPtr<SVGPropertyTearOff<NativeValue> > > { |
-public: |
- explicit ParameterAdapter(Dart_Handle handle) |
- { |
- Dart_Handle exception = 0; |
- this->setValue(DartBindingsClass::toNative(handle, exception).get()); |
- if (exception) |
- this->setException(exception); |
- } |
- operator const NativeValue&() const { return this->value()->propertyReference(); } |
- operator NativeValue&() { return this->value()->propertyReference(); } |
- operator PassRefPtr<SVGPropertyTearOff<NativeValue> >() const { return this->value(); } |
- operator SVGPropertyTearOff<NativeValue>*() const { return this->value().get(); } |
-}; |
-#endif // ENABLE(SVG) |
- |
-template <class NativeValue, class DartBindingsClass> |
-class ParameterAdapter< RefPtr<NativeValue>, DartBindingsClass > : public ParameterAdapterBase< RefPtr<NativeValue> > { |
-public: |
- explicit ParameterAdapter(Dart_Handle handle) |
- { |
- Dart_Handle exception = 0; |
- this->setValue(DartBindingsClass::toNative(handle, exception)); |
- if (exception) |
- this->setException(exception); |
- } |
- |
- operator PassRefPtr<NativeValue>() const { return this->value(); } |
- operator RefPtr<NativeValue>() const { return this->value(); } |
- operator NativeValue*() const { return this->value().get(); } |
-}; |
- |
-class DoubleParameterAdapter : public ParameterAdapterBase<double> { |
-protected: |
- explicit DoubleParameterAdapter(Dart_Handle handle) |
- { |
- Dart_Handle exception = 0; |
- setValue(DartUtilities::toDouble(handle, exception)); |
- if (exception) |
- setException(exception); |
- } |
-}; |
- |
-template <> |
-class ParameterAdapter<double> : public DoubleParameterAdapter { |
-public: |
- explicit ParameterAdapter(Dart_Handle handle) |
- : DoubleParameterAdapter(handle) { } |
- operator double() const { return this->value(); } |
-}; |
- |
-template <> |
-class ParameterAdapter<float> : public DoubleParameterAdapter { |
-public: |
- explicit ParameterAdapter(Dart_Handle handle) |
- : DoubleParameterAdapter(handle) { } |
- operator float() const { return this->value(); } |
-}; |
- |
-class IntParameterAdapter : public ParameterAdapterBase<int64_t> { |
-protected: |
- explicit IntParameterAdapter(Dart_Handle handle) |
- { |
- Dart_Handle exception = 0; |
- setValue(DartUtilities::toInteger(handle, exception)); |
- if (exception) |
- setException(exception); |
- } |
-}; |
- |
-template <> |
-class ParameterAdapter<int> : public IntParameterAdapter { |
-public: |
- explicit ParameterAdapter(Dart_Handle handle) |
- : IntParameterAdapter(handle) |
- { |
- if (conversionSuccessful() && (value() < INT_MIN || value() > INT_MAX)) |
- setException(Dart_NewString("value out of range")); |
- } |
- operator int() const { return this->value(); } |
-}; |
- |
-template <> |
-class ParameterAdapter<long long> : public IntParameterAdapter { |
-public: |
- explicit ParameterAdapter(Dart_Handle handle) |
- : IntParameterAdapter(handle) { } |
- // FIXME: proper processing of longer integer values. |
- operator long long() const { return this->value(); } |
-}; |
- |
-template <> |
-class ParameterAdapter<unsigned int> : public IntParameterAdapter { |
-public: |
- explicit ParameterAdapter(Dart_Handle handle) |
- : IntParameterAdapter(handle) |
- { |
- if (conversionSuccessful() && (value() < 0 || value() > UINT_MAX)) |
- setException(Dart_NewString("value out of range")); |
- } |
- operator unsigned int() const { return this->value(); } |
-}; |
- |
-template <> |
-class ParameterAdapter<unsigned long long> : public IntParameterAdapter { |
-public: |
- explicit ParameterAdapter(Dart_Handle handle) |
- : IntParameterAdapter(handle) |
- { |
- if (conversionSuccessful() && value() < 0) |
- setException(Dart_NewString("value out of range")); |
- } |
- // FIXME: proper processing of longer integer values. |
- operator unsigned long long() const { return this->value(); } |
-}; |
- |
-// FIXME: [performance] need better treatment of String vs. AtomicString, cf. v8 implementation. |
-template <> |
-class ParameterAdapter<String> : public ParameterAdapterBase< RefPtr<StringImpl> > { |
-public: |
- explicit ParameterAdapter(Dart_Handle handle, DartUtilities::ConversionFlag flag = DartUtilities::ConvertNone) |
- { |
- Dart_Handle exception = 0; |
- setValue(DartUtilities::toStringImpl(handle, flag, exception)); |
- if (exception) |
- setException(exception); |
- } |
- operator String() const { return String(this->value()); } |
- operator AtomicString() const { return AtomicString(this->value()); } |
-}; |
- |
-template <> |
-class ParameterAdapter<bool> : public ParameterAdapterBase<bool> { |
-public: |
- explicit ParameterAdapter(Dart_Handle handle) |
- { |
- Dart_Handle exception = 0; |
- setValue(DartUtilities::toBool(handle, exception)); |
- if (exception) |
- setException(exception); |
- } |
- operator bool() const { return this->value(); } |
-}; |
- |
-template <> |
-class ParameterAdapter<ScriptValue> : public ParameterAdapterBase<ScriptValue> { |
-public: |
- explicit ParameterAdapter(Dart_Handle handle) |
- { |
- setException(Dart_NewString("Not supported yet")); |
- } |
- operator ScriptValue() const { return this->value(); } |
-}; |
- |
-template <> |
-class ParameterAdapter<OptionsObject> : public ParameterAdapterBase<OptionsObject> { |
-public: |
- explicit ParameterAdapter(Dart_Handle handle) |
- { |
- setException(Dart_NewString("Not supported yet")); |
- } |
- operator OptionsObject() const { return this->value(); } |
-}; |
- |
-template <> |
-class ParameterAdapter<Range::CompareHow> : public ParameterAdapterBase<Range::CompareHow> { |
-public: |
- explicit ParameterAdapter(Dart_Handle handle) |
- { |
- setException(Dart_NewString("Not supported yet")); |
- } |
- operator Range::CompareHow() const { return this->value(); } |
-}; |
- |
-} |
- |
-#endif // DartDOMWrapper_h |