| 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 574 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 585 return std::numeric_limits<double>::quiet_NaN(); | 585 return std::numeric_limits<double>::quiet_NaN(); |
| 586 } | 586 } |
| 587 | 587 |
| 588 inline v8::MaybeLocal<v8::Value> v8DateOrNaN(v8::Isolate* isolate, double value) | 588 inline v8::MaybeLocal<v8::Value> v8DateOrNaN(v8::Isolate* isolate, double value) |
| 589 { | 589 { |
| 590 ASSERT(isolate); | 590 ASSERT(isolate); |
| 591 return v8::Date::New(isolate->GetCurrentContext(), std::isfinite(value) ? va
lue : std::numeric_limits<double>::quiet_NaN()); | 591 return v8::Date::New(isolate->GetCurrentContext(), std::isfinite(value) ? va
lue : std::numeric_limits<double>::quiet_NaN()); |
| 592 } | 592 } |
| 593 | 593 |
| 594 // FIXME: Remove the special casing for NodeFilter and XPathNSResolver. | 594 // FIXME: Remove the special casing for NodeFilter and XPathNSResolver. |
| 595 PassRefPtrWillBeRawPtr<NodeFilter> toNodeFilter(v8::Local<v8::Value>, v8::Local<
v8::Object>, ScriptState*); | 595 RawPtr<NodeFilter> toNodeFilter(v8::Local<v8::Value>, v8::Local<v8::Object>, Scr
iptState*); |
| 596 XPathNSResolver* toXPathNSResolver(ScriptState*, v8::Local<v8::Value>); | 596 XPathNSResolver* toXPathNSResolver(ScriptState*, v8::Local<v8::Value>); |
| 597 | 597 |
| 598 bool toV8Sequence(v8::Local<v8::Value>, uint32_t& length, v8::Isolate*, Exceptio
nState&); | 598 bool toV8Sequence(v8::Local<v8::Value>, uint32_t& length, v8::Isolate*, Exceptio
nState&); |
| 599 | 599 |
| 600 // Converts a JavaScript value to an array as per the Web IDL specification: | 600 // Converts a JavaScript value to an array as per the Web IDL specification: |
| 601 // http://www.w3.org/TR/2012/CR-WebIDL-20120419/#es-array | 601 // http://www.w3.org/TR/2012/CR-WebIDL-20120419/#es-array |
| 602 template <typename T, typename V8T> | 602 template <typename T, typename V8T> |
| 603 Vector<RefPtr<T>> toRefPtrNativeArrayUnchecked(v8::Local<v8::Value> v8Value, uin
t32_t length, v8::Isolate* isolate, ExceptionState& exceptionState) | 603 Vector<RefPtr<T>> toRefPtrNativeArrayUnchecked(v8::Local<v8::Value> v8Value, uin
t32_t length, v8::Isolate* isolate, ExceptionState& exceptionState) |
| 604 { | 604 { |
| 605 Vector<RefPtr<T>> result; | 605 Vector<RefPtr<T>> result; |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 647 length = v8::Local<v8::Array>::Cast(v8Value)->Length(); | 647 length = v8::Local<v8::Array>::Cast(v8Value)->Length(); |
| 648 } else if (!toV8Sequence(value, length, isolate, exceptionState)) { | 648 } else if (!toV8Sequence(value, length, isolate, exceptionState)) { |
| 649 if (!exceptionState.hadException()) | 649 if (!exceptionState.hadException()) |
| 650 exceptionState.throwTypeError(ExceptionMessages::notASequenceTypePro
perty(propertyName)); | 650 exceptionState.throwTypeError(ExceptionMessages::notASequenceTypePro
perty(propertyName)); |
| 651 return Vector<RefPtr<T>>(); | 651 return Vector<RefPtr<T>>(); |
| 652 } | 652 } |
| 653 return toRefPtrNativeArrayUnchecked<T, V8T>(v8Value, length, isolate, except
ionState); | 653 return toRefPtrNativeArrayUnchecked<T, V8T>(v8Value, length, isolate, except
ionState); |
| 654 } | 654 } |
| 655 | 655 |
| 656 template <typename T, typename V8T> | 656 template <typename T, typename V8T> |
| 657 WillBeHeapVector<RefPtrWillBeMember<T>> toRefPtrWillBeMemberNativeArray(v8::Loca
l<v8::Value> value, int argumentIndex, v8::Isolate* isolate, ExceptionState& exc
eptionState) | 657 HeapVector<Member<T>> toMemberNativeArray(v8::Local<v8::Value> value, int argume
ntIndex, v8::Isolate* isolate, ExceptionState& exceptionState) |
| 658 { | 658 { |
| 659 v8::Local<v8::Value> v8Value(v8::Local<v8::Value>::New(isolate, value)); | 659 v8::Local<v8::Value> v8Value(v8::Local<v8::Value>::New(isolate, value)); |
| 660 uint32_t length = 0; | 660 uint32_t length = 0; |
| 661 if (value->IsArray()) { | 661 if (value->IsArray()) { |
| 662 length = v8::Local<v8::Array>::Cast(v8Value)->Length(); | 662 length = v8::Local<v8::Array>::Cast(v8Value)->Length(); |
| 663 } else if (!toV8Sequence(value, length, isolate, exceptionState)) { | 663 } else if (!toV8Sequence(value, length, isolate, exceptionState)) { |
| 664 if (!exceptionState.hadException()) | 664 if (!exceptionState.hadException()) |
| 665 exceptionState.throwTypeError(ExceptionMessages::notAnArrayTypeArgum
entOrValue(argumentIndex)); | 665 exceptionState.throwTypeError(ExceptionMessages::notAnArrayTypeArgum
entOrValue(argumentIndex)); |
| 666 return WillBeHeapVector<RefPtrWillBeMember<T>>(); | 666 return HeapVector<Member<T>>(); |
| 667 } | 667 } |
| 668 | 668 |
| 669 WillBeHeapVector<RefPtrWillBeMember<T>> result; | 669 HeapVector<Member<T>> result; |
| 670 result.reserveInitialCapacity(length); | 670 result.reserveInitialCapacity(length); |
| 671 v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(v8Value); | 671 v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(v8Value); |
| 672 v8::TryCatch block(isolate); | 672 v8::TryCatch block(isolate); |
| 673 for (uint32_t i = 0; i < length; ++i) { | 673 for (uint32_t i = 0; i < length; ++i) { |
| 674 v8::Local<v8::Value> element; | 674 v8::Local<v8::Value> element; |
| 675 if (!v8Call(object->Get(isolate->GetCurrentContext(), i), element, block
)) { | 675 if (!v8Call(object->Get(isolate->GetCurrentContext(), i), element, block
)) { |
| 676 exceptionState.rethrowV8Exception(block.Exception()); | 676 exceptionState.rethrowV8Exception(block.Exception()); |
| 677 return WillBeHeapVector<RefPtrWillBeMember<T>>(); | 677 return HeapVector<Member<T>>(); |
| 678 } | 678 } |
| 679 if (V8T::hasInstance(element, isolate)) { | 679 if (V8T::hasInstance(element, isolate)) { |
| 680 v8::Local<v8::Object> elementObject = v8::Local<v8::Object>::Cast(el
ement); | 680 v8::Local<v8::Object> elementObject = v8::Local<v8::Object>::Cast(el
ement); |
| 681 result.uncheckedAppend(V8T::toImpl(elementObject)); | 681 result.uncheckedAppend(V8T::toImpl(elementObject)); |
| 682 } else { | 682 } else { |
| 683 exceptionState.throwTypeError("Invalid Array element type"); | 683 exceptionState.throwTypeError("Invalid Array element type"); |
| 684 return WillBeHeapVector<RefPtrWillBeMember<T>>(); | 684 return HeapVector<Member<T>>(); |
| 685 } | 685 } |
| 686 } | 686 } |
| 687 return result; | 687 return result; |
| 688 } | 688 } |
| 689 | 689 |
| 690 template <typename T, typename V8T> | 690 template <typename T, typename V8T> |
| 691 WillBeHeapVector<RefPtrWillBeMember<T>> toRefPtrWillBeMemberNativeArray(v8::Loca
l<v8::Value> value, const String& propertyName, v8::Isolate* isolate, ExceptionS
tate& exceptionState) | 691 HeapVector<Member<T>> toMemberNativeArray(v8::Local<v8::Value> value, const Stri
ng& propertyName, v8::Isolate* isolate, ExceptionState& exceptionState) |
| 692 { | 692 { |
| 693 v8::Local<v8::Value> v8Value(v8::Local<v8::Value>::New(isolate, value)); | 693 v8::Local<v8::Value> v8Value(v8::Local<v8::Value>::New(isolate, value)); |
| 694 uint32_t length = 0; | 694 uint32_t length = 0; |
| 695 if (value->IsArray()) { | 695 if (value->IsArray()) { |
| 696 length = v8::Local<v8::Array>::Cast(v8Value)->Length(); | 696 length = v8::Local<v8::Array>::Cast(v8Value)->Length(); |
| 697 } else if (!toV8Sequence(value, length, isolate, exceptionState)) { | 697 } else if (!toV8Sequence(value, length, isolate, exceptionState)) { |
| 698 if (!exceptionState.hadException()) | 698 if (!exceptionState.hadException()) |
| 699 exceptionState.throwTypeError(ExceptionMessages::notASequenceTypePro
perty(propertyName)); | 699 exceptionState.throwTypeError(ExceptionMessages::notASequenceTypePro
perty(propertyName)); |
| 700 return WillBeHeapVector<RefPtrWillBeMember<T>>(); | 700 return HeapVector<Member<T>>(); |
| 701 } | 701 } |
| 702 | 702 |
| 703 WillBeHeapVector<RefPtrWillBeMember<T>> result; | 703 HeapVector<Member<T>> result; |
| 704 result.reserveInitialCapacity(length); | 704 result.reserveInitialCapacity(length); |
| 705 v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(v8Value); | 705 v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(v8Value); |
| 706 v8::TryCatch block(isolate); | 706 v8::TryCatch block(isolate); |
| 707 for (uint32_t i = 0; i < length; ++i) { | 707 for (uint32_t i = 0; i < length; ++i) { |
| 708 v8::Local<v8::Value> element; | 708 v8::Local<v8::Value> element; |
| 709 if (!v8Call(object->Get(isolate->GetCurrentContext(), i), element, block
)) { | |
| 710 exceptionState.rethrowV8Exception(block.Exception()); | |
| 711 return WillBeHeapVector<RefPtrWillBeMember<T>>(); | |
| 712 } | |
| 713 if (V8T::hasInstance(element, isolate)) { | |
| 714 v8::Local<v8::Object> elementObject = v8::Local<v8::Object>::Cast(el
ement); | |
| 715 result.uncheckedAppend(V8T::toImpl(elementObject)); | |
| 716 } else { | |
| 717 exceptionState.throwTypeError("Invalid Array element type"); | |
| 718 return WillBeHeapVector<RefPtrWillBeMember<T>>(); | |
| 719 } | |
| 720 } | |
| 721 return result; | |
| 722 } | |
| 723 | |
| 724 template <typename T, typename V8T> | |
| 725 HeapVector<Member<T>> toMemberNativeArray(v8::Local<v8::Value> value, int argume
ntIndex, v8::Isolate* isolate, ExceptionState& exceptionState) | |
| 726 { | |
| 727 uint32_t length = 0; | |
| 728 if (value->IsArray()) { | |
| 729 length = v8::Local<v8::Array>::Cast(value)->Length(); | |
| 730 } else if (!toV8Sequence(value, length, isolate, exceptionState)) { | |
| 731 if (!exceptionState.hadException()) | |
| 732 exceptionState.throwTypeError(ExceptionMessages::notAnArrayTypeArgum
entOrValue(argumentIndex)); | |
| 733 return HeapVector<Member<T>>(); | |
| 734 } | |
| 735 | |
| 736 HeapVector<Member<T>> result; | |
| 737 result.reserveInitialCapacity(length); | |
| 738 v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(value); | |
| 739 v8::TryCatch block(isolate); | |
| 740 for (uint32_t i = 0; i < length; ++i) { | |
| 741 v8::Local<v8::Value> element; | |
| 742 if (!v8Call(object->Get(isolate->GetCurrentContext(), i), element, block
)) { | 709 if (!v8Call(object->Get(isolate->GetCurrentContext(), i), element, block
)) { |
| 743 exceptionState.rethrowV8Exception(block.Exception()); | 710 exceptionState.rethrowV8Exception(block.Exception()); |
| 744 return HeapVector<Member<T>>(); | 711 return HeapVector<Member<T>>(); |
| 745 } | 712 } |
| 746 if (V8T::hasInstance(element, isolate)) { | 713 if (V8T::hasInstance(element, isolate)) { |
| 747 v8::Local<v8::Object> elementObject = v8::Local<v8::Object>::Cast(el
ement); | 714 v8::Local<v8::Object> elementObject = v8::Local<v8::Object>::Cast(el
ement); |
| 748 result.uncheckedAppend(V8T::toImpl(elementObject)); | 715 result.uncheckedAppend(V8T::toImpl(elementObject)); |
| 749 } else { | 716 } else { |
| 750 exceptionState.throwTypeError("Invalid Array element type"); | 717 exceptionState.throwTypeError("Invalid Array element type"); |
| 751 return HeapVector<Member<T>>(); | 718 return HeapVector<Member<T>>(); |
| (...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1038 }; | 1005 }; |
| 1039 | 1006 |
| 1040 // Callback functions used by generated code. | 1007 // Callback functions used by generated code. |
| 1041 CORE_EXPORT void v8ConstructorAttributeGetter(v8::Local<v8::Name> propertyName,
const v8::PropertyCallbackInfo<v8::Value>&); | 1008 CORE_EXPORT void v8ConstructorAttributeGetter(v8::Local<v8::Name> propertyName,
const v8::PropertyCallbackInfo<v8::Value>&); |
| 1042 | 1009 |
| 1043 typedef void (*InstallTemplateFunction)(v8::Local<v8::FunctionTemplate>, v8::Iso
late*); | 1010 typedef void (*InstallTemplateFunction)(v8::Local<v8::FunctionTemplate>, v8::Iso
late*); |
| 1044 | 1011 |
| 1045 } // namespace blink | 1012 } // namespace blink |
| 1046 | 1013 |
| 1047 #endif // V8Binding_h | 1014 #endif // V8Binding_h |
| OLD | NEW |