Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2017 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef NativeValueTraitsImpl_h | |
| 6 #define NativeValueTraitsImpl_h | |
| 7 | |
| 8 #include "bindings/core/v8/IDLTypes.h" | |
| 9 #include "bindings/core/v8/NativeValueTraits.h" | |
| 10 #include "bindings/core/v8/SerializedScriptValue.h" | |
| 11 #include "bindings/core/v8/V8Binding.h" | |
| 12 #include "core/CoreExport.h" | |
| 13 #include "wtf/text/WTFString.h" | |
| 14 | |
| 15 namespace blink { | |
| 16 | |
| 17 // Boolean | |
| 18 template <> | |
| 19 struct NativeValueTraits<IDLBoolean> | |
| 20 : public NativeValueTraitsBase<IDLBoolean> { | |
| 21 CORE_EXPORT static inline bool nativeValue(v8::Isolate* isolate, | |
| 22 v8::Local<v8::Value> value, | |
| 23 ExceptionState& exceptionState) { | |
| 24 return toBoolean(isolate, value, exceptionState); | |
| 25 } | |
| 26 }; | |
| 27 | |
| 28 // Integers | |
| 29 // | |
| 30 // All integer specializations offer a second nativeValue() besides the default | |
| 31 // one: it takes an IntegerConversionConfiguration argument to let callers | |
| 32 // specify how the integers should be converted. The default nativeValue() | |
| 33 // overload will always use NormalConversion. | |
| 34 template <> | |
| 35 struct NativeValueTraits<IDLByte> : public NativeValueTraitsBase<IDLByte> { | |
| 36 CORE_EXPORT static inline int8_t nativeValue(v8::Isolate* isolate, | |
| 37 v8::Local<v8::Value> value, | |
| 38 ExceptionState& exceptionState) { | |
| 39 return nativeValue(isolate, value, exceptionState, NormalConversion); | |
| 40 } | |
| 41 | |
| 42 CORE_EXPORT static inline int8_t nativeValue( | |
| 43 v8::Isolate* isolate, | |
| 44 v8::Local<v8::Value> value, | |
| 45 ExceptionState& exceptionState, | |
| 46 IntegerConversionConfiguration conversionMode) { | |
| 47 return toInt8(isolate, value, conversionMode, exceptionState); | |
| 48 } | |
| 49 }; | |
| 50 | |
| 51 template <> | |
| 52 struct NativeValueTraits<IDLOctet> : public NativeValueTraitsBase<IDLOctet> { | |
| 53 CORE_EXPORT static inline uint8_t nativeValue( | |
| 54 v8::Isolate* isolate, | |
| 55 v8::Local<v8::Value> value, | |
| 56 ExceptionState& exceptionState) { | |
| 57 return nativeValue(isolate, value, exceptionState, NormalConversion); | |
| 58 } | |
| 59 | |
| 60 CORE_EXPORT static inline uint8_t nativeValue( | |
| 61 v8::Isolate* isolate, | |
| 62 v8::Local<v8::Value> value, | |
| 63 ExceptionState& exceptionState, | |
| 64 IntegerConversionConfiguration conversionMode) { | |
| 65 return toUInt8(isolate, value, conversionMode, exceptionState); | |
| 66 } | |
| 67 }; | |
| 68 | |
| 69 template <> | |
| 70 struct NativeValueTraits<IDLShort> : public NativeValueTraitsBase<IDLShort> { | |
| 71 CORE_EXPORT static inline int16_t nativeValue( | |
| 72 v8::Isolate* isolate, | |
| 73 v8::Local<v8::Value> value, | |
| 74 ExceptionState& exceptionState) { | |
| 75 return nativeValue(isolate, value, exceptionState, NormalConversion); | |
| 76 } | |
| 77 | |
| 78 CORE_EXPORT static inline int16_t nativeValue( | |
| 79 v8::Isolate* isolate, | |
| 80 v8::Local<v8::Value> value, | |
| 81 ExceptionState& exceptionState, | |
| 82 IntegerConversionConfiguration conversionMode) { | |
| 83 return toInt16(isolate, value, conversionMode, exceptionState); | |
| 84 } | |
| 85 }; | |
| 86 | |
| 87 template <> | |
| 88 struct NativeValueTraits<IDLUnsignedShort> | |
| 89 : public NativeValueTraitsBase<IDLUnsignedShort> { | |
| 90 CORE_EXPORT static inline uint16_t nativeValue( | |
| 91 v8::Isolate* isolate, | |
| 92 v8::Local<v8::Value> value, | |
| 93 ExceptionState& exceptionState) { | |
| 94 return nativeValue(isolate, value, exceptionState, NormalConversion); | |
| 95 } | |
| 96 | |
| 97 CORE_EXPORT static inline uint16_t nativeValue( | |
| 98 v8::Isolate* isolate, | |
| 99 v8::Local<v8::Value> value, | |
| 100 ExceptionState& exceptionState, | |
| 101 IntegerConversionConfiguration conversionMode) { | |
| 102 return toUInt16(isolate, value, conversionMode, exceptionState); | |
| 103 } | |
| 104 }; | |
| 105 | |
| 106 template <> | |
| 107 struct NativeValueTraits<IDLLong> : public NativeValueTraitsBase<IDLLong> { | |
| 108 CORE_EXPORT static inline int32_t nativeValue( | |
| 109 v8::Isolate* isolate, | |
| 110 v8::Local<v8::Value> value, | |
| 111 ExceptionState& exceptionState) { | |
| 112 return nativeValue(isolate, value, exceptionState, NormalConversion); | |
| 113 } | |
| 114 | |
| 115 CORE_EXPORT static inline int32_t nativeValue( | |
| 116 v8::Isolate* isolate, | |
| 117 v8::Local<v8::Value> value, | |
| 118 ExceptionState& exceptionState, | |
| 119 IntegerConversionConfiguration conversionMode) { | |
| 120 return toInt32(isolate, value, conversionMode, exceptionState); | |
| 121 } | |
| 122 }; | |
| 123 | |
| 124 template <> | |
| 125 struct NativeValueTraits<IDLUnsignedLong> | |
| 126 : public NativeValueTraitsBase<IDLUnsignedLong> { | |
| 127 CORE_EXPORT static inline uint32_t nativeValue( | |
| 128 v8::Isolate* isolate, | |
| 129 v8::Local<v8::Value> value, | |
| 130 ExceptionState& exceptionState) { | |
| 131 return nativeValue(isolate, value, exceptionState, NormalConversion); | |
| 132 } | |
| 133 | |
| 134 CORE_EXPORT static inline uint32_t nativeValue( | |
| 135 v8::Isolate* isolate, | |
| 136 v8::Local<v8::Value> value, | |
| 137 ExceptionState& exceptionState, | |
| 138 IntegerConversionConfiguration conversionMode) { | |
| 139 return toUInt32(isolate, value, conversionMode, exceptionState); | |
| 140 } | |
| 141 }; | |
| 142 | |
| 143 template <> | |
| 144 struct NativeValueTraits<IDLLongLong> | |
| 145 : public NativeValueTraitsBase<IDLLongLong> { | |
| 146 CORE_EXPORT static inline int64_t nativeValue( | |
| 147 v8::Isolate* isolate, | |
| 148 v8::Local<v8::Value> value, | |
| 149 ExceptionState& exceptionState) { | |
| 150 return nativeValue(isolate, value, exceptionState, NormalConversion); | |
| 151 } | |
| 152 | |
| 153 CORE_EXPORT static inline int64_t nativeValue( | |
| 154 v8::Isolate* isolate, | |
| 155 v8::Local<v8::Value> value, | |
| 156 ExceptionState& exceptionState, | |
| 157 IntegerConversionConfiguration conversionMode) { | |
| 158 return toInt64(isolate, value, conversionMode, exceptionState); | |
| 159 } | |
| 160 }; | |
| 161 | |
| 162 template <> | |
| 163 struct NativeValueTraits<IDLUnsignedLongLong> | |
| 164 : public NativeValueTraitsBase<IDLUnsignedLongLong> { | |
| 165 CORE_EXPORT static inline uint64_t nativeValue( | |
| 166 v8::Isolate* isolate, | |
| 167 v8::Local<v8::Value> value, | |
| 168 ExceptionState& exceptionState) { | |
| 169 return nativeValue(isolate, value, exceptionState, NormalConversion); | |
| 170 } | |
| 171 | |
| 172 CORE_EXPORT static inline uint64_t nativeValue( | |
| 173 v8::Isolate* isolate, | |
| 174 v8::Local<v8::Value> value, | |
| 175 ExceptionState& exceptionState, | |
| 176 IntegerConversionConfiguration conversionMode) { | |
| 177 return toUInt64(isolate, value, conversionMode, exceptionState); | |
| 178 } | |
| 179 }; | |
| 180 | |
| 181 // Strings | |
| 182 template <> | |
| 183 struct NativeValueTraits<IDLByteString> | |
| 184 : public NativeValueTraitsBase<IDLByteString> { | |
| 185 CORE_EXPORT static inline String nativeValue(v8::Isolate* isolate, | |
| 186 v8::Local<v8::Value> value, | |
| 187 ExceptionState& exceptionState) { | |
| 188 return toByteString(isolate, value, exceptionState); | |
| 189 } | |
| 190 }; | |
| 191 | |
| 192 template <> | |
| 193 struct NativeValueTraits<IDLString> : public NativeValueTraitsBase<IDLString> { | |
| 194 CORE_EXPORT static inline String nativeValue(v8::Isolate* isolate, | |
| 195 v8::Local<v8::Value> value, | |
| 196 ExceptionState& exceptionState) { | |
| 197 return nativeValue<V8StringResourceMode::DefaultMode>(isolate, value, | |
|
haraken
2017/03/06 12:56:33
Just to confirm: Using the DefaultMode doesn't cha
Raphael Kubo da Costa (rakuco)
2017/03/06 14:29:17
Right, that's what the specialization for WTF::Str
| |
| 198 exceptionState); | |
| 199 } | |
| 200 | |
| 201 template <V8StringResourceMode Mode = DefaultMode> | |
| 202 CORE_EXPORT static inline String nativeValue(v8::Isolate* isolate, | |
| 203 v8::Local<v8::Value> value, | |
| 204 ExceptionState& exceptionState) { | |
| 205 V8StringResource<Mode> s(value); | |
|
haraken
2017/03/06 12:56:33
s => string
Raphael Kubo da Costa (rakuco)
2017/03/06 14:29:17
Done.
| |
| 206 if (!s.prepare(isolate, exceptionState)) | |
| 207 return String(); | |
| 208 return s; | |
| 209 } | |
| 210 }; | |
| 211 | |
| 212 template <> | |
| 213 struct NativeValueTraits<IDLUSVString> | |
| 214 : public NativeValueTraitsBase<IDLUSVString> { | |
| 215 CORE_EXPORT static inline String nativeValue(v8::Isolate* isolate, | |
| 216 v8::Local<v8::Value> value, | |
| 217 ExceptionState& exceptionState) { | |
| 218 return toUSVString(isolate, value, exceptionState); | |
| 219 } | |
| 220 }; | |
| 221 | |
| 222 // Floats and doubles | |
| 223 template <> | |
| 224 struct NativeValueTraits<IDLDouble> : public NativeValueTraitsBase<IDLDouble> { | |
| 225 CORE_EXPORT static inline double nativeValue(v8::Isolate* isolate, | |
| 226 v8::Local<v8::Value> value, | |
| 227 ExceptionState& exceptionState) { | |
| 228 return toRestrictedDouble(isolate, value, exceptionState); | |
| 229 } | |
| 230 }; | |
| 231 | |
| 232 template <> | |
| 233 struct NativeValueTraits<IDLUnrestrictedDouble> | |
| 234 : public NativeValueTraitsBase<IDLUnrestrictedDouble> { | |
| 235 CORE_EXPORT static inline double nativeValue(v8::Isolate* isolate, | |
| 236 v8::Local<v8::Value> value, | |
| 237 ExceptionState& exceptionState) { | |
| 238 return toDouble(isolate, value, exceptionState); | |
| 239 } | |
| 240 }; | |
| 241 | |
| 242 template <> | |
| 243 struct NativeValueTraits<IDLFloat> : public NativeValueTraitsBase<IDLFloat> { | |
| 244 CORE_EXPORT static inline float nativeValue(v8::Isolate* isolate, | |
| 245 v8::Local<v8::Value> value, | |
| 246 ExceptionState& exceptionState) { | |
| 247 return toRestrictedFloat(isolate, value, exceptionState); | |
| 248 } | |
| 249 }; | |
| 250 | |
| 251 template <> | |
| 252 struct NativeValueTraits<IDLUnrestrictedFloat> | |
| 253 : public NativeValueTraitsBase<IDLUnrestrictedFloat> { | |
| 254 CORE_EXPORT static inline float nativeValue(v8::Isolate* isolate, | |
| 255 v8::Local<v8::Value> value, | |
| 256 ExceptionState& exceptionState) { | |
| 257 return toFloat(isolate, value, exceptionState); | |
| 258 } | |
| 259 }; | |
| 260 | |
| 261 // Promises | |
| 262 template <> | |
| 263 struct NativeValueTraits<IDLPromise> | |
| 264 : public NativeValueTraitsBase<IDLPromise> { | |
| 265 CORE_EXPORT static inline ScriptPromise nativeValue( | |
| 266 v8::Isolate* isolate, | |
| 267 v8::Local<v8::Value> value, | |
| 268 ExceptionState& exceptionState) { | |
| 269 return nativeValue(isolate, value); | |
|
haraken
2017/03/06 12:56:33
Is this used? If it's unused, we can add NOT_REACH
Raphael Kubo da Costa (rakuco)
2017/03/06 14:29:17
This one is supposed to be used by callers which h
| |
| 270 } | |
| 271 | |
| 272 CORE_EXPORT static inline ScriptPromise nativeValue( | |
| 273 v8::Isolate* isolate, | |
| 274 v8::Local<v8::Value> value) { | |
| 275 return ScriptPromise::cast(ScriptState::current(isolate), value); | |
| 276 } | |
| 277 }; | |
| 278 | |
| 279 // Type-specific overloads | |
| 280 template <> | |
| 281 struct NativeValueTraits<IDLDate> : public NativeValueTraitsBase<IDLDate> { | |
| 282 CORE_EXPORT static inline double nativeValue(v8::Isolate* isolate, | |
| 283 v8::Local<v8::Value> value, | |
| 284 ExceptionState& exceptionState) { | |
| 285 return toCoreDate(isolate, value, exceptionState); | |
| 286 } | |
| 287 }; | |
| 288 | |
| 289 template <> | |
| 290 struct NativeValueTraits<SerializedScriptValue> | |
| 291 : public NativeValueTraitsBase<SerializedScriptValue> { | |
| 292 CORE_EXPORT static inline PassRefPtr<SerializedScriptValue> nativeValue( | |
| 293 v8::Isolate* isolate, | |
| 294 v8::Local<v8::Value> value, | |
| 295 ExceptionState& exceptionState) { | |
| 296 return SerializedScriptValue::serialize(isolate, value, nullptr, nullptr, | |
| 297 exceptionState); | |
| 298 } | |
| 299 }; | |
| 300 | |
| 301 // Generated IDL interfaces. | |
| 302 template <typename T> | |
| 303 struct NativeValueTraits<T, | |
| 304 typename std::enable_if<std::is_class< | |
| 305 typename V8TypeOf<T>::Type>::value>::type> | |
|
haraken
2017/03/06 12:56:33
Add a comment about when enble_if ... returns true
| |
| 306 : public NativeValueTraitsBase<T> { | |
| 307 CORE_EXPORT static inline T* nativeValue(v8::Isolate* isolate, | |
| 308 v8::Local<v8::Value> value, | |
| 309 ExceptionState& exceptionState) { | |
| 310 return nativeValue(isolate, value); | |
| 311 } | |
| 312 | |
| 313 CORE_EXPORT static inline T* nativeValue(v8::Isolate* isolate, | |
| 314 v8::Local<v8::Value> value) { | |
| 315 return V8TypeOf<T>::Type::toImplWithTypeCheck(isolate, value); | |
|
haraken
2017/03/06 12:56:33
Just for the record, we should be careful not to u
| |
| 316 } | |
| 317 }; | |
| 318 | |
| 319 // Sequences | |
| 320 template <typename T> | |
| 321 struct NativeValueTraits<IDLSequence<T>> | |
| 322 : public NativeValueTraitsBase<IDLSequence<T>> { | |
| 323 // Nondependent types need to be explicitly qualified to be accessible. | |
| 324 using typename NativeValueTraitsBase<IDLSequence<T>>::ImplType; | |
| 325 | |
| 326 CORE_EXPORT static inline ImplType nativeValue( | |
| 327 v8::Isolate* isolate, | |
| 328 v8::Local<v8::Value> value, | |
| 329 ExceptionState& exceptionState) { | |
| 330 return nativeValue(isolate, value, exceptionState, 0); | |
| 331 } | |
| 332 | |
| 333 CORE_EXPORT static inline ImplType nativeValue(v8::Isolate* isolate, | |
| 334 v8::Local<v8::Value> value, | |
| 335 ExceptionState& exceptionState, | |
| 336 int index) { | |
| 337 return toImplArray<ImplType, T>(value, index, isolate, exceptionState); | |
| 338 } | |
| 339 }; | |
| 340 | |
| 341 } // namespace blink | |
| 342 | |
| 343 #endif // NativeValueTraitsImpl_h | |
| OLD | NEW |