| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2009 Google Inc. All rights reserved. | 2 * Copyright (C) 2009 Google Inc. All rights reserved. |
| 3 * Copyright (C) 2012 Ericsson AB. All rights reserved. | 3 * Copyright (C) 2012 Ericsson AB. All rights reserved. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions are | 6 * modification, are permitted provided that the following conditions are |
| 7 * met: | 7 * met: |
| 8 * | 8 * |
| 9 * * Redistributions of source code must retain the above copyright | 9 * * Redistributions of source code must retain the above copyright |
| 10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
| (...skipping 734 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 745 } else { | 745 } else { |
| 746 exceptionState.throwTypeError("Invalid Array element type"); | 746 exceptionState.throwTypeError("Invalid Array element type"); |
| 747 return HeapVector<Member<T>>(); | 747 return HeapVector<Member<T>>(); |
| 748 } | 748 } |
| 749 } | 749 } |
| 750 return result; | 750 return result; |
| 751 } | 751 } |
| 752 | 752 |
| 753 // Converts a JavaScript value to an array as per the Web IDL specification: | 753 // Converts a JavaScript value to an array as per the Web IDL specification: |
| 754 // http://www.w3.org/TR/2012/CR-WebIDL-20120419/#es-array | 754 // http://www.w3.org/TR/2012/CR-WebIDL-20120419/#es-array |
| 755 template <typename T> | 755 template <typename VectorType> |
| 756 Vector<T> toImplArray(v8::Local<v8::Value> value, int argumentIndex, v8::Isolate
* isolate, ExceptionState& exceptionState) | 756 VectorType toImplArray(v8::Local<v8::Value> value, int argumentIndex, v8::Isolat
e* isolate, ExceptionState& exceptionState) |
| 757 { | 757 { |
| 758 typedef typename VectorType::ValueType ValueType; |
| 759 typedef NativeValueTraits<ValueType> TraitsType; |
| 760 |
| 758 uint32_t length = 0; | 761 uint32_t length = 0; |
| 759 if (value->IsArray()) { | 762 if (value->IsArray()) { |
| 760 length = v8::Local<v8::Array>::Cast(value)->Length(); | 763 length = v8::Local<v8::Array>::Cast(value)->Length(); |
| 761 } else if (!toV8Sequence(value, length, isolate, exceptionState)) { | 764 } else if (!toV8Sequence(value, length, isolate, exceptionState)) { |
| 762 if (!exceptionState.hadException()) | 765 if (!exceptionState.hadException()) |
| 763 exceptionState.throwTypeError(ExceptionMessages::notAnArrayTypeArgum
entOrValue(argumentIndex)); | 766 exceptionState.throwTypeError(ExceptionMessages::notAnArrayTypeArgum
entOrValue(argumentIndex)); |
| 764 return Vector<T>(); | 767 return VectorType(); |
| 765 } | 768 } |
| 766 | 769 |
| 767 if (length > WTF::DefaultAllocatorQuantizer::kMaxUnquantizedAllocation / siz
eof(T)) { | 770 if (length > WTF::DefaultAllocatorQuantizer::kMaxUnquantizedAllocation / siz
eof(ValueType)) { |
| 768 exceptionState.throwTypeError("Array length exceeds supported limit."); | 771 exceptionState.throwTypeError("Array length exceeds supported limit."); |
| 769 return Vector<T>(); | 772 return VectorType(); |
| 770 } | 773 } |
| 771 | 774 |
| 772 Vector<T> result; | 775 VectorType result; |
| 773 result.reserveInitialCapacity(length); | 776 result.reserveInitialCapacity(length); |
| 774 typedef NativeValueTraits<T> TraitsType; | |
| 775 v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(value); | 777 v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(value); |
| 776 v8::TryCatch block; | 778 v8::TryCatch block; |
| 777 for (uint32_t i = 0; i < length; ++i) { | 779 for (uint32_t i = 0; i < length; ++i) { |
| 778 v8::Local<v8::Value> element; | 780 v8::Local<v8::Value> element; |
| 779 if (!v8Call(object->Get(isolate->GetCurrentContext(), i), element, block
)) { | 781 if (!v8Call(object->Get(isolate->GetCurrentContext(), i), element, block
)) { |
| 780 exceptionState.rethrowV8Exception(block.Exception()); | 782 exceptionState.rethrowV8Exception(block.Exception()); |
| 781 return Vector<T>(); | 783 return VectorType(); |
| 782 } | 784 } |
| 783 result.uncheckedAppend(TraitsType::nativeValue(isolate, element, excepti
onState)); | 785 result.uncheckedAppend(TraitsType::nativeValue(isolate, element, excepti
onState)); |
| 784 if (exceptionState.hadException()) | 786 if (exceptionState.hadException()) |
| 785 return Vector<T>(); | 787 return VectorType(); |
| 786 } | 788 } |
| 787 return result; | 789 return result; |
| 788 } | 790 } |
| 789 | 791 |
| 790 template <typename T> | 792 template <typename VectorType> |
| 791 HeapVector<T> toImplHeapArray(v8::Local<v8::Value> value, int argumentIndex, v8:
:Isolate* isolate, ExceptionState& exceptionState) | 793 VectorType toImplArray(const Vector<ScriptValue>& value, v8::Isolate* isolate, E
xceptionState& exceptionState) |
| 792 { | 794 { |
| 793 uint32_t length = 0; | 795 VectorType result; |
| 794 if (value->IsArray()) { | 796 typedef typename VectorType::ValueType ValueType; |
| 795 length = v8::Local<v8::Array>::Cast(value)->Length(); | 797 typedef NativeValueTraits<ValueType> TraitsType; |
| 796 } else if (!toV8Sequence(value, length, isolate, exceptionState)) { | 798 result.reserveInitialCapacity(value.size()); |
| 797 if (!exceptionState.hadException()) | 799 for (unsigned i = 0; i < value.size(); ++i) { |
| 798 exceptionState.throwTypeError(ExceptionMessages::notAnArrayTypeArgum
entOrValue(argumentIndex)); | 800 result.uncheckedAppend(TraitsType::nativeValue(isolate, value[i].v8Value
(), exceptionState)); |
| 799 return HeapVector<T>(); | |
| 800 } | |
| 801 | |
| 802 if (length > WTF::DefaultAllocatorQuantizer::kMaxUnquantizedAllocation / siz
eof(T)) { | |
| 803 exceptionState.throwTypeError("Array length exceeds supported limit."); | |
| 804 return HeapVector<T>(); | |
| 805 } | |
| 806 | |
| 807 HeapVector<T> result; | |
| 808 result.reserveInitialCapacity(length); | |
| 809 typedef NativeValueTraits<T> TraitsType; | |
| 810 v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(value); | |
| 811 v8::TryCatch block; | |
| 812 for (uint32_t i = 0; i < length; ++i) { | |
| 813 v8::Local<v8::Value> element; | |
| 814 if (!v8Call(object->Get(isolate->GetCurrentContext(), i), element, block
)) { | |
| 815 exceptionState.rethrowV8Exception(block.Exception()); | |
| 816 return HeapVector<T>(); | |
| 817 } | |
| 818 result.uncheckedAppend(TraitsType::nativeValue(isolate, element, excepti
onState)); | |
| 819 if (exceptionState.hadException()) | 801 if (exceptionState.hadException()) |
| 820 return HeapVector<T>(); | 802 return VectorType(); |
| 821 } | 803 } |
| 822 return result; | 804 return result; |
| 823 } | 805 } |
| 824 | |
| 825 template <typename T> | |
| 826 Vector<T> toImplArray(const Vector<ScriptValue>& value, v8::Isolate* isolate, Ex
ceptionState& exceptionState) | |
| 827 { | |
| 828 Vector<T> result; | |
| 829 result.reserveInitialCapacity(value.size()); | |
| 830 for (unsigned i = 0; i < value.size(); ++i) { | |
| 831 result.uncheckedAppend(NativeValueTraits<T>::nativeValue(isolate, value[
i].v8Value(), exceptionState)); | |
| 832 if (exceptionState.hadException()) | |
| 833 return Vector<T>(); | |
| 834 } | |
| 835 return result; | |
| 836 } | |
| 837 | 806 |
| 838 template <typename T> | 807 template <typename T> |
| 839 Vector<T> toImplArguments(const v8::FunctionCallbackInfo<v8::Value>& info, int s
tartIndex, ExceptionState& exceptionState) | 808 Vector<T> toImplArguments(const v8::FunctionCallbackInfo<v8::Value>& info, int s
tartIndex, ExceptionState& exceptionState) |
| 840 { | 809 { |
| 841 Vector<T> result; | 810 Vector<T> result; |
| 842 typedef NativeValueTraits<T> TraitsType; | 811 typedef NativeValueTraits<T> TraitsType; |
| 843 int length = info.Length(); | 812 int length = info.Length(); |
| 844 if (startIndex < length) { | 813 if (startIndex < length) { |
| 845 result.reserveInitialCapacity(length - startIndex); | 814 result.reserveInitialCapacity(length - startIndex); |
| 846 for (int i = startIndex; i < length; ++i) { | 815 for (int i = startIndex; i < length; ++i) { |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 951 static inline ScriptValue nativeValue(v8::Isolate* isolate, v8::Local<v8::Va
lue> value, ExceptionState& exceptionState) | 920 static inline ScriptValue nativeValue(v8::Isolate* isolate, v8::Local<v8::Va
lue> value, ExceptionState& exceptionState) |
| 952 { | 921 { |
| 953 return ScriptValue(ScriptState::current(isolate), value); | 922 return ScriptValue(ScriptState::current(isolate), value); |
| 954 } | 923 } |
| 955 }; | 924 }; |
| 956 | 925 |
| 957 template <typename T> | 926 template <typename T> |
| 958 struct NativeValueTraits<Vector<T>> { | 927 struct NativeValueTraits<Vector<T>> { |
| 959 static inline Vector<T> nativeValue(v8::Isolate* isolate, v8::Local<v8::Valu
e> value, ExceptionState& exceptionState) | 928 static inline Vector<T> nativeValue(v8::Isolate* isolate, v8::Local<v8::Valu
e> value, ExceptionState& exceptionState) |
| 960 { | 929 { |
| 961 return toImplArray<T>(value, 0, isolate, exceptionState); | 930 return toImplArray<Vector<T>>(value, 0, isolate, exceptionState); |
| 962 } | 931 } |
| 963 }; | 932 }; |
| 964 | 933 |
| 965 using JSONValuePtr = PassRefPtr<JSONValue>; | 934 using JSONValuePtr = PassRefPtr<JSONValue>; |
| 966 template <> | 935 template <> |
| 967 struct NativeValueTraits<JSONValuePtr> { | 936 struct NativeValueTraits<JSONValuePtr> { |
| 968 CORE_EXPORT static JSONValuePtr nativeValue(v8::Isolate*, v8::Local<v8::Valu
e>, ExceptionState&, int maxDepth = JSONValue::maxDepth); | 937 CORE_EXPORT static JSONValuePtr nativeValue(v8::Isolate*, v8::Local<v8::Valu
e>, ExceptionState&, int maxDepth = JSONValue::maxDepth); |
| 969 }; | 938 }; |
| 970 | 939 |
| 971 CORE_EXPORT v8::Isolate* toIsolate(ExecutionContext*); | 940 CORE_EXPORT v8::Isolate* toIsolate(ExecutionContext*); |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1095 PassRefPtr<TraceEvent::ConvertableToTraceFormat> devToolsTraceEventData(v8::Isol
ate*, ExecutionContext*, v8::Local<v8::Function>); | 1064 PassRefPtr<TraceEvent::ConvertableToTraceFormat> devToolsTraceEventData(v8::Isol
ate*, ExecutionContext*, v8::Local<v8::Function>); |
| 1096 | 1065 |
| 1097 // Callback functions used by generated code. | 1066 // Callback functions used by generated code. |
| 1098 CORE_EXPORT void v8ConstructorAttributeGetter(v8::Local<v8::Name> propertyName,
const v8::PropertyCallbackInfo<v8::Value>&); | 1067 CORE_EXPORT void v8ConstructorAttributeGetter(v8::Local<v8::Name> propertyName,
const v8::PropertyCallbackInfo<v8::Value>&); |
| 1099 | 1068 |
| 1100 typedef void (*InstallTemplateFunction)(v8::Local<v8::FunctionTemplate>, v8::Iso
late*); | 1069 typedef void (*InstallTemplateFunction)(v8::Local<v8::FunctionTemplate>, v8::Iso
late*); |
| 1101 | 1070 |
| 1102 } // namespace blink | 1071 } // namespace blink |
| 1103 | 1072 |
| 1104 #endif // V8Binding_h | 1073 #endif // V8Binding_h |
| OLD | NEW |