Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(749)

Side by Side Diff: Source/bindings/core/v8/V8Binding.h

Issue 555133003: Use ExceptionState to throw exceptions when converting arrays (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: rebased Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 16 matching lines...) Expand all
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */ 30 */
31 31
32 #ifndef V8Binding_h 32 #ifndef V8Binding_h
33 #define V8Binding_h 33 #define V8Binding_h
34 34
35 #include "bindings/core/v8/DOMWrapperWorld.h" 35 #include "bindings/core/v8/DOMWrapperWorld.h"
36 #include "bindings/core/v8/ExceptionMessages.h" 36 #include "bindings/core/v8/ExceptionMessages.h"
37 #include "bindings/core/v8/ExceptionState.h"
37 #include "bindings/core/v8/ScriptValue.h" 38 #include "bindings/core/v8/ScriptValue.h"
38 #include "bindings/core/v8/ScriptWrappable.h" 39 #include "bindings/core/v8/ScriptWrappable.h"
39 #include "bindings/core/v8/V8BindingMacros.h" 40 #include "bindings/core/v8/V8BindingMacros.h"
40 #include "bindings/core/v8/V8PerIsolateData.h" 41 #include "bindings/core/v8/V8PerIsolateData.h"
41 #include "bindings/core/v8/V8StringResource.h" 42 #include "bindings/core/v8/V8StringResource.h"
42 #include "bindings/core/v8/V8ThrowException.h" 43 #include "bindings/core/v8/V8ThrowException.h"
43 #include "bindings/core/v8/V8ValueCache.h" 44 #include "bindings/core/v8/V8ValueCache.h"
44 #include "platform/heap/Heap.h" 45 #include "platform/heap/Heap.h"
45 #include "wtf/GetPtr.h" 46 #include "wtf/GetPtr.h"
46 #include "wtf/MathExtras.h" 47 #include "wtf/MathExtras.h"
(...skipping 516 matching lines...) Expand 10 before | Expand all | Expand 10 after
563 ASSERT(isolate); 564 ASSERT(isolate);
564 return v8::Date::New(isolate, std::isfinite(value) ? value : std::numeric_li mits<double>::quiet_NaN()); 565 return v8::Date::New(isolate, std::isfinite(value) ? value : std::numeric_li mits<double>::quiet_NaN());
565 } 566 }
566 567
567 // FIXME: Remove the special casing for NodeFilter and XPathNSResolver. 568 // FIXME: Remove the special casing for NodeFilter and XPathNSResolver.
568 PassRefPtrWillBeRawPtr<NodeFilter> toNodeFilter(v8::Handle<v8::Value>, v8::Handl e<v8::Object>, ScriptState*); 569 PassRefPtrWillBeRawPtr<NodeFilter> toNodeFilter(v8::Handle<v8::Value>, v8::Handl e<v8::Object>, ScriptState*);
569 PassRefPtrWillBeRawPtr<XPathNSResolver> toXPathNSResolver(v8::Handle<v8::Value>, v8::Isolate*); 570 PassRefPtrWillBeRawPtr<XPathNSResolver> toXPathNSResolver(v8::Handle<v8::Value>, v8::Isolate*);
570 571
571 template<class T> struct NativeValueTraits; 572 template<class T> struct NativeValueTraits;
572 573
573 v8::Handle<v8::Value> toV8Sequence(v8::Handle<v8::Value>, uint32_t& length, v8:: Isolate*); 574 bool toV8Sequence(v8::Handle<v8::Value>, uint32_t& length, v8::Isolate*, Excepti onState&);
574 575
575 // Converts a JavaScript value to an array as per the Web IDL specification: 576 // Converts a JavaScript value to an array as per the Web IDL specification:
576 // http://www.w3.org/TR/2012/CR-WebIDL-20120419/#es-array 577 // http://www.w3.org/TR/2012/CR-WebIDL-20120419/#es-array
577 template <class T, class V8T> 578 template <class T, class V8T>
578 Vector<RefPtr<T> > toRefPtrNativeArrayUnchecked(v8::Local<v8::Value> v8Value, ui nt32_t length, v8::Isolate* isolate, bool* success = 0) 579 Vector<RefPtr<T> > toRefPtrNativeArrayUnchecked(v8::Local<v8::Value> v8Value, ui nt32_t length, v8::Isolate* isolate, ExceptionState& exceptionState)
579 { 580 {
580 Vector<RefPtr<T> > result; 581 Vector<RefPtr<T> > result;
581 result.reserveInitialCapacity(length); 582 result.reserveInitialCapacity(length);
582 v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(v8Value); 583 v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(v8Value);
584 v8::TryCatch block;
583 for (uint32_t i = 0; i < length; ++i) { 585 for (uint32_t i = 0; i < length; ++i) {
584 v8::Handle<v8::Value> element = object->Get(i); 586 v8::Handle<v8::Value> element = object->Get(i);
587 if (block.HasCaught()) {
588 exceptionState.rethrowV8Exception(block.Exception());
589 return Vector<RefPtr<T> >();
590 }
585 if (V8T::hasInstance(element, isolate)) { 591 if (V8T::hasInstance(element, isolate)) {
586 v8::Handle<v8::Object> elementObject = v8::Handle<v8::Object>::Cast( element); 592 v8::Handle<v8::Object> elementObject = v8::Handle<v8::Object>::Cast( element);
587 result.uncheckedAppend(V8T::toImpl(elementObject)); 593 result.uncheckedAppend(V8T::toImpl(elementObject));
588 } else { 594 } else {
589 if (success) 595 exceptionState.throwTypeError("Invalid Array element type");
590 *success = false;
591 V8ThrowException::throwTypeError("Invalid Array element type", isola te);
592 return Vector<RefPtr<T> >(); 596 return Vector<RefPtr<T> >();
593 } 597 }
594 } 598 }
595 return result; 599 return result;
596 } 600 }
597 601
598 template <class T, class V8T> 602 template <class T, class V8T>
599 Vector<RefPtr<T> > toRefPtrNativeArray(v8::Handle<v8::Value> value, int argument Index, v8::Isolate* isolate, bool* success = 0) 603 Vector<RefPtr<T> > toRefPtrNativeArray(v8::Handle<v8::Value> value, int argument Index, v8::Isolate* isolate, ExceptionState& exceptionState)
600 { 604 {
601 if (success)
602 *success = true;
603
604 v8::Local<v8::Value> v8Value(v8::Local<v8::Value>::New(isolate, value)); 605 v8::Local<v8::Value> v8Value(v8::Local<v8::Value>::New(isolate, value));
605 uint32_t length = 0; 606 uint32_t length = 0;
606 if (value->IsArray()) { 607 if (value->IsArray()) {
607 length = v8::Local<v8::Array>::Cast(v8Value)->Length(); 608 length = v8::Local<v8::Array>::Cast(v8Value)->Length();
608 } else if (toV8Sequence(value, length, isolate).IsEmpty()) { 609 } else if (!toV8Sequence(value, length, isolate, exceptionState)) {
609 V8ThrowException::throwTypeError(ExceptionMessages::notAnArrayTypeArgume ntOrValue(argumentIndex), isolate); 610 if (!exceptionState.hadException())
611 exceptionState.throwTypeError(ExceptionMessages::notAnArrayTypeArgum entOrValue(argumentIndex));
610 return Vector<RefPtr<T> >(); 612 return Vector<RefPtr<T> >();
611 } 613 }
612 return toRefPtrNativeArrayUnchecked<T, V8T>(v8Value, length, isolate, succes s); 614 return toRefPtrNativeArrayUnchecked<T, V8T>(v8Value, length, isolate, except ionState);
613 } 615 }
614 616
615 template <class T, class V8T> 617 template <class T, class V8T>
616 Vector<RefPtr<T> > toRefPtrNativeArray(v8::Handle<v8::Value> value, const String & propertyName, v8::Isolate* isolate, bool* success = 0) 618 Vector<RefPtr<T> > toRefPtrNativeArray(v8::Handle<v8::Value> value, const String & propertyName, v8::Isolate* isolate, ExceptionState& exceptionState)
617 { 619 {
618 if (success)
619 *success = true;
620
621 v8::Local<v8::Value> v8Value(v8::Local<v8::Value>::New(isolate, value)); 620 v8::Local<v8::Value> v8Value(v8::Local<v8::Value>::New(isolate, value));
622 uint32_t length = 0; 621 uint32_t length = 0;
623 if (value->IsArray()) { 622 if (value->IsArray()) {
624 length = v8::Local<v8::Array>::Cast(v8Value)->Length(); 623 length = v8::Local<v8::Array>::Cast(v8Value)->Length();
625 } else if (toV8Sequence(value, length, isolate).IsEmpty()) { 624 } else if (!toV8Sequence(value, length, isolate, exceptionState)) {
626 V8ThrowException::throwTypeError(ExceptionMessages::notASequenceTypeProp erty(propertyName), isolate); 625 if (!exceptionState.hadException())
626 exceptionState.throwTypeError(ExceptionMessages::notASequenceTypePro perty(propertyName));
627 return Vector<RefPtr<T> >(); 627 return Vector<RefPtr<T> >();
628 } 628 }
629 return toRefPtrNativeArrayUnchecked<T, V8T>(v8Value, length, isolate, succes s); 629 return toRefPtrNativeArrayUnchecked<T, V8T>(v8Value, length, isolate, except ionState);
630 } 630 }
631 631
632 template <class T, class V8T> 632 template <class T, class V8T>
633 WillBeHeapVector<RefPtrWillBeMember<T> > toRefPtrWillBeMemberNativeArray(v8::Han dle<v8::Value> value, int argumentIndex, v8::Isolate* isolate, bool* success = 0 ) 633 WillBeHeapVector<RefPtrWillBeMember<T> > toRefPtrWillBeMemberNativeArray(v8::Han dle<v8::Value> value, int argumentIndex, v8::Isolate* isolate, ExceptionState& e xceptionState)
634 { 634 {
635 if (success)
636 *success = true;
637
638 v8::Local<v8::Value> v8Value(v8::Local<v8::Value>::New(isolate, value)); 635 v8::Local<v8::Value> v8Value(v8::Local<v8::Value>::New(isolate, value));
639 uint32_t length = 0; 636 uint32_t length = 0;
640 if (value->IsArray()) { 637 if (value->IsArray()) {
641 length = v8::Local<v8::Array>::Cast(v8Value)->Length(); 638 length = v8::Local<v8::Array>::Cast(v8Value)->Length();
642 } else if (toV8Sequence(value, length, isolate).IsEmpty()) { 639 } else if (!toV8Sequence(value, length, isolate, exceptionState)) {
643 V8ThrowException::throwTypeError(ExceptionMessages::notAnArrayTypeArgume ntOrValue(argumentIndex), isolate); 640 if (!exceptionState.hadException())
641 exceptionState.throwTypeError(ExceptionMessages::notAnArrayTypeArgum entOrValue(argumentIndex));
644 return WillBeHeapVector<RefPtrWillBeMember<T> >(); 642 return WillBeHeapVector<RefPtrWillBeMember<T> >();
645 } 643 }
646 644
647 WillBeHeapVector<RefPtrWillBeMember<T> > result; 645 WillBeHeapVector<RefPtrWillBeMember<T> > result;
648 result.reserveInitialCapacity(length); 646 result.reserveInitialCapacity(length);
649 v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(v8Value); 647 v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(v8Value);
648 v8::TryCatch block;
650 for (uint32_t i = 0; i < length; ++i) { 649 for (uint32_t i = 0; i < length; ++i) {
651 v8::Handle<v8::Value> element = object->Get(i); 650 v8::Handle<v8::Value> element = object->Get(i);
651 if (block.HasCaught()) {
652 exceptionState.rethrowV8Exception(block.Exception());
653 return WillBeHeapVector<RefPtrWillBeMember<T> >();
654 }
652 if (V8T::hasInstance(element, isolate)) { 655 if (V8T::hasInstance(element, isolate)) {
653 v8::Handle<v8::Object> elementObject = v8::Handle<v8::Object>::Cast( element); 656 v8::Handle<v8::Object> elementObject = v8::Handle<v8::Object>::Cast( element);
654 result.uncheckedAppend(V8T::toImpl(elementObject)); 657 result.uncheckedAppend(V8T::toImpl(elementObject));
655 } else { 658 } else {
656 if (success) 659 exceptionState.throwTypeError("Invalid Array element type");
657 *success = false;
658 V8ThrowException::throwTypeError("Invalid Array element type", isola te);
659 return WillBeHeapVector<RefPtrWillBeMember<T> >(); 660 return WillBeHeapVector<RefPtrWillBeMember<T> >();
660 } 661 }
661 } 662 }
662 return result; 663 return result;
663 } 664 }
664 665
665 template <class T, class V8T> 666 template <class T, class V8T>
666 WillBeHeapVector<RefPtrWillBeMember<T> > toRefPtrWillBeMemberNativeArray(v8::Han dle<v8::Value> value, const String& propertyName, v8::Isolate* isolate, bool* su ccess = 0) 667 WillBeHeapVector<RefPtrWillBeMember<T> > toRefPtrWillBeMemberNativeArray(v8::Han dle<v8::Value> value, const String& propertyName, v8::Isolate* isolate, Exceptio nState& exceptionState)
667 { 668 {
668 if (success)
669 *success = true;
670
671 v8::Local<v8::Value> v8Value(v8::Local<v8::Value>::New(isolate, value)); 669 v8::Local<v8::Value> v8Value(v8::Local<v8::Value>::New(isolate, value));
672 uint32_t length = 0; 670 uint32_t length = 0;
673 if (value->IsArray()) { 671 if (value->IsArray()) {
674 length = v8::Local<v8::Array>::Cast(v8Value)->Length(); 672 length = v8::Local<v8::Array>::Cast(v8Value)->Length();
675 } else if (toV8Sequence(value, length, isolate).IsEmpty()) { 673 } else if (!toV8Sequence(value, length, isolate, exceptionState)) {
676 V8ThrowException::throwTypeError(ExceptionMessages::notASequenceTypeProp erty(propertyName), isolate); 674 if (!exceptionState.hadException())
675 exceptionState.throwTypeError(ExceptionMessages::notASequenceTypePro perty(propertyName));
677 return WillBeHeapVector<RefPtrWillBeMember<T> >(); 676 return WillBeHeapVector<RefPtrWillBeMember<T> >();
678 } 677 }
679 678
680 WillBeHeapVector<RefPtrWillBeMember<T> > result; 679 WillBeHeapVector<RefPtrWillBeMember<T> > result;
681 result.reserveInitialCapacity(length); 680 result.reserveInitialCapacity(length);
682 v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(v8Value); 681 v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(v8Value);
682 v8::TryCatch block;
683 for (uint32_t i = 0; i < length; ++i) { 683 for (uint32_t i = 0; i < length; ++i) {
684 v8::Handle<v8::Value> element = object->Get(i); 684 v8::Handle<v8::Value> element = object->Get(i);
685 if (block.HasCaught()) {
686 exceptionState.rethrowV8Exception(block.Exception());
687 return Vector<RefPtr<T> >();
688 }
685 if (V8T::hasInstance(element, isolate)) { 689 if (V8T::hasInstance(element, isolate)) {
686 v8::Handle<v8::Object> elementObject = v8::Handle<v8::Object>::Cast( element); 690 v8::Handle<v8::Object> elementObject = v8::Handle<v8::Object>::Cast( element);
687 result.uncheckedAppend(V8T::toImpl(elementObject)); 691 result.uncheckedAppend(V8T::toImpl(elementObject));
688 } else { 692 } else {
689 if (success) 693 exceptionState.throwTypeError("Invalid Array element type");
690 *success = false;
691 V8ThrowException::throwTypeError("Invalid Array element type", isola te);
692 return WillBeHeapVector<RefPtrWillBeMember<T> >(); 694 return WillBeHeapVector<RefPtrWillBeMember<T> >();
693 } 695 }
694 } 696 }
695 return result; 697 return result;
696 } 698 }
697 699
698 template <class T, class V8T> 700 template <class T, class V8T>
699 HeapVector<Member<T> > toMemberNativeArray(v8::Handle<v8::Value> value, int argu mentIndex, v8::Isolate* isolate, bool* success = 0) 701 HeapVector<Member<T> > toMemberNativeArray(v8::Handle<v8::Value> value, int argu mentIndex, v8::Isolate* isolate, ExceptionState& exceptionState)
700 { 702 {
701 if (success)
702 *success = true;
703
704 v8::Local<v8::Value> v8Value(v8::Local<v8::Value>::New(isolate, value)); 703 v8::Local<v8::Value> v8Value(v8::Local<v8::Value>::New(isolate, value));
705 uint32_t length = 0; 704 uint32_t length = 0;
706 if (value->IsArray()) { 705 if (value->IsArray()) {
707 length = v8::Local<v8::Array>::Cast(v8Value)->Length(); 706 length = v8::Local<v8::Array>::Cast(v8Value)->Length();
708 } else if (toV8Sequence(value, length, isolate).IsEmpty()) { 707 } else if (!toV8Sequence(value, length, isolate, exceptionState)) {
709 V8ThrowException::throwTypeError(ExceptionMessages::notAnArrayTypeArgume ntOrValue(argumentIndex), isolate); 708 if (!exceptionState.hadException())
709 exceptionState.throwTypeError(ExceptionMessages::notAnArrayTypeArgum entOrValue(argumentIndex));
710 return HeapVector<Member<T> >(); 710 return HeapVector<Member<T> >();
711 } 711 }
712 712
713 HeapVector<Member<T> > result; 713 HeapVector<Member<T> > result;
714 result.reserveInitialCapacity(length); 714 result.reserveInitialCapacity(length);
715 v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(v8Value); 715 v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(v8Value);
716 v8::TryCatch block;
716 for (uint32_t i = 0; i < length; ++i) { 717 for (uint32_t i = 0; i < length; ++i) {
717 v8::Handle<v8::Value> element = object->Get(i); 718 v8::Handle<v8::Value> element = object->Get(i);
719 if (UNLIKELY(block.HasCaught())) {
720 exceptionState.rethrowV8Exception(block.Exception());
721 return HeapVector<Member<T> >();
722 }
718 if (V8T::hasInstance(element, isolate)) { 723 if (V8T::hasInstance(element, isolate)) {
719 v8::Handle<v8::Object> elementObject = v8::Handle<v8::Object>::Cast( element); 724 v8::Handle<v8::Object> elementObject = v8::Handle<v8::Object>::Cast( element);
720 result.uncheckedAppend(V8T::toImpl(elementObject)); 725 result.uncheckedAppend(V8T::toImpl(elementObject));
721 } else { 726 } else {
722 if (success) 727 exceptionState.throwTypeError("Invalid Array element type");
723 *success = false;
724 V8ThrowException::throwTypeError("Invalid Array element type", isola te);
725 return HeapVector<Member<T> >(); 728 return HeapVector<Member<T> >();
726 } 729 }
727 } 730 }
728 return result; 731 return result;
729 } 732 }
730 733
731 // Converts a JavaScript value to an array as per the Web IDL specification: 734 // Converts a JavaScript value to an array as per the Web IDL specification:
732 // http://www.w3.org/TR/2012/CR-WebIDL-20120419/#es-array 735 // http://www.w3.org/TR/2012/CR-WebIDL-20120419/#es-array
733 template <class T> 736 template <class T>
734 Vector<T> toImplArray(v8::Handle<v8::Value> value, int argumentIndex, v8::Isolat e* isolate) 737 Vector<T> toImplArray(v8::Handle<v8::Value> value, int argumentIndex, v8::Isolat e* isolate, ExceptionState& exceptionState)
735 { 738 {
736 v8::Local<v8::Value> v8Value(v8::Local<v8::Value>::New(isolate, value)); 739 v8::Local<v8::Value> v8Value(v8::Local<v8::Value>::New(isolate, value));
737 uint32_t length = 0; 740 uint32_t length = 0;
738 if (value->IsArray()) { 741 if (value->IsArray()) {
739 length = v8::Local<v8::Array>::Cast(v8Value)->Length(); 742 length = v8::Local<v8::Array>::Cast(v8Value)->Length();
740 } else if (toV8Sequence(value, length, isolate).IsEmpty()) { 743 } else if (!toV8Sequence(value, length, isolate, exceptionState)) {
741 V8ThrowException::throwTypeError(ExceptionMessages::notAnArrayTypeArgume ntOrValue(argumentIndex), isolate); 744 if (!exceptionState.hadException())
745 exceptionState.throwTypeError(ExceptionMessages::notAnArrayTypeArgum entOrValue(argumentIndex));
742 return Vector<T>(); 746 return Vector<T>();
743 } 747 }
744 748
745 Vector<T> result; 749 Vector<T> result;
746 result.reserveInitialCapacity(length); 750 result.reserveInitialCapacity(length);
747 typedef NativeValueTraits<T> TraitsType; 751 typedef NativeValueTraits<T> TraitsType;
748 v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(v8Value); 752 v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(v8Value);
749 for (uint32_t i = 0; i < length; ++i) 753 v8::TryCatch block;
750 result.uncheckedAppend(TraitsType::nativeValue(object->Get(i), isolate)) ; 754 for (uint32_t i = 0; i < length; ++i) {
755 v8::Handle<v8::Value> element = object->Get(i);
756 if (UNLIKELY(block.HasCaught())) {
757 exceptionState.rethrowV8Exception(block.Exception());
758 return Vector<T>();
759 }
760 result.uncheckedAppend(TraitsType::nativeValue(element, isolate, excepti onState));
761 if (exceptionState.hadException())
762 return Vector<T>();
763 }
751 return result; 764 return result;
752 } 765 }
753 766
754 template <class T> 767 template <class T>
755 Vector<T> toImplArguments(const v8::FunctionCallbackInfo<v8::Value>& info, int s tartIndex) 768 Vector<T> toImplArguments(const v8::FunctionCallbackInfo<v8::Value>& info, int s tartIndex, ExceptionState& exceptionState)
756 { 769 {
757 ASSERT(startIndex <= info.Length()); 770 ASSERT(startIndex <= info.Length());
758 Vector<T> result; 771 Vector<T> result;
759 typedef NativeValueTraits<T> TraitsType; 772 typedef NativeValueTraits<T> TraitsType;
760 int length = info.Length(); 773 int length = info.Length();
761 result.reserveInitialCapacity(length); 774 result.reserveInitialCapacity(length);
762 for (int i = startIndex; i < length; ++i) 775 for (int i = startIndex; i < length; ++i) {
763 result.uncheckedAppend(TraitsType::nativeValue(info[i], info.GetIsolate( ))); 776 result.uncheckedAppend(TraitsType::nativeValue(info[i], info.GetIsolate( ), exceptionState));
777 if (exceptionState.hadException())
778 return Vector<T>();
779 }
764 return result; 780 return result;
765 } 781 }
766 782
767 // Validates that the passed object is a sequence type per WebIDL spec 783 // Validates that the passed object is a sequence type per WebIDL spec
768 // http://www.w3.org/TR/2012/CR-WebIDL-20120419/#es-sequence 784 // http://www.w3.org/TR/2012/CR-WebIDL-20120419/#es-sequence
769 inline v8::Handle<v8::Value> toV8Sequence(v8::Handle<v8::Value> value, uint32_t& length, v8::Isolate* isolate) 785 inline bool toV8Sequence(v8::Handle<v8::Value> value, uint32_t& length, v8::Isol ate* isolate, ExceptionState& exceptionState)
770 { 786 {
771 // Attempt converting to a sequence if the value is not already an array but is 787 // Attempt converting to a sequence if the value is not already an array but is
772 // any kind of object except for a native Date object or a native RegExp obj ect. 788 // any kind of object except for a native Date object or a native RegExp obj ect.
773 ASSERT(!value->IsArray()); 789 ASSERT(!value->IsArray());
774 // FIXME: Do we really need to special case Date and RegExp object? 790 // FIXME: Do we really need to special case Date and RegExp object?
775 // https://www.w3.org/Bugs/Public/show_bug.cgi?id=22806 791 // https://www.w3.org/Bugs/Public/show_bug.cgi?id=22806
776 if (!value->IsObject() || value->IsDate() || value->IsRegExp()) { 792 if (!value->IsObject() || value->IsDate() || value->IsRegExp()) {
777 // The caller is responsible for reporting a TypeError. 793 // The caller is responsible for reporting a TypeError.
778 return v8Undefined(); 794 return false;
779 } 795 }
780 796
781 v8::Local<v8::Value> v8Value(v8::Local<v8::Value>::New(isolate, value)); 797 v8::Local<v8::Value> v8Value(v8::Local<v8::Value>::New(isolate, value));
782 v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(v8Value); 798 v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(v8Value);
783 v8::Local<v8::String> lengthSymbol = v8AtomicString(isolate, "length"); 799 v8::Local<v8::String> lengthSymbol = v8AtomicString(isolate, "length");
784 800
785 // FIXME: The specification states that the length property should be used a s fallback, if value 801 // FIXME: The specification states that the length property should be used a s fallback, if value
786 // is not a platform object that supports indexed properties. If it supports indexed properties, 802 // is not a platform object that supports indexed properties. If it supports indexed properties,
787 // length should actually be one greater than value’s maximum indexed proper ty index. 803 // length should actually be one greater than value’s maximum indexed proper ty index.
788 TONATIVE_EXCEPTION(v8::Local<v8::Value>, lengthValue, object->Get(lengthSymb ol)); 804 v8::TryCatch block;
805 v8::Local<v8::Value> lengthValue = object->Get(lengthSymbol);
806 if (block.HasCaught()) {
807 exceptionState.rethrowV8Exception(block.Exception());
808 return false;
809 }
789 810
790 if (lengthValue->IsUndefined() || lengthValue->IsNull()) { 811 if (lengthValue->IsUndefined() || lengthValue->IsNull()) {
791 // The caller is responsible for reporting a TypeError. 812 // The caller is responsible for reporting a TypeError.
792 return v8Undefined(); 813 return false;
793 } 814 }
794 815
795 TONATIVE_EXCEPTION(uint32_t, sequenceLength, lengthValue->Int32Value()); 816 uint32_t sequenceLength = lengthValue->Int32Value();
817 if (block.HasCaught()) {
818 exceptionState.rethrowV8Exception(block.Exception());
819 return false;
820 }
821
796 length = sequenceLength; 822 length = sequenceLength;
797 return v8Value; 823 return true;
798 } 824 }
799 825
800 template<> 826 template<>
801 struct NativeValueTraits<String> { 827 struct NativeValueTraits<String> {
802 static inline String nativeValue(const v8::Handle<v8::Value>& value, v8::Iso late* isolate) 828 static inline String nativeValue(const v8::Handle<v8::Value>& value, v8::Iso late* isolate, ExceptionState& exceptionState)
803 { 829 {
804 TOSTRING_DEFAULT(V8StringResource<>, stringValue, value, String()); 830 V8StringResource<> stringValue(value);
831 if (!stringValue.prepare(exceptionState))
832 return String();
805 return stringValue; 833 return stringValue;
806 } 834 }
807 }; 835 };
808 836
809 template<> 837 template<>
810 struct NativeValueTraits<int> { 838 struct NativeValueTraits<int> {
811 static inline int nativeValue(const v8::Handle<v8::Value>& value, v8::Isolat e* isolate) 839 static inline int nativeValue(const v8::Handle<v8::Value>& value, v8::Isolat e* isolate, ExceptionState& exceptionState)
812 { 840 {
813 return toInt32(value); 841 return toInt32(value, exceptionState);
814 } 842 }
815 }; 843 };
816 844
817 template<> 845 template<>
818 struct NativeValueTraits<unsigned> { 846 struct NativeValueTraits<unsigned> {
819 static inline unsigned nativeValue(const v8::Handle<v8::Value>& value, v8::I solate* isolate) 847 static inline unsigned nativeValue(const v8::Handle<v8::Value>& value, v8::I solate* isolate, ExceptionState& exceptionState)
820 { 848 {
821 return toUInt32(value); 849 return toUInt32(value, exceptionState);
822 } 850 }
823 }; 851 };
824 852
825 template<> 853 template<>
826 struct NativeValueTraits<float> { 854 struct NativeValueTraits<float> {
827 static inline float nativeValue(const v8::Handle<v8::Value>& value, v8::Isol ate* isolate) 855 static inline float nativeValue(const v8::Handle<v8::Value>& value, v8::Isol ate* isolate, ExceptionState& exceptionState)
828 { 856 {
829 return static_cast<float>(value->NumberValue()); 857 return toFloat(value, exceptionState);
830 } 858 }
831 }; 859 };
832 860
833 template<> 861 template<>
834 struct NativeValueTraits<double> { 862 struct NativeValueTraits<double> {
835 static inline double nativeValue(const v8::Handle<v8::Value>& value, v8::Iso late* isolate) 863 static inline double nativeValue(const v8::Handle<v8::Value>& value, v8::Iso late* isolate, ExceptionState& exceptionState)
836 { 864 {
837 return static_cast<double>(value->NumberValue()); 865 return toDouble(value, exceptionState);
838 } 866 }
839 }; 867 };
840 868
841 template<> 869 template<>
842 struct NativeValueTraits<v8::Handle<v8::Value> > { 870 struct NativeValueTraits<v8::Handle<v8::Value> > {
843 static inline v8::Handle<v8::Value> nativeValue(const v8::Handle<v8::Value>& value, v8::Isolate* isolate) 871 static inline v8::Handle<v8::Value> nativeValue(const v8::Handle<v8::Value>& value, v8::Isolate* isolate, ExceptionState&)
844 { 872 {
845 return value; 873 return value;
846 } 874 }
847 }; 875 };
848 876
849 template<> 877 template<>
850 struct NativeValueTraits<ScriptValue> { 878 struct NativeValueTraits<ScriptValue> {
851 static inline ScriptValue nativeValue(const v8::Handle<v8::Value>& value, v8 ::Isolate* isolate) 879 static inline ScriptValue nativeValue(const v8::Handle<v8::Value>& value, v8 ::Isolate* isolate, ExceptionState&)
852 { 880 {
853 return ScriptValue(ScriptState::current(isolate), value); 881 return ScriptValue(ScriptState::current(isolate), value);
854 } 882 }
855 }; 883 };
856 884
857 template <typename T> 885 template <typename T>
858 struct NativeValueTraits<Vector<T> > { 886 struct NativeValueTraits<Vector<T> > {
859 static inline Vector<T> nativeValue(const v8::Handle<v8::Value>& value, v8:: Isolate* isolate) 887 static inline Vector<T> nativeValue(const v8::Handle<v8::Value>& value, v8:: Isolate* isolate, ExceptionState& exceptionState)
860 { 888 {
861 return toImplArray<T>(value, 0, isolate); 889 return toImplArray<T>(value, 0, isolate, exceptionState);
862 } 890 }
863 }; 891 };
864 892
865 v8::Isolate* toIsolate(ExecutionContext*); 893 v8::Isolate* toIsolate(ExecutionContext*);
866 v8::Isolate* toIsolate(LocalFrame*); 894 v8::Isolate* toIsolate(LocalFrame*);
867 895
868 LocalDOMWindow* toDOMWindow(v8::Handle<v8::Value>, v8::Isolate*); 896 LocalDOMWindow* toDOMWindow(v8::Handle<v8::Value>, v8::Isolate*);
869 LocalDOMWindow* toDOMWindow(v8::Handle<v8::Context>); 897 LocalDOMWindow* toDOMWindow(v8::Handle<v8::Context>);
870 LocalDOMWindow* enteredDOMWindow(v8::Isolate*); 898 LocalDOMWindow* enteredDOMWindow(v8::Isolate*);
871 LocalDOMWindow* currentDOMWindow(v8::Isolate*); 899 LocalDOMWindow* currentDOMWindow(v8::Isolate*);
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
990 v8::Local<v8::Value> v8IteratorResult(v8::Isolate*, v8::Handle<v8::Value>); 1018 v8::Local<v8::Value> v8IteratorResult(v8::Isolate*, v8::Handle<v8::Value>);
991 template <typename T> 1019 template <typename T>
992 v8::Local<v8::Value> v8IteratorResult(ScriptState* scriptState, const T& value) 1020 v8::Local<v8::Value> v8IteratorResult(ScriptState* scriptState, const T& value)
993 { 1021 {
994 return v8IteratorResult(scriptState->isolate(), V8ValueTraits<T>::toV8Value( value, scriptState->context()->Global(), scriptState->isolate())); 1022 return v8IteratorResult(scriptState->isolate(), V8ValueTraits<T>::toV8Value( value, scriptState->context()->Global(), scriptState->isolate()));
995 } 1023 }
996 1024
997 } // namespace blink 1025 } // namespace blink
998 1026
999 #endif // V8Binding_h 1027 #endif // V8Binding_h
OLDNEW
« no previous file with comments | « Source/bindings/core/v8/SerializedScriptValue.cpp ('k') | Source/bindings/core/v8/V8Binding.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698