| 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 655 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 666 NodeFilter* ToNodeFilter(v8::Local<v8::Value>, | 666 NodeFilter* ToNodeFilter(v8::Local<v8::Value>, |
| 667 v8::Local<v8::Object>, | 667 v8::Local<v8::Object>, |
| 668 ScriptState*); | 668 ScriptState*); |
| 669 XPathNSResolver* ToXPathNSResolver(ScriptState*, v8::Local<v8::Value>); | 669 XPathNSResolver* ToXPathNSResolver(ScriptState*, v8::Local<v8::Value>); |
| 670 | 670 |
| 671 bool ToV8Sequence(v8::Local<v8::Value>, | 671 bool ToV8Sequence(v8::Local<v8::Value>, |
| 672 uint32_t& length, | 672 uint32_t& length, |
| 673 v8::Isolate*, | 673 v8::Isolate*, |
| 674 ExceptionState&); | 674 ExceptionState&); |
| 675 | 675 |
| 676 template <typename T> | |
| 677 HeapVector<Member<T>> ToMemberNativeArray(v8::Local<v8::Value> value, | |
| 678 int argument_index, | |
| 679 v8::Isolate* isolate, | |
| 680 ExceptionState& exception_state) { | |
| 681 v8::Local<v8::Value> v8_value(v8::Local<v8::Value>::New(isolate, value)); | |
| 682 uint32_t length = 0; | |
| 683 if (value->IsArray()) { | |
| 684 length = v8::Local<v8::Array>::Cast(v8_value)->Length(); | |
| 685 } else if (!ToV8Sequence(value, length, isolate, exception_state)) { | |
| 686 if (!exception_state.HadException()) | |
| 687 exception_state.ThrowTypeError( | |
| 688 ExceptionMessages::NotAnArrayTypeArgumentOrValue(argument_index)); | |
| 689 return HeapVector<Member<T>>(); | |
| 690 } | |
| 691 | |
| 692 using VectorType = HeapVector<Member<T>>; | |
| 693 if (length > VectorType::MaxCapacity()) { | |
| 694 exception_state.ThrowRangeError("Array length exceeds supported limit."); | |
| 695 return VectorType(); | |
| 696 } | |
| 697 | |
| 698 VectorType result; | |
| 699 result.ReserveInitialCapacity(length); | |
| 700 v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(v8_value); | |
| 701 v8::TryCatch block(isolate); | |
| 702 for (uint32_t i = 0; i < length; ++i) { | |
| 703 v8::Local<v8::Value> element; | |
| 704 if (!V8Call(object->Get(isolate->GetCurrentContext(), i), element, block)) { | |
| 705 exception_state.RethrowV8Exception(block.Exception()); | |
| 706 return VectorType(); | |
| 707 } | |
| 708 if (V8TypeOf<T>::Type::hasInstance(element, isolate)) { | |
| 709 v8::Local<v8::Object> element_object = | |
| 710 v8::Local<v8::Object>::Cast(element); | |
| 711 result.UncheckedAppend(V8TypeOf<T>::Type::toImpl(element_object)); | |
| 712 } else { | |
| 713 exception_state.ThrowTypeError("Invalid Array element type"); | |
| 714 return VectorType(); | |
| 715 } | |
| 716 } | |
| 717 return result; | |
| 718 } | |
| 719 | |
| 720 template <typename T> | |
| 721 HeapVector<Member<T>> ToMemberNativeArray(v8::Local<v8::Value> value, | |
| 722 const String& property_name, | |
| 723 v8::Isolate* isolate, | |
| 724 ExceptionState& exception_state) { | |
| 725 v8::Local<v8::Value> v8_value(v8::Local<v8::Value>::New(isolate, value)); | |
| 726 uint32_t length = 0; | |
| 727 if (value->IsArray()) { | |
| 728 length = v8::Local<v8::Array>::Cast(v8_value)->Length(); | |
| 729 } else if (!ToV8Sequence(value, length, isolate, exception_state)) { | |
| 730 if (!exception_state.HadException()) | |
| 731 exception_state.ThrowTypeError( | |
| 732 ExceptionMessages::NotASequenceTypeProperty(property_name)); | |
| 733 return HeapVector<Member<T>>(); | |
| 734 } | |
| 735 | |
| 736 using VectorType = HeapVector<Member<T>>; | |
| 737 if (length > VectorType::MaxCapacity()) { | |
| 738 exception_state.ThrowRangeError("Array length exceeds supported limit."); | |
| 739 return VectorType(); | |
| 740 } | |
| 741 | |
| 742 VectorType result; | |
| 743 result.ReserveInitialCapacity(length); | |
| 744 v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(v8_value); | |
| 745 v8::TryCatch block(isolate); | |
| 746 for (uint32_t i = 0; i < length; ++i) { | |
| 747 v8::Local<v8::Value> element; | |
| 748 if (!V8Call(object->Get(isolate->GetCurrentContext(), i), element, block)) { | |
| 749 exception_state.RethrowV8Exception(block.Exception()); | |
| 750 return VectorType(); | |
| 751 } | |
| 752 if (V8TypeOf<T>::Type::hasInstance(element, isolate)) { | |
| 753 v8::Local<v8::Object> element_object = | |
| 754 v8::Local<v8::Object>::Cast(element); | |
| 755 result.UncheckedAppend(V8TypeOf<T>::Type::toImpl(element_object)); | |
| 756 } else { | |
| 757 exception_state.ThrowTypeError("Invalid Array element type"); | |
| 758 return VectorType(); | |
| 759 } | |
| 760 } | |
| 761 return result; | |
| 762 } | |
| 763 | |
| 764 // Converts a JavaScript value to an array as per the Web IDL specification: | |
| 765 // http://www.w3.org/TR/2012/CR-WebIDL-20120419/#es-array | |
| 766 template <typename VectorType, | |
| 767 typename ValueType = typename VectorType::ValueType> | |
| 768 VectorType ToImplArray(v8::Local<v8::Value> value, | |
| 769 int argument_index, | |
| 770 v8::Isolate* isolate, | |
| 771 ExceptionState& exception_state) { | |
| 772 typedef NativeValueTraits<ValueType> TraitsType; | |
| 773 | |
| 774 uint32_t length = 0; | |
| 775 if (value->IsArray()) { | |
| 776 length = v8::Local<v8::Array>::Cast(value)->Length(); | |
| 777 } else if (!ToV8Sequence(value, length, isolate, exception_state)) { | |
| 778 if (!exception_state.HadException()) | |
| 779 exception_state.ThrowTypeError( | |
| 780 ExceptionMessages::NotAnArrayTypeArgumentOrValue(argument_index)); | |
| 781 return VectorType(); | |
| 782 } | |
| 783 | |
| 784 if (length > VectorType::MaxCapacity()) { | |
| 785 exception_state.ThrowRangeError("Array length exceeds supported limit."); | |
| 786 return VectorType(); | |
| 787 } | |
| 788 | |
| 789 VectorType result; | |
| 790 result.ReserveInitialCapacity(length); | |
| 791 v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(value); | |
| 792 v8::TryCatch block(isolate); | |
| 793 for (uint32_t i = 0; i < length; ++i) { | |
| 794 v8::Local<v8::Value> element; | |
| 795 if (!V8Call(object->Get(isolate->GetCurrentContext(), i), element, block)) { | |
| 796 exception_state.RethrowV8Exception(block.Exception()); | |
| 797 return VectorType(); | |
| 798 } | |
| 799 result.UncheckedAppend( | |
| 800 TraitsType::NativeValue(isolate, element, exception_state)); | |
| 801 if (exception_state.HadException()) | |
| 802 return VectorType(); | |
| 803 } | |
| 804 return result; | |
| 805 } | |
| 806 | |
| 807 template <typename VectorType> | |
| 808 VectorType ToImplArray(const Vector<ScriptValue>& value, | |
| 809 v8::Isolate* isolate, | |
| 810 ExceptionState& exception_state) { | |
| 811 using ValueType = typename VectorType::ValueType; | |
| 812 using TraitsType = NativeValueTraits<ValueType>; | |
| 813 | |
| 814 if (value.size() > VectorType::MaxCapacity()) { | |
| 815 exception_state.ThrowRangeError("Array length exceeds supported limit."); | |
| 816 return VectorType(); | |
| 817 } | |
| 818 | |
| 819 VectorType result; | |
| 820 result.ReserveInitialCapacity(value.size()); | |
| 821 for (unsigned i = 0; i < value.size(); ++i) { | |
| 822 result.UncheckedAppend( | |
| 823 TraitsType::NativeValue(isolate, value[i].V8Value(), exception_state)); | |
| 824 if (exception_state.HadException()) | |
| 825 return VectorType(); | |
| 826 } | |
| 827 return result; | |
| 828 } | |
| 829 | |
| 830 template <typename VectorType> | 676 template <typename VectorType> |
| 831 VectorType ToImplArguments(const v8::FunctionCallbackInfo<v8::Value>& info, | 677 VectorType ToImplArguments(const v8::FunctionCallbackInfo<v8::Value>& info, |
| 832 int start_index, | 678 int start_index, |
| 833 ExceptionState& exception_state) { | 679 ExceptionState& exception_state) { |
| 834 using ValueType = typename VectorType::ValueType; | 680 using ValueType = typename VectorType::ValueType; |
| 835 using TraitsType = NativeValueTraits<ValueType>; | 681 using TraitsType = NativeValueTraits<ValueType>; |
| 836 | 682 |
| 837 int length = info.Length(); | 683 int length = info.Length(); |
| 838 VectorType result; | 684 VectorType result; |
| 839 if (start_index < length) { | 685 if (start_index < length) { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 850 } | 696 } |
| 851 } | 697 } |
| 852 return result; | 698 return result; |
| 853 } | 699 } |
| 854 | 700 |
| 855 // Gets an iterator from an Object. | 701 // Gets an iterator from an Object. |
| 856 CORE_EXPORT v8::Local<v8::Object> GetEsIterator(v8::Isolate*, | 702 CORE_EXPORT v8::Local<v8::Object> GetEsIterator(v8::Isolate*, |
| 857 v8::Local<v8::Object>, | 703 v8::Local<v8::Object>, |
| 858 ExceptionState&); | 704 ExceptionState&); |
| 859 | 705 |
| 860 // Validates that the passed object is a sequence type per WebIDL spec | 706 // Validates that the passed object is a sequence type per the WebIDL spec: it |
| 861 // http://www.w3.org/TR/2012/CR-WebIDL-20120419/#es-sequence | 707 // has a callable @iterator. |
| 862 inline bool ToV8Sequence(v8::Local<v8::Value> value, | 708 // https://heycam.github.io/webidl/#es-sequence |
| 863 uint32_t& length, | 709 CORE_EXPORT bool IsV8Sequence(v8::Isolate*, |
| 864 v8::Isolate* isolate, | 710 v8::Local<v8::Value>, |
| 865 ExceptionState& exception_state) { | 711 ExceptionState&); |
| 866 // Attempt converting to a sequence if the value is not already an array but | |
| 867 // is any kind of object except for a native Date object or a native RegExp | |
| 868 // object. | |
| 869 ASSERT(!value->IsArray()); | |
| 870 // FIXME: Do we really need to special case Date and RegExp object? | |
| 871 // https://www.w3.org/Bugs/Public/show_bug.cgi?id=22806 | |
| 872 if (!value->IsObject() || value->IsDate() || value->IsRegExp()) { | |
| 873 // The caller is responsible for reporting a TypeError. | |
| 874 return false; | |
| 875 } | |
| 876 | |
| 877 v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(value); | |
| 878 v8::Local<v8::String> length_symbol = V8AtomicString(isolate, "length"); | |
| 879 | |
| 880 // FIXME: The specification states that the length property should be used as | |
| 881 // fallback, if value is not a platform object that supports indexed | |
| 882 // properties. If it supports indexed properties, length should actually be | |
| 883 // one greater than value's maximum indexed property index. | |
| 884 v8::TryCatch block(isolate); | |
| 885 v8::Local<v8::Value> length_value; | |
| 886 if (!V8Call(object->Get(isolate->GetCurrentContext(), length_symbol), | |
| 887 length_value, block)) { | |
| 888 exception_state.RethrowV8Exception(block.Exception()); | |
| 889 return false; | |
| 890 } | |
| 891 | |
| 892 if (length_value->IsUndefined() || length_value->IsNull()) { | |
| 893 // The caller is responsible for reporting a TypeError. | |
| 894 return false; | |
| 895 } | |
| 896 | |
| 897 uint32_t sequence_length; | |
| 898 if (!V8Call(length_value->Uint32Value(isolate->GetCurrentContext()), | |
| 899 sequence_length, block)) { | |
| 900 exception_state.RethrowV8Exception(block.Exception()); | |
| 901 return false; | |
| 902 } | |
| 903 | |
| 904 length = sequence_length; | |
| 905 return true; | |
| 906 } | |
| 907 | 712 |
| 908 // TODO(rakuco): remove the specializations below (and consequently the | 713 // TODO(rakuco): remove the specializations below (and consequently the |
| 909 // non-IDLBase version of NativeValueTraitsBase) once we manage to convert all | 714 // non-IDLBase version of NativeValueTraitsBase) once we manage to convert all |
| 910 // uses of NativeValueTraits to types that derive from IDLBase or for generated | 715 // uses of NativeValueTraits to types that derive from IDLBase or for generated |
| 911 // IDL interfaces/dictionaries/unions. | 716 // IDL interfaces/dictionaries/unions. |
| 912 template <> | 717 template <> |
| 913 struct NativeValueTraits<String> { | 718 struct NativeValueTraits<String> { |
| 914 static inline String NativeValue(v8::Isolate* isolate, | 719 static inline String NativeValue(v8::Isolate* isolate, |
| 915 v8::Local<v8::Value> value, | 720 v8::Local<v8::Value> value, |
| 916 ExceptionState& exception_state) { | 721 ExceptionState& exception_state) { |
| 917 V8StringResource<> string_value(value); | 722 V8StringResource<> string_value(value); |
| 918 if (!string_value.Prepare(exception_state)) | 723 if (!string_value.Prepare(exception_state)) |
| 919 return String(); | 724 return String(); |
| 920 return string_value; | 725 return string_value; |
| 921 } | 726 } |
| 922 }; | 727 }; |
| 923 | 728 |
| 924 template <> | 729 template <> |
| 925 struct NativeValueTraits<AtomicString> { | 730 struct NativeValueTraits<v8::Local<v8::Value>> |
| 926 static inline AtomicString NativeValue(v8::Isolate* isolate, | 731 : public NativeValueTraitsBase<v8::Local<v8::Value>> { |
| 927 v8::Local<v8::Value> value, | |
| 928 ExceptionState& exception_state) { | |
| 929 V8StringResource<> string_value(value); | |
| 930 if (!string_value.Prepare(exception_state)) | |
| 931 return AtomicString(); | |
| 932 return string_value; | |
| 933 } | |
| 934 }; | |
| 935 | |
| 936 template <> | |
| 937 struct NativeValueTraits<int> { | |
| 938 static inline int NativeValue(v8::Isolate* isolate, | |
| 939 v8::Local<v8::Value> value, | |
| 940 ExceptionState& exception_state) { | |
| 941 return ToInt32(isolate, value, kNormalConversion, exception_state); | |
| 942 } | |
| 943 }; | |
| 944 | |
| 945 template <> | |
| 946 struct NativeValueTraits<unsigned> { | |
| 947 static inline unsigned NativeValue(v8::Isolate* isolate, | |
| 948 v8::Local<v8::Value> value, | |
| 949 ExceptionState& exception_state) { | |
| 950 return ToUInt32(isolate, value, kNormalConversion, exception_state); | |
| 951 } | |
| 952 }; | |
| 953 | |
| 954 template <> | |
| 955 struct NativeValueTraits<float> { | |
| 956 static inline float NativeValue(v8::Isolate* isolate, | |
| 957 v8::Local<v8::Value> value, | |
| 958 ExceptionState& exception_state) { | |
| 959 return ToFloat(isolate, value, exception_state); | |
| 960 } | |
| 961 }; | |
| 962 | |
| 963 template <> | |
| 964 struct NativeValueTraits<double> { | |
| 965 static inline double NativeValue(v8::Isolate* isolate, | |
| 966 v8::Local<v8::Value> value, | |
| 967 ExceptionState& exception_state) { | |
| 968 return ToDouble(isolate, value, exception_state); | |
| 969 } | |
| 970 }; | |
| 971 | |
| 972 template <> | |
| 973 struct NativeValueTraits<v8::Local<v8::Value>> { | |
| 974 static inline v8::Local<v8::Value> NativeValue( | 732 static inline v8::Local<v8::Value> NativeValue( |
| 975 v8::Isolate* isolate, | 733 v8::Isolate* isolate, |
| 976 v8::Local<v8::Value> value, | 734 v8::Local<v8::Value> value, |
| 977 ExceptionState& exception_state) { | 735 ExceptionState& exception_state) { |
| 978 return value; | 736 return value; |
| 979 } | 737 } |
| 980 }; | 738 }; |
| 981 | 739 |
| 982 template <> | |
| 983 struct NativeValueTraits<ScriptValue> { | |
| 984 static inline ScriptValue NativeValue(v8::Isolate* isolate, | |
| 985 v8::Local<v8::Value> value, | |
| 986 ExceptionState& exception_state) { | |
| 987 return ScriptValue(ScriptState::Current(isolate), value); | |
| 988 } | |
| 989 }; | |
| 990 | |
| 991 template <typename T> | |
| 992 struct NativeValueTraits<Vector<T>> { | |
| 993 static inline Vector<T> NativeValue(v8::Isolate* isolate, | |
| 994 v8::Local<v8::Value> value, | |
| 995 ExceptionState& exception_state) { | |
| 996 return ToImplArray<Vector<T>>(value, 0, isolate, exception_state); | |
| 997 } | |
| 998 }; | |
| 999 | |
| 1000 CORE_EXPORT v8::Isolate* ToIsolate(ExecutionContext*); | 740 CORE_EXPORT v8::Isolate* ToIsolate(ExecutionContext*); |
| 1001 CORE_EXPORT v8::Isolate* ToIsolate(LocalFrame*); | 741 CORE_EXPORT v8::Isolate* ToIsolate(LocalFrame*); |
| 1002 | 742 |
| 1003 CORE_EXPORT DOMWindow* ToDOMWindow(v8::Isolate*, v8::Local<v8::Value>); | 743 CORE_EXPORT DOMWindow* ToDOMWindow(v8::Isolate*, v8::Local<v8::Value>); |
| 1004 LocalDOMWindow* ToLocalDOMWindow(v8::Local<v8::Context>); | 744 LocalDOMWindow* ToLocalDOMWindow(v8::Local<v8::Context>); |
| 1005 LocalDOMWindow* EnteredDOMWindow(v8::Isolate*); | 745 LocalDOMWindow* EnteredDOMWindow(v8::Isolate*); |
| 1006 CORE_EXPORT LocalDOMWindow* CurrentDOMWindow(v8::Isolate*); | 746 CORE_EXPORT LocalDOMWindow* CurrentDOMWindow(v8::Isolate*); |
| 1007 CORE_EXPORT ExecutionContext* ToExecutionContext(v8::Local<v8::Context>); | 747 CORE_EXPORT ExecutionContext* ToExecutionContext(v8::Local<v8::Context>); |
| 1008 CORE_EXPORT void RegisterToExecutionContextForModules(ExecutionContext* ( | 748 CORE_EXPORT void RegisterToExecutionContextForModules(ExecutionContext* ( |
| 1009 *to_execution_context_for_modules)(v8::Local<v8::Context>)); | 749 *to_execution_context_for_modules)(v8::Local<v8::Context>)); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1034 CORE_EXPORT LocalFrame* ToLocalFrameIfNotDetached(v8::Local<v8::Context>); | 774 CORE_EXPORT LocalFrame* ToLocalFrameIfNotDetached(v8::Local<v8::Context>); |
| 1035 | 775 |
| 1036 // If 'storage' is non-null, it must be large enough to copy all bytes in the | 776 // If 'storage' is non-null, it must be large enough to copy all bytes in the |
| 1037 // array buffer view into it. Use allocateFlexibleArrayBufferStorage(v8Value) | 777 // array buffer view into it. Use allocateFlexibleArrayBufferStorage(v8Value) |
| 1038 // to allocate it using alloca() in the callers stack frame. | 778 // to allocate it using alloca() in the callers stack frame. |
| 1039 CORE_EXPORT void ToFlexibleArrayBufferView(v8::Isolate*, | 779 CORE_EXPORT void ToFlexibleArrayBufferView(v8::Isolate*, |
| 1040 v8::Local<v8::Value>, | 780 v8::Local<v8::Value>, |
| 1041 FlexibleArrayBufferView&, | 781 FlexibleArrayBufferView&, |
| 1042 void* storage = nullptr); | 782 void* storage = nullptr); |
| 1043 | 783 |
| 1044 // Converts a V8 value to an array (an IDL sequence) as per the WebIDL | |
| 1045 // specification: http://heycam.github.io/webidl/#es-sequence | |
| 1046 template <typename VectorType> | |
| 1047 VectorType ToImplSequence(v8::Isolate* isolate, | |
| 1048 v8::Local<v8::Value> value, | |
| 1049 ExceptionState& exception_state) { | |
| 1050 using ValueType = typename VectorType::ValueType; | |
| 1051 | |
| 1052 if (!value->IsObject() || value->IsRegExp()) { | |
| 1053 exception_state.ThrowTypeError( | |
| 1054 "The provided value cannot be converted to a sequence."); | |
| 1055 return VectorType(); | |
| 1056 } | |
| 1057 | |
| 1058 v8::TryCatch block(isolate); | |
| 1059 v8::Local<v8::Object> iterator = | |
| 1060 GetEsIterator(isolate, value.As<v8::Object>(), exception_state); | |
| 1061 if (exception_state.HadException()) | |
| 1062 return VectorType(); | |
| 1063 | |
| 1064 v8::Local<v8::String> next_key = V8String(isolate, "next"); | |
| 1065 v8::Local<v8::String> value_key = V8String(isolate, "value"); | |
| 1066 v8::Local<v8::String> done_key = V8String(isolate, "done"); | |
| 1067 v8::Local<v8::Context> context = isolate->GetCurrentContext(); | |
| 1068 VectorType result; | |
| 1069 while (true) { | |
| 1070 v8::Local<v8::Value> next; | |
| 1071 if (!iterator->Get(context, next_key).ToLocal(&next)) { | |
| 1072 exception_state.RethrowV8Exception(block.Exception()); | |
| 1073 return VectorType(); | |
| 1074 } | |
| 1075 // TODO(bashi): Support callable objects. | |
| 1076 if (!next->IsObject() || !next.As<v8::Object>()->IsFunction()) { | |
| 1077 exception_state.ThrowTypeError("Iterator.next should be callable."); | |
| 1078 return VectorType(); | |
| 1079 } | |
| 1080 v8::Local<v8::Value> next_result; | |
| 1081 if (!V8ScriptRunner::CallFunction(next.As<v8::Function>(), | |
| 1082 ToExecutionContext(context), iterator, 0, | |
| 1083 nullptr, isolate) | |
| 1084 .ToLocal(&next_result)) { | |
| 1085 exception_state.RethrowV8Exception(block.Exception()); | |
| 1086 return VectorType(); | |
| 1087 } | |
| 1088 if (!next_result->IsObject()) { | |
| 1089 exception_state.ThrowTypeError( | |
| 1090 "Iterator.next() did not return an object."); | |
| 1091 return VectorType(); | |
| 1092 } | |
| 1093 v8::Local<v8::Object> result_object = next_result.As<v8::Object>(); | |
| 1094 v8::Local<v8::Value> element; | |
| 1095 v8::Local<v8::Value> done; | |
| 1096 if (!result_object->Get(context, value_key).ToLocal(&element) || | |
| 1097 !result_object->Get(context, done_key).ToLocal(&done)) { | |
| 1098 exception_state.RethrowV8Exception(block.Exception()); | |
| 1099 return VectorType(); | |
| 1100 } | |
| 1101 v8::Local<v8::Boolean> done_boolean; | |
| 1102 if (!done->ToBoolean(context).ToLocal(&done_boolean)) { | |
| 1103 exception_state.RethrowV8Exception(block.Exception()); | |
| 1104 return VectorType(); | |
| 1105 } | |
| 1106 if (done_boolean->Value()) | |
| 1107 break; | |
| 1108 result.push_back(NativeValueTraits<ValueType>::NativeValue( | |
| 1109 isolate, element, exception_state)); | |
| 1110 } | |
| 1111 return result; | |
| 1112 } | |
| 1113 | |
| 1114 // If the current context causes out of memory, JavaScript setting | 784 // If the current context causes out of memory, JavaScript setting |
| 1115 // is disabled and it returns true. | 785 // is disabled and it returns true. |
| 1116 bool HandleOutOfMemory(); | 786 bool HandleOutOfMemory(); |
| 1117 | 787 |
| 1118 inline bool IsUndefinedOrNull(v8::Local<v8::Value> value) { | 788 inline bool IsUndefinedOrNull(v8::Local<v8::Value> value) { |
| 1119 return value.IsEmpty() || value->IsNull() || value->IsUndefined(); | 789 return value.IsEmpty() || value->IsNull() || value->IsUndefined(); |
| 1120 } | 790 } |
| 1121 v8::Local<v8::Function> GetBoundFunction(v8::Local<v8::Function>); | 791 v8::Local<v8::Function> GetBoundFunction(v8::Local<v8::Function>); |
| 1122 | 792 |
| 1123 // FIXME: This will be soon embedded in the generated code. | 793 // FIXME: This will be soon embedded in the generated code. |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1192 exception_state.ThrowTypeError( | 862 exception_state.ThrowTypeError( |
| 1193 "The provided ArrayBufferView value must not be shared."); | 863 "The provided ArrayBufferView value must not be shared."); |
| 1194 return NotSharedType(); | 864 return NotSharedType(); |
| 1195 } | 865 } |
| 1196 return NotSharedType(dom_typed_array); | 866 return NotSharedType(dom_typed_array); |
| 1197 } | 867 } |
| 1198 | 868 |
| 1199 } // namespace blink | 869 } // namespace blink |
| 1200 | 870 |
| 1201 #endif // V8Binding_h | 871 #endif // V8Binding_h |
| OLD | NEW |