Index: Source/bindings/v8/V8Binding.h |
diff --git a/Source/bindings/v8/V8Binding.h b/Source/bindings/v8/V8Binding.h |
index 166bc27d6eefbb37de8962599232342e7fbb9dc2..86602d66f86fb6077ef4df698950292d8c716adc 100644 |
--- a/Source/bindings/v8/V8Binding.h |
+++ b/Source/bindings/v8/V8Binding.h |
@@ -46,673 +46,683 @@ |
namespace WebCore { |
- class DOMWindow; |
- class Document; |
- class EventListener; |
- class ExceptionState; |
- class LocalFrame; |
- class NodeFilter; |
- class ExecutionContext; |
- class ScriptWrappable; |
- class XPathNSResolver; |
- |
- const int kMaxRecursionDepth = 22; |
- |
- // Schedule a JavaScript error to be thrown. |
- v8::Handle<v8::Value> throwError(V8ErrorType, const String&, v8::Isolate*); |
- |
- // Schedule a JavaScript error to be thrown. |
- v8::Handle<v8::Value> throwError(v8::Handle<v8::Value>, v8::Isolate*); |
- |
- // A helper for throwing JavaScript TypeError. |
- v8::Handle<v8::Value> throwTypeError(const String&, v8::Isolate*); |
- |
- v8::ArrayBuffer::Allocator* v8ArrayBufferAllocator(); |
- |
- inline v8::Handle<v8::Value> argumentOrNull(const v8::FunctionCallbackInfo<v8::Value>& info, int index) |
- { |
- return index >= info.Length() ? v8::Local<v8::Value>() : info[index]; |
- } |
- |
- template<typename CallbackInfo, typename V> |
- inline void v8SetReturnValue(const CallbackInfo& info, V v) |
- { |
- info.GetReturnValue().Set(v); |
- } |
- |
- template<typename CallbackInfo> |
- inline void v8SetReturnValueBool(const CallbackInfo& info, bool v) |
- { |
- info.GetReturnValue().Set(v); |
- } |
- |
- template<typename CallbackInfo> |
- inline void v8SetReturnValueInt(const CallbackInfo& info, int v) |
- { |
- info.GetReturnValue().Set(v); |
- } |
- |
- template<typename CallbackInfo> |
- inline void v8SetReturnValueUnsigned(const CallbackInfo& info, unsigned v) |
- { |
- info.GetReturnValue().Set(v); |
- } |
- |
- template<typename CallbackInfo> |
- inline void v8SetReturnValueNull(const CallbackInfo& info) |
- { |
- info.GetReturnValue().SetNull(); |
- } |
- |
- template<typename CallbackInfo> |
- inline void v8SetReturnValueUndefined(const CallbackInfo& info) |
- { |
- info.GetReturnValue().SetUndefined(); |
- } |
- |
- template<typename CallbackInfo> |
- inline void v8SetReturnValueEmptyString(const CallbackInfo& info) |
- { |
- info.GetReturnValue().SetEmptyString(); |
- } |
- |
- template <class CallbackInfo> |
- inline void v8SetReturnValueString(const CallbackInfo& info, const String& string, v8::Isolate* isolate) |
- { |
- if (string.isNull()) { |
- v8SetReturnValueEmptyString(info); |
- return; |
- } |
- V8PerIsolateData::from(isolate)->stringCache()->setReturnValueFromString(info.GetReturnValue(), string.impl()); |
- } |
- |
- template <class CallbackInfo> |
- inline void v8SetReturnValueStringOrNull(const CallbackInfo& info, const String& string, v8::Isolate* isolate) |
- { |
- if (string.isNull()) { |
- v8SetReturnValueNull(info); |
- return; |
- } |
- V8PerIsolateData::from(isolate)->stringCache()->setReturnValueFromString(info.GetReturnValue(), string.impl()); |
- } |
- |
- template <class CallbackInfo> |
- inline void v8SetReturnValueStringOrUndefined(const CallbackInfo& info, const String& string, v8::Isolate* isolate) |
- { |
- if (string.isNull()) { |
- v8SetReturnValueUndefined(info); |
- return; |
- } |
- V8PerIsolateData::from(isolate)->stringCache()->setReturnValueFromString(info.GetReturnValue(), string.impl()); |
- } |
- |
- // Convert v8::String to a WTF::String. If the V8 string is not already |
- // an external string then it is transformed into an external string at this |
- // point to avoid repeated conversions. |
- inline String toCoreString(v8::Handle<v8::String> value) |
- { |
- return v8StringToWebCoreString<String>(value, Externalize); |
- } |
- |
- inline String toCoreStringWithNullCheck(v8::Handle<v8::String> value) |
- { |
- if (value.IsEmpty() || value->IsNull()) |
- return String(); |
- return toCoreString(value); |
- } |
- |
- inline String toCoreStringWithUndefinedOrNullCheck(v8::Handle<v8::String> value) |
- { |
- if (value.IsEmpty() || value->IsNull() || value->IsUndefined()) |
- return String(); |
- return toCoreString(value); |
- } |
- |
- inline AtomicString toCoreAtomicString(v8::Handle<v8::String> value) |
- { |
- return v8StringToWebCoreString<AtomicString>(value, Externalize); |
- } |
- |
- // This method will return a null String if the v8::Value does not contain a v8::String. |
- // It will not call ToString() on the v8::Value. If you want ToString() to be called, |
- // please use the V8TRYCATCH_FOR_V8STRINGRESOURCE_*() macros instead. |
- inline String toCoreStringWithUndefinedOrNullCheck(v8::Handle<v8::Value> value) |
- { |
- if (value.IsEmpty() || !value->IsString()) |
- return String(); |
- |
- return toCoreString(value.As<v8::String>()); |
- } |
- |
- // Convert a string to a V8 string. |
- // Return a V8 external string that shares the underlying buffer with the given |
- // WebCore string. The reference counting mechanism is used to keep the |
- // underlying buffer alive while the string is still live in the V8 engine. |
- inline v8::Handle<v8::String> v8String(v8::Isolate* isolate, const String& string) |
- { |
- if (string.isNull()) |
- return v8::String::Empty(isolate); |
- return V8PerIsolateData::from(isolate)->stringCache()->v8ExternalString(string.impl(), isolate); |
- } |
- |
- inline v8::Handle<v8::String> v8AtomicString(v8::Isolate* isolate, const char* str) |
- { |
- ASSERT(isolate); |
- return v8::String::NewFromUtf8(isolate, str, v8::String::kInternalizedString, strlen(str)); |
- } |
- |
- inline v8::Handle<v8::String> v8AtomicString(v8::Isolate* isolate, const char* str, size_t length) |
- { |
- ASSERT(isolate); |
- return v8::String::NewFromUtf8(isolate, str, v8::String::kInternalizedString, length); |
- } |
- |
- inline v8::Handle<v8::Value> v8Undefined() |
- { |
- return v8::Handle<v8::Value>(); |
- } |
- |
- template <class T> |
- struct V8ValueTraits { |
- static inline v8::Handle<v8::Value> arrayV8Value(const T& value, v8::Isolate* isolate) |
- { |
- return toV8(WTF::getPtr(value), v8::Handle<v8::Object>(), isolate); |
- } |
- }; |
- |
- template<> |
- struct V8ValueTraits<String> { |
- static inline v8::Handle<v8::Value> arrayV8Value(const String& value, v8::Isolate* isolate) |
- { |
- return v8String(isolate, value); |
- } |
- }; |
- |
- template<> |
- struct V8ValueTraits<AtomicString> { |
- static inline v8::Handle<v8::Value> arrayV8Value(const AtomicString& value, v8::Isolate* isolate) |
- { |
- return v8String(isolate, value); |
- } |
- }; |
- |
- template<> |
- struct V8ValueTraits<unsigned> { |
- static inline v8::Handle<v8::Value> arrayV8Value(const unsigned& value, v8::Isolate* isolate) |
- { |
- return v8::Integer::NewFromUnsigned(isolate, value); |
- } |
- }; |
- |
- template<> |
- struct V8ValueTraits<unsigned long> { |
- static inline v8::Handle<v8::Value> arrayV8Value(const unsigned long& value, v8::Isolate* isolate) |
- { |
- return v8::Integer::NewFromUnsigned(isolate, value); |
- } |
- }; |
- |
- template<> |
- struct V8ValueTraits<float> { |
- static inline v8::Handle<v8::Value> arrayV8Value(const float& value, v8::Isolate* isolate) |
- { |
- return v8::Number::New(isolate, value); |
- } |
- }; |
- |
- template<> |
- struct V8ValueTraits<double> { |
- static inline v8::Handle<v8::Value> arrayV8Value(const double& value, v8::Isolate* isolate) |
- { |
- return v8::Number::New(isolate, value); |
- } |
- }; |
- |
- template<typename T, size_t inlineCapacity> |
- v8::Handle<v8::Value> v8Array(const Vector<T, inlineCapacity>& iterator, v8::Isolate* isolate) |
- { |
- v8::Local<v8::Array> result = v8::Array::New(isolate, iterator.size()); |
- int index = 0; |
- typename Vector<T, inlineCapacity>::const_iterator end = iterator.end(); |
- typedef V8ValueTraits<T> TraitsType; |
- for (typename Vector<T, inlineCapacity>::const_iterator iter = iterator.begin(); iter != end; ++iter) |
- result->Set(v8::Integer::New(isolate, index++), TraitsType::arrayV8Value(*iter, isolate)); |
- return result; |
- } |
- |
- template<typename T, size_t inlineCapacity> |
- v8::Handle<v8::Value> v8Array(const HeapVector<T, inlineCapacity>& iterator, v8::Isolate* isolate) |
- { |
- v8::Local<v8::Array> result = v8::Array::New(isolate, iterator.size()); |
- int index = 0; |
- typename HeapVector<T, inlineCapacity>::const_iterator end = iterator.end(); |
- typedef V8ValueTraits<T> TraitsType; |
- for (typename HeapVector<T, inlineCapacity>::const_iterator iter = iterator.begin(); iter != end; ++iter) |
- result->Set(v8::Integer::New(isolate, index++), TraitsType::arrayV8Value(*iter, isolate)); |
- return result; |
- } |
- |
- // Conversion flags, used in toIntXX/toUIntXX. |
- enum IntegerConversionConfiguration { |
- NormalConversion, |
- EnforceRange, |
- Clamp |
- }; |
- |
- // Convert a value to a 8-bit signed integer. The conversion fails if the |
- // value cannot be converted to a number or the range violated per WebIDL: |
- // http://www.w3.org/TR/WebIDL/#es-byte |
- int8_t toInt8(v8::Handle<v8::Value>, IntegerConversionConfiguration, ExceptionState&); |
- inline int8_t toInt8(v8::Handle<v8::Value> value, ExceptionState& exceptionState) |
- { |
- return toInt8(value, NormalConversion, exceptionState); |
- } |
- |
- // Convert a value to a 8-bit integer assuming the conversion cannot fail. |
- int8_t toInt8(v8::Handle<v8::Value>); |
- |
- // Convert a value to a 8-bit unsigned integer. The conversion fails if the |
- // value cannot be converted to a number or the range violated per WebIDL: |
- // http://www.w3.org/TR/WebIDL/#es-octet |
- uint8_t toUInt8(v8::Handle<v8::Value>, IntegerConversionConfiguration, ExceptionState&); |
- inline uint8_t toUInt8(v8::Handle<v8::Value> value, ExceptionState& exceptionState) |
- { |
- return toUInt8(value, NormalConversion, exceptionState); |
- } |
- |
- // Convert a value to a 8-bit unsigned integer assuming the conversion cannot fail. |
- uint8_t toUInt8(v8::Handle<v8::Value>); |
- |
- // Convert a value to a 16-bit signed integer. The conversion fails if the |
- // value cannot be converted to a number or the range violated per WebIDL: |
- // http://www.w3.org/TR/WebIDL/#es-short |
- int16_t toInt16(v8::Handle<v8::Value>, IntegerConversionConfiguration, ExceptionState&); |
- inline int16_t toInt16(v8::Handle<v8::Value> value, ExceptionState& exceptionState) |
- { |
- return toInt16(value, NormalConversion, exceptionState); |
- } |
- |
- // Convert a value to a 16-bit integer assuming the conversion cannot fail. |
- int16_t toInt16(v8::Handle<v8::Value>); |
- |
- // Convert a value to a 16-bit unsigned integer. The conversion fails if the |
- // value cannot be converted to a number or the range violated per WebIDL: |
- // http://www.w3.org/TR/WebIDL/#es-unsigned-short |
- uint16_t toUInt16(v8::Handle<v8::Value>, IntegerConversionConfiguration, ExceptionState&); |
- inline uint16_t toUInt16(v8::Handle<v8::Value> value, ExceptionState& exceptionState) |
- { |
- return toUInt16(value, NormalConversion, exceptionState); |
- } |
- |
- // Convert a value to a 16-bit unsigned integer assuming the conversion cannot fail. |
- uint16_t toUInt16(v8::Handle<v8::Value>); |
- |
- // Convert a value to a 32-bit signed integer. The conversion fails if the |
- // value cannot be converted to a number or the range violated per WebIDL: |
- // http://www.w3.org/TR/WebIDL/#es-long |
- int32_t toInt32(v8::Handle<v8::Value>, IntegerConversionConfiguration, ExceptionState&); |
- inline int32_t toInt32(v8::Handle<v8::Value> value, ExceptionState& exceptionState) |
- { |
- return toInt32(value, NormalConversion, exceptionState); |
- } |
- |
- // Convert a value to a 32-bit integer assuming the conversion cannot fail. |
- int32_t toInt32(v8::Handle<v8::Value>); |
- |
- // Convert a value to a 32-bit unsigned integer. The conversion fails if the |
- // value cannot be converted to a number or the range violated per WebIDL: |
- // http://www.w3.org/TR/WebIDL/#es-unsigned-long |
- uint32_t toUInt32(v8::Handle<v8::Value>, IntegerConversionConfiguration, ExceptionState&); |
- inline uint32_t toUInt32(v8::Handle<v8::Value> value, ExceptionState& exceptionState) |
- { |
- return toUInt32(value, NormalConversion, exceptionState); |
- } |
- |
- // Convert a value to a 32-bit unsigned integer assuming the conversion cannot fail. |
- uint32_t toUInt32(v8::Handle<v8::Value>); |
- |
- // Convert a value to a 64-bit signed integer. The conversion fails if the |
- // value cannot be converted to a number or the range violated per WebIDL: |
- // http://www.w3.org/TR/WebIDL/#es-long-long |
- int64_t toInt64(v8::Handle<v8::Value>, IntegerConversionConfiguration, ExceptionState&); |
- inline int64_t toInt64(v8::Handle<v8::Value> value, ExceptionState& exceptionState) |
- { |
- return toInt64(value, NormalConversion, exceptionState); |
- } |
- |
- // Convert a value to a 64-bit integer assuming the conversion cannot fail. |
- int64_t toInt64(v8::Handle<v8::Value>); |
- |
- // Convert a value to a 64-bit unsigned integer. The conversion fails if the |
- // value cannot be converted to a number or the range violated per WebIDL: |
- // http://www.w3.org/TR/WebIDL/#es-unsigned-long-long |
- uint64_t toUInt64(v8::Handle<v8::Value>, IntegerConversionConfiguration, ExceptionState&); |
- inline uint64_t toUInt64(v8::Handle<v8::Value> value, ExceptionState& exceptionState) |
- { |
- return toUInt64(value, NormalConversion, exceptionState); |
- } |
- |
- // Convert a value to a 64-bit unsigned integer assuming the conversion cannot fail. |
- uint64_t toUInt64(v8::Handle<v8::Value>); |
- |
- // Convert a value to a single precision float, which might fail. |
- float toFloat(v8::Handle<v8::Value>, ExceptionState&); |
- |
- // Convert a value to a single precision float assuming the conversion cannot fail. |
- inline float toFloat(v8::Local<v8::Value> value) |
+class DOMWindow; |
+class Document; |
+class EventListener; |
+class ExecutionContext; |
+class ExceptionState; |
+class LocalFrame; |
+class NodeFilter; |
+class ScriptWrappable; |
+class V8PerContextData; |
+class XPathNSResolver; |
+ |
+const int kMaxRecursionDepth = 22; |
+ |
+// Schedule a JavaScript error to be thrown. |
+v8::Handle<v8::Value> throwError(V8ErrorType, const String&, v8::Isolate*); |
+ |
+// Schedule a JavaScript error to be thrown. |
+v8::Handle<v8::Value> throwError(v8::Handle<v8::Value>, v8::Isolate*); |
+ |
+// A helper for throwing JavaScript TypeError. |
+v8::Handle<v8::Value> throwTypeError(const String&, v8::Isolate*); |
+ |
+v8::ArrayBuffer::Allocator* v8ArrayBufferAllocator(); |
+ |
+inline v8::Handle<v8::Value> argumentOrNull(const v8::FunctionCallbackInfo<v8::Value>& info, int index) |
+{ |
+ return index >= info.Length() ? v8::Local<v8::Value>() : info[index]; |
+} |
+ |
+template<typename CallbackInfo, typename V> |
+inline void v8SetReturnValue(const CallbackInfo& info, V v) |
+{ |
+ info.GetReturnValue().Set(v); |
+} |
+ |
+template<typename CallbackInfo> |
+inline void v8SetReturnValueBool(const CallbackInfo& info, bool v) |
+{ |
+ info.GetReturnValue().Set(v); |
+} |
+ |
+template<typename CallbackInfo> |
+inline void v8SetReturnValueInt(const CallbackInfo& info, int v) |
+{ |
+ info.GetReturnValue().Set(v); |
+} |
+ |
+template<typename CallbackInfo> |
+inline void v8SetReturnValueUnsigned(const CallbackInfo& info, unsigned v) |
+{ |
+ info.GetReturnValue().Set(v); |
+} |
+ |
+template<typename CallbackInfo> |
+inline void v8SetReturnValueNull(const CallbackInfo& info) |
+{ |
+ info.GetReturnValue().SetNull(); |
+} |
+ |
+template<typename CallbackInfo> |
+inline void v8SetReturnValueUndefined(const CallbackInfo& info) |
+{ |
+ info.GetReturnValue().SetUndefined(); |
+} |
+ |
+template<typename CallbackInfo> |
+inline void v8SetReturnValueEmptyString(const CallbackInfo& info) |
+{ |
+ info.GetReturnValue().SetEmptyString(); |
+} |
+ |
+template <class CallbackInfo> |
+inline void v8SetReturnValueString(const CallbackInfo& info, const String& string, v8::Isolate* isolate) |
+{ |
+ if (string.isNull()) { |
+ v8SetReturnValueEmptyString(info); |
+ return; |
+ } |
+ V8PerIsolateData::from(isolate)->stringCache()->setReturnValueFromString(info.GetReturnValue(), string.impl()); |
+} |
+ |
+template <class CallbackInfo> |
+inline void v8SetReturnValueStringOrNull(const CallbackInfo& info, const String& string, v8::Isolate* isolate) |
+{ |
+ if (string.isNull()) { |
+ v8SetReturnValueNull(info); |
+ return; |
+ } |
+ V8PerIsolateData::from(isolate)->stringCache()->setReturnValueFromString(info.GetReturnValue(), string.impl()); |
+} |
+ |
+template <class CallbackInfo> |
+inline void v8SetReturnValueStringOrUndefined(const CallbackInfo& info, const String& string, v8::Isolate* isolate) |
+{ |
+ if (string.isNull()) { |
+ v8SetReturnValueUndefined(info); |
+ return; |
+ } |
+ V8PerIsolateData::from(isolate)->stringCache()->setReturnValueFromString(info.GetReturnValue(), string.impl()); |
+} |
+ |
+// Convert v8::String to a WTF::String. If the V8 string is not already |
+// an external string then it is transformed into an external string at this |
+// point to avoid repeated conversions. |
+inline String toCoreString(v8::Handle<v8::String> value) |
+{ |
+ return v8StringToWebCoreString<String>(value, Externalize); |
+} |
+ |
+inline String toCoreStringWithNullCheck(v8::Handle<v8::String> value) |
+{ |
+ if (value.IsEmpty() || value->IsNull()) |
+ return String(); |
+ return toCoreString(value); |
+} |
+ |
+inline String toCoreStringWithUndefinedOrNullCheck(v8::Handle<v8::String> value) |
+{ |
+ if (value.IsEmpty() || value->IsNull() || value->IsUndefined()) |
+ return String(); |
+ return toCoreString(value); |
+} |
+ |
+inline AtomicString toCoreAtomicString(v8::Handle<v8::String> value) |
+{ |
+ return v8StringToWebCoreString<AtomicString>(value, Externalize); |
+} |
+ |
+// This method will return a null String if the v8::Value does not contain a v8::String. |
+// It will not call ToString() on the v8::Value. If you want ToString() to be called, |
+// please use the V8TRYCATCH_FOR_V8STRINGRESOURCE_*() macros instead. |
+inline String toCoreStringWithUndefinedOrNullCheck(v8::Handle<v8::Value> value) |
+{ |
+ if (value.IsEmpty() || !value->IsString()) |
+ return String(); |
+ return toCoreString(value.As<v8::String>()); |
+} |
+ |
+// Convert a string to a V8 string. |
+// Return a V8 external string that shares the underlying buffer with the given |
+// WebCore string. The reference counting mechanism is used to keep the |
+// underlying buffer alive while the string is still live in the V8 engine. |
+inline v8::Handle<v8::String> v8String(v8::Isolate* isolate, const String& string) |
+{ |
+ if (string.isNull()) |
+ return v8::String::Empty(isolate); |
+ return V8PerIsolateData::from(isolate)->stringCache()->v8ExternalString(string.impl(), isolate); |
+} |
+ |
+inline v8::Handle<v8::String> v8AtomicString(v8::Isolate* isolate, const char* str) |
+{ |
+ ASSERT(isolate); |
+ return v8::String::NewFromUtf8(isolate, str, v8::String::kInternalizedString, strlen(str)); |
+} |
+ |
+inline v8::Handle<v8::String> v8AtomicString(v8::Isolate* isolate, const char* str, size_t length) |
+{ |
+ ASSERT(isolate); |
+ return v8::String::NewFromUtf8(isolate, str, v8::String::kInternalizedString, length); |
+} |
+ |
+inline v8::Handle<v8::Value> v8Undefined() |
+{ |
+ return v8::Handle<v8::Value>(); |
+} |
+ |
+template <class T> |
+struct V8ValueTraits { |
+ static inline v8::Handle<v8::Value> arrayV8Value(const T& value, v8::Isolate* isolate) |
+ { |
+ return toV8(WTF::getPtr(value), v8::Handle<v8::Object>(), isolate); |
+ } |
+}; |
+ |
+template<> |
+struct V8ValueTraits<String> { |
+ static inline v8::Handle<v8::Value> arrayV8Value(const String& value, v8::Isolate* isolate) |
+ { |
+ return v8String(isolate, value); |
+ } |
+}; |
+ |
+template<> |
+struct V8ValueTraits<AtomicString> { |
+ static inline v8::Handle<v8::Value> arrayV8Value(const AtomicString& value, v8::Isolate* isolate) |
+ { |
+ return v8String(isolate, value); |
+ } |
+}; |
+ |
+template<> |
+struct V8ValueTraits<unsigned> { |
+ static inline v8::Handle<v8::Value> arrayV8Value(const unsigned& value, v8::Isolate* isolate) |
+ { |
+ return v8::Integer::NewFromUnsigned(isolate, value); |
+ } |
+}; |
+ |
+template<> |
+struct V8ValueTraits<unsigned long> { |
+ static inline v8::Handle<v8::Value> arrayV8Value(const unsigned long& value, v8::Isolate* isolate) |
+ { |
+ return v8::Integer::NewFromUnsigned(isolate, value); |
+ } |
+}; |
+ |
+template<> |
+struct V8ValueTraits<float> { |
+ static inline v8::Handle<v8::Value> arrayV8Value(const float& value, v8::Isolate* isolate) |
+ { |
+ return v8::Number::New(isolate, value); |
+ } |
+}; |
+ |
+template<> |
+struct V8ValueTraits<double> { |
+ static inline v8::Handle<v8::Value> arrayV8Value(const double& value, v8::Isolate* isolate) |
+ { |
+ return v8::Number::New(isolate, value); |
+ } |
+}; |
+ |
+template<typename T, size_t inlineCapacity> |
+v8::Handle<v8::Value> v8Array(const Vector<T, inlineCapacity>& iterator, v8::Isolate* isolate) |
+{ |
+ v8::Local<v8::Array> result = v8::Array::New(isolate, iterator.size()); |
+ int index = 0; |
+ typename Vector<T, inlineCapacity>::const_iterator end = iterator.end(); |
+ typedef V8ValueTraits<T> TraitsType; |
+ for (typename Vector<T, inlineCapacity>::const_iterator iter = iterator.begin(); iter != end; ++iter) |
+ result->Set(v8::Integer::New(isolate, index++), TraitsType::arrayV8Value(*iter, isolate)); |
+ return result; |
+} |
+ |
+template<typename T, size_t inlineCapacity> |
+v8::Handle<v8::Value> v8Array(const HeapVector<T, inlineCapacity>& iterator, v8::Isolate* isolate) |
+{ |
+ v8::Local<v8::Array> result = v8::Array::New(isolate, iterator.size()); |
+ int index = 0; |
+ typename HeapVector<T, inlineCapacity>::const_iterator end = iterator.end(); |
+ typedef V8ValueTraits<T> TraitsType; |
+ for (typename HeapVector<T, inlineCapacity>::const_iterator iter = iterator.begin(); iter != end; ++iter) |
+ result->Set(v8::Integer::New(isolate, index++), TraitsType::arrayV8Value(*iter, isolate)); |
+ return result; |
+} |
+ |
+// Conversion flags, used in toIntXX/toUIntXX. |
+enum IntegerConversionConfiguration { |
+ NormalConversion, |
+ EnforceRange, |
+ Clamp |
+}; |
+ |
+// Convert a value to a 8-bit signed integer. The conversion fails if the |
+// value cannot be converted to a number or the range violated per WebIDL: |
+// http://www.w3.org/TR/WebIDL/#es-byte |
+int8_t toInt8(v8::Handle<v8::Value>, IntegerConversionConfiguration, ExceptionState&); |
+inline int8_t toInt8(v8::Handle<v8::Value> value, ExceptionState& exceptionState) |
+{ |
+ return toInt8(value, NormalConversion, exceptionState); |
+} |
+ |
+// Convert a value to a 8-bit integer assuming the conversion cannot fail. |
+int8_t toInt8(v8::Handle<v8::Value>); |
+ |
+// Convert a value to a 8-bit unsigned integer. The conversion fails if the |
+// value cannot be converted to a number or the range violated per WebIDL: |
+// http://www.w3.org/TR/WebIDL/#es-octet |
+uint8_t toUInt8(v8::Handle<v8::Value>, IntegerConversionConfiguration, ExceptionState&); |
+inline uint8_t toUInt8(v8::Handle<v8::Value> value, ExceptionState& exceptionState) |
+{ |
+ return toUInt8(value, NormalConversion, exceptionState); |
+} |
+ |
+// Convert a value to a 8-bit unsigned integer assuming the conversion cannot fail. |
+uint8_t toUInt8(v8::Handle<v8::Value>); |
+ |
+// Convert a value to a 16-bit signed integer. The conversion fails if the |
+// value cannot be converted to a number or the range violated per WebIDL: |
+// http://www.w3.org/TR/WebIDL/#es-short |
+int16_t toInt16(v8::Handle<v8::Value>, IntegerConversionConfiguration, ExceptionState&); |
+inline int16_t toInt16(v8::Handle<v8::Value> value, ExceptionState& exceptionState) |
+{ |
+ return toInt16(value, NormalConversion, exceptionState); |
+} |
+ |
+// Convert a value to a 16-bit integer assuming the conversion cannot fail. |
+int16_t toInt16(v8::Handle<v8::Value>); |
+ |
+// Convert a value to a 16-bit unsigned integer. The conversion fails if the |
+// value cannot be converted to a number or the range violated per WebIDL: |
+// http://www.w3.org/TR/WebIDL/#es-unsigned-short |
+uint16_t toUInt16(v8::Handle<v8::Value>, IntegerConversionConfiguration, ExceptionState&); |
+inline uint16_t toUInt16(v8::Handle<v8::Value> value, ExceptionState& exceptionState) |
+{ |
+ return toUInt16(value, NormalConversion, exceptionState); |
+} |
+ |
+// Convert a value to a 16-bit unsigned integer assuming the conversion cannot fail. |
+uint16_t toUInt16(v8::Handle<v8::Value>); |
+ |
+// Convert a value to a 32-bit signed integer. The conversion fails if the |
+// value cannot be converted to a number or the range violated per WebIDL: |
+// http://www.w3.org/TR/WebIDL/#es-long |
+int32_t toInt32(v8::Handle<v8::Value>, IntegerConversionConfiguration, ExceptionState&); |
+inline int32_t toInt32(v8::Handle<v8::Value> value, ExceptionState& exceptionState) |
+{ |
+ return toInt32(value, NormalConversion, exceptionState); |
+} |
+ |
+// Convert a value to a 32-bit integer assuming the conversion cannot fail. |
+int32_t toInt32(v8::Handle<v8::Value>); |
+ |
+// Convert a value to a 32-bit unsigned integer. The conversion fails if the |
+// value cannot be converted to a number or the range violated per WebIDL: |
+// http://www.w3.org/TR/WebIDL/#es-unsigned-long |
+uint32_t toUInt32(v8::Handle<v8::Value>, IntegerConversionConfiguration, ExceptionState&); |
+inline uint32_t toUInt32(v8::Handle<v8::Value> value, ExceptionState& exceptionState) |
+{ |
+ return toUInt32(value, NormalConversion, exceptionState); |
+} |
+ |
+// Convert a value to a 32-bit unsigned integer assuming the conversion cannot fail. |
+uint32_t toUInt32(v8::Handle<v8::Value>); |
+ |
+// Convert a value to a 64-bit signed integer. The conversion fails if the |
+// value cannot be converted to a number or the range violated per WebIDL: |
+// http://www.w3.org/TR/WebIDL/#es-long-long |
+int64_t toInt64(v8::Handle<v8::Value>, IntegerConversionConfiguration, ExceptionState&); |
+inline int64_t toInt64(v8::Handle<v8::Value> value, ExceptionState& exceptionState) |
+{ |
+ return toInt64(value, NormalConversion, exceptionState); |
+} |
+ |
+// Convert a value to a 64-bit integer assuming the conversion cannot fail. |
+int64_t toInt64(v8::Handle<v8::Value>); |
+ |
+// Convert a value to a 64-bit unsigned integer. The conversion fails if the |
+// value cannot be converted to a number or the range violated per WebIDL: |
+// http://www.w3.org/TR/WebIDL/#es-unsigned-long-long |
+uint64_t toUInt64(v8::Handle<v8::Value>, IntegerConversionConfiguration, ExceptionState&); |
+inline uint64_t toUInt64(v8::Handle<v8::Value> value, ExceptionState& exceptionState) |
+{ |
+ return toUInt64(value, NormalConversion, exceptionState); |
+} |
+ |
+// Convert a value to a 64-bit unsigned integer assuming the conversion cannot fail. |
+uint64_t toUInt64(v8::Handle<v8::Value>); |
+ |
+// Convert a value to a single precision float, which might fail. |
+float toFloat(v8::Handle<v8::Value>, ExceptionState&); |
+ |
+// Convert a value to a single precision float assuming the conversion cannot fail. |
+inline float toFloat(v8::Local<v8::Value> value) |
+{ |
+ return static_cast<float>(value->NumberValue()); |
+} |
+ |
+inline v8::Handle<v8::Boolean> v8Boolean(bool value, v8::Isolate* isolate) |
+{ |
+ return value ? v8::True(isolate) : v8::False(isolate); |
+} |
+ |
+inline double toCoreDate(v8::Handle<v8::Value> object) |
+{ |
+ if (object->IsDate()) |
+ return v8::Handle<v8::Date>::Cast(object)->ValueOf(); |
+ if (object->IsNumber()) |
+ return object->NumberValue(); |
+ return std::numeric_limits<double>::quiet_NaN(); |
+} |
+ |
+inline v8::Handle<v8::Value> v8DateOrNull(double value, v8::Isolate* isolate) |
+{ |
+ ASSERT(isolate); |
+ return std::isfinite(value) ? v8::Date::New(isolate, value) : v8::Handle<v8::Value>::Cast(v8::Null(isolate)); |
+} |
+ |
+// FIXME: Remove the special casing for NodeFilter and XPathNSResolver. |
+PassRefPtr<NodeFilter> toNodeFilter(v8::Handle<v8::Value>, v8::Isolate*); |
+PassRefPtrWillBeRawPtr<XPathNSResolver> toXPathNSResolver(v8::Handle<v8::Value>, v8::Isolate*); |
+ |
+template<class T> struct NativeValueTraits; |
+ |
+template<> |
+struct NativeValueTraits<String> { |
+ static inline String nativeValue(const v8::Handle<v8::Value>& value, v8::Isolate* isolate) |
+ { |
+ V8TRYCATCH_FOR_V8STRINGRESOURCE_RETURN(V8StringResource<>, stringValue, value, String()); |
+ return stringValue; |
+ } |
+}; |
+ |
+template<> |
+struct NativeValueTraits<unsigned> { |
+ static inline unsigned nativeValue(const v8::Handle<v8::Value>& value, v8::Isolate* isolate) |
+ { |
+ return toUInt32(value); |
+ } |
+}; |
+ |
+template<> |
+struct NativeValueTraits<float> { |
+ static inline float nativeValue(const v8::Handle<v8::Value>& value, v8::Isolate* isolate) |
{ |
return static_cast<float>(value->NumberValue()); |
} |
- |
- inline v8::Handle<v8::Boolean> v8Boolean(bool value, v8::Isolate* isolate) |
- { |
- return value ? v8::True(isolate) : v8::False(isolate); |
- } |
- |
- inline double toCoreDate(v8::Handle<v8::Value> object) |
- { |
- if (object->IsDate()) |
- return v8::Handle<v8::Date>::Cast(object)->ValueOf(); |
- if (object->IsNumber()) |
- return object->NumberValue(); |
- return std::numeric_limits<double>::quiet_NaN(); |
- } |
- |
- inline v8::Handle<v8::Value> v8DateOrNull(double value, v8::Isolate* isolate) |
- { |
- ASSERT(isolate); |
- return std::isfinite(value) ? v8::Date::New(isolate, value) : v8::Handle<v8::Value>::Cast(v8::Null(isolate)); |
- } |
- |
- // FIXME: Remove the special casing for NodeFilter and XPathNSResolver. |
- PassRefPtr<NodeFilter> toNodeFilter(v8::Handle<v8::Value>, v8::Isolate*); |
- PassRefPtrWillBeRawPtr<XPathNSResolver> toXPathNSResolver(v8::Handle<v8::Value>, v8::Isolate*); |
- |
- template<class T> struct NativeValueTraits; |
- |
- template<> |
- struct NativeValueTraits<String> { |
- static inline String nativeValue(const v8::Handle<v8::Value>& value, v8::Isolate* isolate) |
- { |
- V8TRYCATCH_FOR_V8STRINGRESOURCE_RETURN(V8StringResource<>, stringValue, value, String()); |
- return stringValue; |
- } |
- }; |
- |
- template<> |
- struct NativeValueTraits<unsigned> { |
- static inline unsigned nativeValue(const v8::Handle<v8::Value>& value, v8::Isolate* isolate) |
- { |
- return toUInt32(value); |
- } |
- }; |
- |
- template<> |
- struct NativeValueTraits<float> { |
- static inline float nativeValue(const v8::Handle<v8::Value>& value, v8::Isolate* isolate) |
- { |
- return static_cast<float>(value->NumberValue()); |
- } |
- }; |
- |
- template<> |
- struct NativeValueTraits<double> { |
- static inline double nativeValue(const v8::Handle<v8::Value>& value, v8::Isolate* isolate) |
- { |
- return static_cast<double>(value->NumberValue()); |
- } |
- }; |
- |
- template<> |
- struct NativeValueTraits<v8::Handle<v8::Value> > { |
- static inline v8::Handle<v8::Value> nativeValue(const v8::Handle<v8::Value>& value, v8::Isolate* isolate) |
- { |
- return value; |
- } |
- }; |
- |
- // Converts a JavaScript value to an array as per the Web IDL specification: |
- // http://www.w3.org/TR/2012/CR-WebIDL-20120419/#es-array |
- template <class T, class V8T> |
- Vector<RefPtr<T> > toRefPtrNativeArrayUnchecked(v8::Local<v8::Value> v8Value, uint32_t length, v8::Isolate* isolate, bool* success = 0) |
- { |
- Vector<RefPtr<T> > result; |
- result.reserveInitialCapacity(length); |
- v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(v8Value); |
- for (uint32_t i = 0; i < length; ++i) { |
- v8::Handle<v8::Value> element = object->Get(i); |
- |
- if (V8T::hasInstance(element, isolate)) { |
- v8::Handle<v8::Object> elementObject = v8::Handle<v8::Object>::Cast(element); |
- result.uncheckedAppend(V8T::toNative(elementObject)); |
- } else { |
- if (success) |
- *success = false; |
- throwTypeError("Invalid Array element type", isolate); |
- return Vector<RefPtr<T> >(); |
- } |
- } |
- return result; |
- } |
- |
- v8::Handle<v8::Value> toV8Sequence(v8::Handle<v8::Value>, uint32_t& length, v8::Isolate*); |
- |
- template <class T, class V8T> |
- Vector<RefPtr<T> > toRefPtrNativeArray(v8::Handle<v8::Value> value, int argumentIndex, v8::Isolate* isolate, bool* success = 0) |
- { |
- if (success) |
- *success = true; |
- |
- v8::Local<v8::Value> v8Value(v8::Local<v8::Value>::New(isolate, value)); |
- uint32_t length = 0; |
- if (value->IsArray()) { |
- length = v8::Local<v8::Array>::Cast(v8Value)->Length(); |
- } else if (toV8Sequence(value, length, isolate).IsEmpty()) { |
- throwTypeError(ExceptionMessages::notAnArrayTypeArgumentOrValue(argumentIndex), isolate); |
- return Vector<RefPtr<T> >(); |
- } |
- |
- return toRefPtrNativeArrayUnchecked<T, V8T>(v8Value, length, isolate, success); |
- } |
- |
- template <class T, class V8T> |
- Vector<RefPtr<T> > toRefPtrNativeArray(v8::Handle<v8::Value> value, const String& propertyName, v8::Isolate* isolate, bool* success = 0) |
- { |
- if (success) |
- *success = true; |
- |
- v8::Local<v8::Value> v8Value(v8::Local<v8::Value>::New(isolate, value)); |
- uint32_t length = 0; |
- if (value->IsArray()) { |
- length = v8::Local<v8::Array>::Cast(v8Value)->Length(); |
- } else if (toV8Sequence(value, length, isolate).IsEmpty()) { |
- throwTypeError(ExceptionMessages::notASequenceTypeProperty(propertyName), isolate); |
+}; |
+ |
+template<> |
+struct NativeValueTraits<double> { |
+ static inline double nativeValue(const v8::Handle<v8::Value>& value, v8::Isolate* isolate) |
+ { |
+ return static_cast<double>(value->NumberValue()); |
+ } |
+}; |
+ |
+template<> |
+struct NativeValueTraits<v8::Handle<v8::Value> > { |
+ static inline v8::Handle<v8::Value> nativeValue(const v8::Handle<v8::Value>& value, v8::Isolate* isolate) |
+ { |
+ return value; |
+ } |
+}; |
+ |
+// Converts a JavaScript value to an array as per the Web IDL specification: |
+// http://www.w3.org/TR/2012/CR-WebIDL-20120419/#es-array |
+template <class T, class V8T> |
+Vector<RefPtr<T> > toRefPtrNativeArrayUnchecked(v8::Local<v8::Value> v8Value, uint32_t length, v8::Isolate* isolate, bool* success = 0) |
+{ |
+ Vector<RefPtr<T> > result; |
+ result.reserveInitialCapacity(length); |
+ v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(v8Value); |
+ for (uint32_t i = 0; i < length; ++i) { |
+ v8::Handle<v8::Value> element = object->Get(i); |
+ if (V8T::hasInstance(element, isolate)) { |
+ v8::Handle<v8::Object> elementObject = v8::Handle<v8::Object>::Cast(element); |
+ result.uncheckedAppend(V8T::toNative(elementObject)); |
+ } else { |
+ if (success) |
+ *success = false; |
+ throwTypeError("Invalid Array element type", isolate); |
return Vector<RefPtr<T> >(); |
} |
- |
- return toRefPtrNativeArrayUnchecked<T, V8T>(v8Value, length, isolate, success); |
- } |
- |
- // Converts a JavaScript value to an array as per the Web IDL specification: |
- // http://www.w3.org/TR/2012/CR-WebIDL-20120419/#es-array |
- template <class T> |
- Vector<T> toNativeArray(v8::Handle<v8::Value> value, int argumentIndex, v8::Isolate* isolate) |
- { |
- v8::Local<v8::Value> v8Value(v8::Local<v8::Value>::New(isolate, value)); |
- uint32_t length = 0; |
- if (value->IsArray()) { |
- length = v8::Local<v8::Array>::Cast(v8Value)->Length(); |
- } else if (toV8Sequence(value, length, isolate).IsEmpty()) { |
- throwTypeError(ExceptionMessages::notAnArrayTypeArgumentOrValue(argumentIndex), isolate); |
- return Vector<T>(); |
- } |
- |
- Vector<T> result; |
- result.reserveInitialCapacity(length); |
- typedef NativeValueTraits<T> TraitsType; |
- v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(v8Value); |
- for (uint32_t i = 0; i < length; ++i) |
- result.uncheckedAppend(TraitsType::nativeValue(object->Get(i), isolate)); |
- return result; |
- } |
- |
- template <class T> |
- Vector<T> toNativeArguments(const v8::FunctionCallbackInfo<v8::Value>& info, int startIndex) |
- { |
- ASSERT(startIndex <= info.Length()); |
- Vector<T> result; |
- typedef NativeValueTraits<T> TraitsType; |
- int length = info.Length(); |
- result.reserveInitialCapacity(length); |
- for (int i = startIndex; i < length; ++i) |
- result.uncheckedAppend(TraitsType::nativeValue(info[i], info.GetIsolate())); |
- return result; |
- } |
- |
- // Validates that the passed object is a sequence type per WebIDL spec |
- // http://www.w3.org/TR/2012/CR-WebIDL-20120419/#es-sequence |
- inline v8::Handle<v8::Value> toV8Sequence(v8::Handle<v8::Value> value, uint32_t& length, v8::Isolate* isolate) |
- { |
- // Attempt converting to a sequence if the value is not already an array but is |
- // any kind of object except for a native Date object or a native RegExp object. |
- ASSERT(!value->IsArray()); |
- // FIXME: Do we really need to special case Date and RegExp object? |
- // https://www.w3.org/Bugs/Public/show_bug.cgi?id=22806 |
- if (!value->IsObject() || value->IsDate() || value->IsRegExp()) { |
- // The caller is responsible for reporting a TypeError. |
- return v8Undefined(); |
- } |
- |
- v8::Local<v8::Value> v8Value(v8::Local<v8::Value>::New(isolate, value)); |
- v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(v8Value); |
- v8::Local<v8::String> lengthSymbol = v8AtomicString(isolate, "length"); |
- |
- // FIXME: The specification states that the length property should be used as fallback, if value |
- // is not a platform object that supports indexed properties. If it supports indexed properties, |
- // length should actually be one greater than value’s maximum indexed property index. |
- V8TRYCATCH(v8::Local<v8::Value>, lengthValue, object->Get(lengthSymbol)); |
- |
- if (lengthValue->IsUndefined() || lengthValue->IsNull()) { |
- // The caller is responsible for reporting a TypeError. |
- return v8Undefined(); |
- } |
- |
- V8TRYCATCH(uint32_t, sequenceLength, lengthValue->Int32Value()); |
- length = sequenceLength; |
- |
- return v8Value; |
- } |
- |
- v8::Isolate* toIsolate(ExecutionContext*); |
- v8::Isolate* toIsolate(LocalFrame*); |
- |
- WrapperWorldType worldType(v8::Isolate*); |
- WrapperWorldType worldTypeInMainThread(v8::Isolate*); |
- |
- DOMWindow* toDOMWindow(v8::Handle<v8::Value>, v8::Isolate*); |
- DOMWindow* toDOMWindow(v8::Handle<v8::Context>); |
- ExecutionContext* toExecutionContext(v8::Handle<v8::Context>); |
- |
- DOMWindow* callingDOMWindow(v8::Isolate*); |
- ExecutionContext* callingExecutionContext(v8::Isolate*); |
- DOMWindow* enteredDOMWindow(v8::Isolate*); |
- Document* currentDocument(v8::Isolate*); |
- ExecutionContext* currentExecutionContext(v8::Isolate*); |
- |
- // Returns a V8 context associated with a ExecutionContext and a DOMWrapperWorld. |
- // This method returns an empty context if there is no frame or the frame is already detached. |
- v8::Local<v8::Context> toV8Context(ExecutionContext*, DOMWrapperWorld*); |
- // Returns a V8 context associated with a LocalFrame and a DOMWrapperWorld. |
- // This method returns an empty context if the frame is already detached. |
- v8::Local<v8::Context> toV8Context(v8::Isolate*, LocalFrame*, DOMWrapperWorld*); |
- |
- // Returns the frame object of the window object associated with |
- // a context, if the window is currently being displayed in the LocalFrame. |
- LocalFrame* toFrameIfNotDetached(v8::Handle<v8::Context>); |
- |
- // If the current context causes out of memory, JavaScript setting |
- // is disabled and it returns true. |
- bool handleOutOfMemory(); |
- v8::Local<v8::Value> handleMaxRecursionDepthExceeded(v8::Isolate*); |
- void crashIfV8IsDead(); |
- |
- inline bool isUndefinedOrNull(v8::Handle<v8::Value> value) |
- { |
- return value->IsNull() || value->IsUndefined(); |
- } |
- v8::Handle<v8::Function> getBoundFunction(v8::Handle<v8::Function>); |
- |
- // Attaches |environment| to |function| and returns it. |
- inline v8::Local<v8::Function> createClosure(v8::FunctionCallback function, v8::Handle<v8::Value> environment, v8::Isolate* isolate) |
- { |
- return v8::Function::New(isolate, function, environment); |
- } |
- |
- // FIXME: This will be soon embedded in the generated code. |
- template<class Collection> static void indexedPropertyEnumerator(const v8::PropertyCallbackInfo<v8::Array>& info) |
- { |
- Collection* collection = reinterpret_cast<Collection*>(info.Holder()->GetAlignedPointerFromInternalField(v8DOMWrapperObjectIndex)); |
- int length = collection->length(); |
- v8::Handle<v8::Array> properties = v8::Array::New(info.GetIsolate(), length); |
- for (int i = 0; i < length; ++i) { |
- // FIXME: Do we need to check that the item function returns a non-null value for this index? |
- v8::Handle<v8::Integer> integer = v8::Integer::New(info.GetIsolate(), i); |
- properties->Set(integer, integer); |
- } |
- v8SetReturnValue(info, properties); |
} |
- |
- v8::Local<v8::Value> getHiddenValue(v8::Isolate*, v8::Handle<v8::Object>, const char*); |
- v8::Local<v8::Value> getHiddenValue(v8::Isolate*, v8::Handle<v8::Object>, v8::Handle<v8::String>); |
- bool setHiddenValue(v8::Isolate*, v8::Handle<v8::Object>, const char*, v8::Handle<v8::Value>); |
- bool setHiddenValue(v8::Isolate*, v8::Handle<v8::Object>, v8::Handle<v8::String>, v8::Handle<v8::Value>); |
- bool deleteHiddenValue(v8::Isolate*, v8::Handle<v8::Object>, const char*); |
- bool deleteHiddenValue(v8::Isolate*, v8::Handle<v8::Object>, v8::Handle<v8::String>); |
- v8::Local<v8::Value> getHiddenValueFromMainWorldWrapper(v8::Isolate*, ScriptWrappable*, const char*); |
- v8::Local<v8::Value> getHiddenValueFromMainWorldWrapper(v8::Isolate*, ScriptWrappable*, v8::Handle<v8::String>); |
- |
- // These methods store hidden values into an array that is stored in the internal field of a DOM wrapper. |
- void addHiddenValueToArray(v8::Handle<v8::Object>, v8::Local<v8::Value>, int cacheIndex, v8::Isolate*); |
- void removeHiddenValueFromArray(v8::Handle<v8::Object>, v8::Local<v8::Value>, int cacheIndex, v8::Isolate*); |
- void moveEventListenerToNewWrapper(v8::Handle<v8::Object>, EventListener* oldValue, v8::Local<v8::Value> newValue, int cacheIndex, v8::Isolate*); |
- |
- // Converts a DOM object to a v8 value. |
- // This is a no-inline version of toV8(). If you want to call toV8() |
- // without creating #include cycles, you can use this function instead. |
- // Each specialized implementation will be generated. |
- template<typename T> |
- v8::Handle<v8::Value> toV8NoInline(T* impl, v8::Handle<v8::Object> creationContext, v8::Isolate*); |
- |
- // Result values for platform object 'deleter' methods, |
- // http://www.w3.org/TR/WebIDL/#delete |
- enum DeleteResult { |
- DeleteSuccess, |
- DeleteReject, |
- DeleteUnknownProperty |
- }; |
- |
- class V8IsolateInterruptor : public ThreadState::Interruptor { |
- public: |
- explicit V8IsolateInterruptor(v8::Isolate* isolate) : m_isolate(isolate) { } |
- |
- static void onInterruptCallback(v8::Isolate* isolate, void* data) |
- { |
- reinterpret_cast<V8IsolateInterruptor*>(data)->onInterrupted(); |
- } |
- |
- virtual void requestInterrupt() OVERRIDE |
- { |
- m_isolate->RequestInterrupt(&onInterruptCallback, this); |
- } |
- |
- virtual void clearInterrupt() OVERRIDE |
- { |
- m_isolate->ClearInterrupt(); |
- } |
- |
- private: |
- v8::Isolate* m_isolate; |
- }; |
+ return result; |
+} |
+ |
+v8::Handle<v8::Value> toV8Sequence(v8::Handle<v8::Value>, uint32_t& length, v8::Isolate*); |
+ |
+template <class T, class V8T> |
+Vector<RefPtr<T> > toRefPtrNativeArray(v8::Handle<v8::Value> value, int argumentIndex, v8::Isolate* isolate, bool* success = 0) |
+{ |
+ if (success) |
+ *success = true; |
+ |
+ v8::Local<v8::Value> v8Value(v8::Local<v8::Value>::New(isolate, value)); |
+ uint32_t length = 0; |
+ if (value->IsArray()) { |
+ length = v8::Local<v8::Array>::Cast(v8Value)->Length(); |
+ } else if (toV8Sequence(value, length, isolate).IsEmpty()) { |
+ throwTypeError(ExceptionMessages::notAnArrayTypeArgumentOrValue(argumentIndex), isolate); |
+ return Vector<RefPtr<T> >(); |
+ } |
+ return toRefPtrNativeArrayUnchecked<T, V8T>(v8Value, length, isolate, success); |
+} |
+ |
+template <class T, class V8T> |
+Vector<RefPtr<T> > toRefPtrNativeArray(v8::Handle<v8::Value> value, const String& propertyName, v8::Isolate* isolate, bool* success = 0) |
+{ |
+ if (success) |
+ *success = true; |
+ |
+ v8::Local<v8::Value> v8Value(v8::Local<v8::Value>::New(isolate, value)); |
+ uint32_t length = 0; |
+ if (value->IsArray()) { |
+ length = v8::Local<v8::Array>::Cast(v8Value)->Length(); |
+ } else if (toV8Sequence(value, length, isolate).IsEmpty()) { |
+ throwTypeError(ExceptionMessages::notASequenceTypeProperty(propertyName), isolate); |
+ return Vector<RefPtr<T> >(); |
+ } |
+ return toRefPtrNativeArrayUnchecked<T, V8T>(v8Value, length, isolate, success); |
+} |
+ |
+// Converts a JavaScript value to an array as per the Web IDL specification: |
+// http://www.w3.org/TR/2012/CR-WebIDL-20120419/#es-array |
+template <class T> |
+Vector<T> toNativeArray(v8::Handle<v8::Value> value, int argumentIndex, v8::Isolate* isolate) |
+{ |
+ v8::Local<v8::Value> v8Value(v8::Local<v8::Value>::New(isolate, value)); |
+ uint32_t length = 0; |
+ if (value->IsArray()) { |
+ length = v8::Local<v8::Array>::Cast(v8Value)->Length(); |
+ } else if (toV8Sequence(value, length, isolate).IsEmpty()) { |
+ throwTypeError(ExceptionMessages::notAnArrayTypeArgumentOrValue(argumentIndex), isolate); |
+ return Vector<T>(); |
+ } |
+ |
+ Vector<T> result; |
+ result.reserveInitialCapacity(length); |
+ typedef NativeValueTraits<T> TraitsType; |
+ v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(v8Value); |
+ for (uint32_t i = 0; i < length; ++i) |
+ result.uncheckedAppend(TraitsType::nativeValue(object->Get(i), isolate)); |
+ return result; |
+} |
+ |
+template <class T> |
+Vector<T> toNativeArguments(const v8::FunctionCallbackInfo<v8::Value>& info, int startIndex) |
+{ |
+ ASSERT(startIndex <= info.Length()); |
+ Vector<T> result; |
+ typedef NativeValueTraits<T> TraitsType; |
+ int length = info.Length(); |
+ result.reserveInitialCapacity(length); |
+ for (int i = startIndex; i < length; ++i) |
+ result.uncheckedAppend(TraitsType::nativeValue(info[i], info.GetIsolate())); |
+ return result; |
+} |
+ |
+// Validates that the passed object is a sequence type per WebIDL spec |
+// http://www.w3.org/TR/2012/CR-WebIDL-20120419/#es-sequence |
+inline v8::Handle<v8::Value> toV8Sequence(v8::Handle<v8::Value> value, uint32_t& length, v8::Isolate* isolate) |
+{ |
+ // Attempt converting to a sequence if the value is not already an array but is |
+ // any kind of object except for a native Date object or a native RegExp object. |
+ ASSERT(!value->IsArray()); |
+ // FIXME: Do we really need to special case Date and RegExp object? |
+ // https://www.w3.org/Bugs/Public/show_bug.cgi?id=22806 |
+ if (!value->IsObject() || value->IsDate() || value->IsRegExp()) { |
+ // The caller is responsible for reporting a TypeError. |
+ return v8Undefined(); |
+ } |
+ |
+ v8::Local<v8::Value> v8Value(v8::Local<v8::Value>::New(isolate, value)); |
+ v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(v8Value); |
+ v8::Local<v8::String> lengthSymbol = v8AtomicString(isolate, "length"); |
+ |
+ // FIXME: The specification states that the length property should be used as fallback, if value |
+ // is not a platform object that supports indexed properties. If it supports indexed properties, |
+ // length should actually be one greater than value’s maximum indexed property index. |
+ V8TRYCATCH(v8::Local<v8::Value>, lengthValue, object->Get(lengthSymbol)); |
+ |
+ if (lengthValue->IsUndefined() || lengthValue->IsNull()) { |
+ // The caller is responsible for reporting a TypeError. |
+ return v8Undefined(); |
+ } |
+ |
+ V8TRYCATCH(uint32_t, sequenceLength, lengthValue->Int32Value()); |
+ length = sequenceLength; |
+ return v8Value; |
+} |
+ |
+v8::Isolate* toIsolate(ExecutionContext*); |
+v8::Isolate* toIsolate(LocalFrame*); |
+ |
+WrapperWorldType worldType(v8::Isolate*); |
+WrapperWorldType worldTypeInMainThread(v8::Isolate*); |
+ |
+DOMWindow* toDOMWindow(v8::Handle<v8::Value>, v8::Isolate*); |
+DOMWindow* toDOMWindow(v8::Handle<v8::Context>); |
+ExecutionContext* toExecutionContext(v8::Handle<v8::Context>); |
+ |
+DOMWindow* callingDOMWindow(v8::Isolate*); |
+ExecutionContext* callingExecutionContext(v8::Isolate*); |
+DOMWindow* enteredDOMWindow(v8::Isolate*); |
+Document* currentDocument(v8::Isolate*); |
+ExecutionContext* currentExecutionContext(v8::Isolate*); |
+ |
+// Returns a V8 context associated with a ExecutionContext and a DOMWrapperWorld. |
+// This method returns an empty context if there is no frame or the frame is already detached. |
+v8::Local<v8::Context> toV8Context(ExecutionContext*, DOMWrapperWorld*); |
+// Returns a V8 context associated with a LocalFrame and a DOMWrapperWorld. |
+// This method returns an empty context if the frame is already detached. |
+v8::Local<v8::Context> toV8Context(v8::Isolate*, LocalFrame*, DOMWrapperWorld*); |
+ |
+// Returns the frame object of the window object associated with |
+// a context, if the window is currently being displayed in the LocalFrame. |
+LocalFrame* toFrameIfNotDetached(v8::Handle<v8::Context>); |
+ |
+// If the current context causes out of memory, JavaScript setting |
+// is disabled and it returns true. |
+bool handleOutOfMemory(); |
+v8::Local<v8::Value> handleMaxRecursionDepthExceeded(v8::Isolate*); |
+void crashIfV8IsDead(); |
+ |
+inline bool isUndefinedOrNull(v8::Handle<v8::Value> value) |
+{ |
+ return value->IsNull() || value->IsUndefined(); |
+} |
+v8::Handle<v8::Function> getBoundFunction(v8::Handle<v8::Function>); |
+ |
+// Attaches |environment| to |function| and returns it. |
+inline v8::Local<v8::Function> createClosure(v8::FunctionCallback function, v8::Handle<v8::Value> environment, v8::Isolate* isolate) |
+{ |
+ return v8::Function::New(isolate, function, environment); |
+} |
+ |
+// FIXME: This will be soon embedded in the generated code. |
+template<class Collection> static void indexedPropertyEnumerator(const v8::PropertyCallbackInfo<v8::Array>& info) |
+{ |
+ Collection* collection = reinterpret_cast<Collection*>(info.Holder()->GetAlignedPointerFromInternalField(v8DOMWrapperObjectIndex)); |
+ int length = collection->length(); |
+ v8::Handle<v8::Array> properties = v8::Array::New(info.GetIsolate(), length); |
+ for (int i = 0; i < length; ++i) { |
+ // FIXME: Do we need to check that the item function returns a non-null value for this index? |
+ v8::Handle<v8::Integer> integer = v8::Integer::New(info.GetIsolate(), i); |
+ properties->Set(integer, integer); |
+ } |
+ v8SetReturnValue(info, properties); |
+} |
+ |
+v8::Local<v8::Value> getHiddenValue(v8::Isolate*, v8::Handle<v8::Object>, const char*); |
+v8::Local<v8::Value> getHiddenValue(v8::Isolate*, v8::Handle<v8::Object>, v8::Handle<v8::String>); |
+bool setHiddenValue(v8::Isolate*, v8::Handle<v8::Object>, const char*, v8::Handle<v8::Value>); |
+bool setHiddenValue(v8::Isolate*, v8::Handle<v8::Object>, v8::Handle<v8::String>, v8::Handle<v8::Value>); |
+bool deleteHiddenValue(v8::Isolate*, v8::Handle<v8::Object>, const char*); |
+bool deleteHiddenValue(v8::Isolate*, v8::Handle<v8::Object>, v8::Handle<v8::String>); |
+v8::Local<v8::Value> getHiddenValueFromMainWorldWrapper(v8::Isolate*, ScriptWrappable*, const char*); |
+v8::Local<v8::Value> getHiddenValueFromMainWorldWrapper(v8::Isolate*, ScriptWrappable*, v8::Handle<v8::String>); |
+ |
+// These methods store hidden values into an array that is stored in the internal field of a DOM wrapper. |
+void addHiddenValueToArray(v8::Handle<v8::Object>, v8::Local<v8::Value>, int cacheIndex, v8::Isolate*); |
+void removeHiddenValueFromArray(v8::Handle<v8::Object>, v8::Local<v8::Value>, int cacheIndex, v8::Isolate*); |
+void moveEventListenerToNewWrapper(v8::Handle<v8::Object>, EventListener* oldValue, v8::Local<v8::Value> newValue, int cacheIndex, v8::Isolate*); |
+ |
+// Converts a DOM object to a v8 value. |
+// This is a no-inline version of toV8(). If you want to call toV8() |
+// without creating #include cycles, you can use this function instead. |
+// Each specialized implementation will be generated. |
+template<typename T> |
+v8::Handle<v8::Value> toV8NoInline(T* impl, v8::Handle<v8::Object> creationContext, v8::Isolate*); |
+ |
+// Result values for platform object 'deleter' methods, |
+// http://www.w3.org/TR/WebIDL/#delete |
+enum DeleteResult { |
+ DeleteSuccess, |
+ DeleteReject, |
+ DeleteUnknownProperty |
+}; |
+ |
+class V8IsolateInterruptor : public ThreadState::Interruptor { |
+public: |
+ explicit V8IsolateInterruptor(v8::Isolate* isolate) : m_isolate(isolate) { } |
+ |
+ static void onInterruptCallback(v8::Isolate* isolate, void* data) |
+ { |
+ reinterpret_cast<V8IsolateInterruptor*>(data)->onInterrupted(); |
+ } |
+ |
+ virtual void requestInterrupt() OVERRIDE |
+ { |
+ m_isolate->RequestInterrupt(&onInterruptCallback, this); |
+ } |
+ |
+ virtual void clearInterrupt() OVERRIDE |
+ { |
+ m_isolate->ClearInterrupt(); |
+ } |
+ |
+private: |
+ v8::Isolate* m_isolate; |
+}; |
+ |
+class V8BindingTestScope { |
+public: |
+ static PassOwnPtr<V8BindingTestScope> create(v8::Isolate*); |
+ |
+private: |
+ explicit V8BindingTestScope(v8::Isolate*); |
+ |
+ v8::HandleScope m_handleScope; |
+ v8::Handle<v8::Context> m_context; |
+ v8::Context::Scope m_contextScope; |
+ RefPtr<DOMWrapperWorld> m_world; |
+ OwnPtr<V8PerContextData> m_perContextData; |
+}; |
} // namespace WebCore |