Chromium Code Reviews| 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 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 221 { | 221 { |
| 222 ASSERT(isolate); | 222 ASSERT(isolate); |
| 223 return v8::String::NewFromUtf8(isolate, str, v8::String::kInternalizedString , length); | 223 return v8::String::NewFromUtf8(isolate, str, v8::String::kInternalizedString , length); |
| 224 } | 224 } |
| 225 | 225 |
| 226 inline v8::Handle<v8::Value> v8Undefined() | 226 inline v8::Handle<v8::Value> v8Undefined() |
| 227 { | 227 { |
| 228 return v8::Handle<v8::Value>(); | 228 return v8::Handle<v8::Value>(); |
| 229 } | 229 } |
| 230 | 230 |
| 231 template <class T> | 231 // Converts a DOM object to a v8 value. |
| 232 // This is a no-inline version of toV8(). If you want to call toV8() | |
| 233 // without creating #include cycles, you can use this function instead. | |
| 234 // Each specialized implementation will be generated. | |
| 235 template<typename T> | |
| 236 v8::Handle<v8::Value> toV8NoInline(T* impl, v8::Handle<v8::Object> creationConte xt, v8::Isolate*); | |
| 237 | |
| 238 template <typename T> | |
| 232 struct V8ValueTraits { | 239 struct V8ValueTraits { |
| 233 // FIXME: This function requires the associated generated header to be | 240 typedef typename WTF::RemovePointer<T>::Type TypeWithoutPointer; |
|
yhirano
2014/06/24 09:24:09
[optional] You can use WTF::getPtr if you prefer.
tasak
2014/06/26 05:04:02
I see.
Since I'm using RemoveTemplate below, I wil
| |
| 234 // included. Also, this function does not match with other V8ValueTraits | 241 static v8::Handle<v8::Value> toV8Value(TypeWithoutPointer* const& value, v8: :Handle<v8::Object> creationContext, v8::Isolate* isolate) |
| 235 // classes. Remove this V8ValueTraits if possible. | |
| 236 static inline v8::Handle<v8::Value> toV8Value(const T& value, v8::Handle<v8: :Object> creationContext, v8::Isolate* isolate) | |
| 237 { | 242 { |
| 238 return toV8(WTF::getPtr(value), creationContext, isolate); | 243 return toV8NoInline(value, creationContext, isolate); |
| 244 } | |
| 245 | |
| 246 typedef typename WTF::RemoveTemplate<T, RawPtr>::Type TypeWithoutRawPtr; | |
| 247 static v8::Handle<v8::Value> toV8Value(const RawPtr<TypeWithoutRawPtr>& valu e, v8::Handle<v8::Object> creationContext, v8::Isolate* isolate) | |
| 248 { | |
| 249 return toV8NoInline(value.get(), creationContext, isolate); | |
| 250 } | |
| 251 | |
| 252 // HeapVector<RefPtr> requires the following method: | |
| 253 typedef typename WTF::RemoveTemplate<T, RefPtr>::Type TypeWithoutRefPtr; | |
| 254 static v8::Handle<v8::Value> toV8Value(const RefPtr<TypeWithoutRefPtr>& valu e, v8::Handle<v8::Object> creationContext, v8::Isolate* isolate) | |
| 255 { | |
| 256 return toV8NoInline(value.get(), creationContext, isolate); | |
| 257 } | |
| 258 | |
| 259 typedef typename WTF::RemoveTemplate<T, PassRefPtr>::Type TypeWithoutPassRef Ptr; | |
| 260 static v8::Handle<v8::Value> toV8Value(const PassRefPtr<TypeWithoutPassRefPt r>& value, v8::Handle<v8::Object> creationContext, v8::Isolate* isolate) | |
| 261 { | |
| 262 return toV8NoInline(value.get(), creationContext, isolate); | |
| 263 } | |
| 264 | |
| 265 typedef typename WTF::RemoveTemplate<T, Member>::Type TypeWithoutMember; | |
| 266 static v8::Handle<v8::Value> toV8Value(const Member<TypeWithoutMember>& valu e, v8::Handle<v8::Object> creationContext, v8::Isolate* isolate) | |
| 267 { | |
| 268 return toV8NoInline(value.get(), creationContext, isolate); | |
| 269 } | |
| 270 | |
| 271 typedef typename WTF::RemoveVector<T, Vector, 0, WTF::DefaultAllocator>::Typ e TypeWithoutDefaultVector; | |
|
yhirano
2014/06/24 09:24:09
You can use the partial template specialization. S
tasak
2014/06/26 05:04:02
I see. Thanks.
Done.
| |
| 272 static v8::Handle<v8::Value> toV8Value(const Vector<TypeWithoutDefaultVector , 0, WTF::DefaultAllocator>& value, v8::Handle<v8::Object> creationContext, v8:: Isolate* isolate) | |
| 273 { | |
| 274 return v8ArrayNoInline(value, creationContext, isolate); | |
| 239 } | 275 } |
| 240 }; | 276 }; |
| 241 | 277 |
| 242 template<> | 278 template<> |
| 243 struct V8ValueTraits<String> { | 279 struct V8ValueTraits<String> { |
| 244 static inline v8::Handle<v8::Value> toV8Value(const String& value, v8::Handl e<v8::Object>, v8::Isolate* isolate) | 280 static inline v8::Handle<v8::Value> toV8Value(const String& value, v8::Handl e<v8::Object>, v8::Isolate* isolate) |
| 245 { | 281 { |
| 246 return v8String(isolate, value); | 282 return v8String(isolate, value); |
| 247 } | 283 } |
| 248 }; | 284 }; |
| (...skipping 602 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 851 v8SetReturnValue(info, properties); | 887 v8SetReturnValue(info, properties); |
| 852 } | 888 } |
| 853 | 889 |
| 854 // These methods store hidden values into an array that is stored in the interna l field of a DOM wrapper. | 890 // These methods store hidden values into an array that is stored in the interna l field of a DOM wrapper. |
| 855 void addHiddenValueToArray(v8::Handle<v8::Object>, v8::Local<v8::Value>, int cac heIndex, v8::Isolate*); | 891 void addHiddenValueToArray(v8::Handle<v8::Object>, v8::Local<v8::Value>, int cac heIndex, v8::Isolate*); |
| 856 void removeHiddenValueFromArray(v8::Handle<v8::Object>, v8::Local<v8::Value>, in t cacheIndex, v8::Isolate*); | 892 void removeHiddenValueFromArray(v8::Handle<v8::Object>, v8::Local<v8::Value>, in t cacheIndex, v8::Isolate*); |
| 857 void moveEventListenerToNewWrapper(v8::Handle<v8::Object>, EventListener* oldVal ue, v8::Local<v8::Value> newValue, int cacheIndex, v8::Isolate*); | 893 void moveEventListenerToNewWrapper(v8::Handle<v8::Object>, EventListener* oldVal ue, v8::Local<v8::Value> newValue, int cacheIndex, v8::Isolate*); |
| 858 | 894 |
| 859 PassRefPtr<JSONValue> v8ToJSONValue(v8::Isolate*, v8::Handle<v8::Value>, int); | 895 PassRefPtr<JSONValue> v8ToJSONValue(v8::Isolate*, v8::Handle<v8::Value>, int); |
| 860 | 896 |
| 861 // Converts a DOM object to a v8 value. | |
| 862 // This is a no-inline version of toV8(). If you want to call toV8() | |
| 863 // without creating #include cycles, you can use this function instead. | |
| 864 // Each specialized implementation will be generated. | |
| 865 template<typename T> | |
| 866 v8::Handle<v8::Value> toV8NoInline(T* impl, v8::Handle<v8::Object> creationConte xt, v8::Isolate*); | |
| 867 | |
| 868 // ToV8Value<U, Context> is a class that converts a C++ object to a | |
| 869 // v8 value. U has to be a class having a static method getCreationContext | |
| 870 // which returns an object created from a target context. | |
| 871 template<typename U, typename Context> | |
| 872 class ToV8Value { | |
| 873 public: | |
| 874 template<typename T> | |
| 875 static v8::Handle<v8::Value> toV8Value(const T& value, Context context, v8:: Isolate* isolate) | |
| 876 { | |
| 877 // Default implementaion: for types that don't need the context. | |
| 878 return V8ValueTraits<T>::toV8Value(value, context, isolate); | |
| 879 } | |
| 880 | |
| 881 // Pointer specializations. | |
| 882 template<typename T> | |
| 883 static v8::Handle<v8::Value> toV8Value(T* const& value, Context context, v8: :Isolate* isolate) | |
| 884 { | |
| 885 return toV8NoInline(value, context, isolate); | |
| 886 } | |
| 887 template<typename T> | |
| 888 static v8::Handle<v8::Value> toV8Value(const RefPtr<T>& value, Context conte xt, v8::Isolate* isolate) | |
| 889 { | |
| 890 return toV8Value(value.get(), context, isolate); | |
| 891 } | |
| 892 template<typename T> | |
| 893 static v8::Handle<v8::Value> toV8Value(const PassRefPtr<T>& value, Context c ontext, v8::Isolate* isolate) | |
| 894 { | |
| 895 return toV8Value(value.get(), context, isolate); | |
| 896 } | |
| 897 template<typename T> | |
| 898 static v8::Handle<v8::Value> toV8Value(const OwnPtr<T>& value, Context conte xt, v8::Isolate* isolate) | |
| 899 { | |
| 900 return toV8Value(value.get(), context, isolate); | |
| 901 } | |
| 902 template<typename T> | |
| 903 static v8::Handle<v8::Value> toV8Value(const PassOwnPtr<T>& value, Context c ontext, v8::Isolate* isolate) | |
| 904 { | |
| 905 return toV8Value(value.get(), context, isolate); | |
| 906 } | |
| 907 template<typename T> | |
| 908 static v8::Handle<v8::Value> toV8Value(const RawPtr<T>& value, Context conte xt, v8::Isolate* isolate) | |
| 909 { | |
| 910 return toV8Value(value.get(), context, isolate); | |
| 911 } | |
| 912 | |
| 913 // const char* should use V8ValueTraits. | |
| 914 static v8::Handle<v8::Value> toV8Value(const char* const& value, Context con text, v8::Isolate* isolate) | |
| 915 { | |
| 916 return V8ValueTraits<const char*>::toV8Value(value, context, isolate); | |
| 917 } | |
| 918 | |
| 919 template<typename T, size_t inlineCapacity> | |
| 920 static v8::Handle<v8::Value> toV8Value(const Vector<T, inlineCapacity>& valu e, Context context, v8::Isolate* isolate) | |
| 921 { | |
| 922 return v8ArrayNoInline(value, context, isolate); | |
| 923 } | |
| 924 | |
| 925 template<typename T, size_t inlineCapacity> | |
| 926 static v8::Handle<v8::Value> toV8Value(const HeapVector<T, inlineCapacity>& value, Context context, v8::Isolate* isolate) | |
| 927 { | |
| 928 return v8ArrayNoInline(value, context, isolate); | |
| 929 } | |
| 930 | |
| 931 template<typename T, size_t inlineCapacity> | |
| 932 static v8::Handle<v8::Value> toV8Value(const PersistentHeapVector<T, inlineC apacity>& value, Context context, v8::Isolate* isolate) | |
| 933 { | |
| 934 return v8ArrayNoInline(static_cast<HeapVector<T, inlineCapacity> >(value ), context, isolate); | |
| 935 } | |
| 936 }; | |
| 937 | |
| 938 // Result values for platform object 'deleter' methods, | 897 // Result values for platform object 'deleter' methods, |
| 939 // http://www.w3.org/TR/WebIDL/#delete | 898 // http://www.w3.org/TR/WebIDL/#delete |
| 940 enum DeleteResult { | 899 enum DeleteResult { |
| 941 DeleteSuccess, | 900 DeleteSuccess, |
| 942 DeleteReject, | 901 DeleteReject, |
| 943 DeleteUnknownProperty | 902 DeleteUnknownProperty |
| 944 }; | 903 }; |
| 945 | 904 |
| 946 class V8IsolateInterruptor : public ThreadState::Interruptor { | 905 class V8IsolateInterruptor : public ThreadState::Interruptor { |
| 947 public: | 906 public: |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1003 m_block.Reset(); | 962 m_block.Reset(); |
| 1004 } | 963 } |
| 1005 | 964 |
| 1006 private: | 965 private: |
| 1007 v8::TryCatch& m_block; | 966 v8::TryCatch& m_block; |
| 1008 }; | 967 }; |
| 1009 | 968 |
| 1010 } // namespace WebCore | 969 } // namespace WebCore |
| 1011 | 970 |
| 1012 #endif // V8Binding_h | 971 #endif // V8Binding_h |
| OLD | NEW |