OLD | NEW |
1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "bindings/core/v8/NativeValueTraitsImpl.h" | 5 #include "bindings/core/v8/NativeValueTraitsImpl.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 #include "bindings/core/v8/ExceptionState.h" | 8 #include "bindings/core/v8/ExceptionState.h" |
9 #include "bindings/core/v8/IDLTypes.h" | 9 #include "bindings/core/v8/IDLTypes.h" |
10 #include "bindings/core/v8/TestSequenceCallback.h" | 10 #include "bindings/core/v8/TestSequenceCallback.h" |
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
266 const auto& record = | 266 const auto& record = |
267 NativeValueTraits<IDLRecord<IDLString, IDLSequence<IDLString>>>:: | 267 NativeValueTraits<IDLRecord<IDLString, IDLSequence<IDLString>>>:: |
268 NativeValue(scope.GetIsolate(), v8_object, exception_state); | 268 NativeValue(scope.GetIsolate(), v8_object, exception_state); |
269 EXPECT_EQ(1U, record.size()); | 269 EXPECT_EQ(1U, record.size()); |
270 EXPECT_EQ("foo", record[0].first); | 270 EXPECT_EQ("foo", record[0].first); |
271 EXPECT_EQ("Hello, World!", record[0].second[0]); | 271 EXPECT_EQ("Hello, World!", record[0].second[0]); |
272 EXPECT_EQ("Hi, Mom!", record[0].second[1]); | 272 EXPECT_EQ("Hi, Mom!", record[0].second[1]); |
273 } | 273 } |
274 } | 274 } |
275 | 275 |
| 276 TEST(NativeValueTraitsImplTest, IDLSequence) { |
| 277 V8TestingScope scope; |
| 278 { |
| 279 v8::Local<v8::Array> v8_array = v8::Array::New(scope.GetIsolate()); |
| 280 NonThrowableExceptionState exception_state; |
| 281 const auto& sequence = |
| 282 NativeValueTraits<IDLSequence<IDLOctet>>::NativeValue( |
| 283 scope.GetIsolate(), v8_array, exception_state); |
| 284 EXPECT_TRUE(sequence.IsEmpty()); |
| 285 } |
| 286 { |
| 287 v8::Local<v8::Array> v8_array = v8::Array::New(scope.GetIsolate()); |
| 288 for (int32_t i = 0; i < 5; ++i) { |
| 289 v8_array->Set(scope.GetContext(), ToV8(&scope, i), ToV8(&scope, i)) |
| 290 .ToChecked(); |
| 291 } |
| 292 NonThrowableExceptionState exception_state; |
| 293 const auto& sequence = NativeValueTraits<IDLSequence<IDLLong>>::NativeValue( |
| 294 scope.GetIsolate(), v8_array, exception_state); |
| 295 EXPECT_EQ(Vector<int32_t>({0, 1, 2, 3, 4}), sequence); |
| 296 } |
| 297 { |
| 298 const double double_pi = 3.141592653589793238; |
| 299 const float float_pi = double_pi; |
| 300 v8::Local<v8::Array> v8_real_array = v8::Array::New(scope.GetIsolate(), 1); |
| 301 v8_real_array |
| 302 ->Set(scope.GetContext(), ToV8(&scope, 0), ToV8(&scope, double_pi)) |
| 303 .ToChecked(); |
| 304 |
| 305 NonThrowableExceptionState exception_state; |
| 306 Vector<double> double_vector = |
| 307 NativeValueTraits<IDLSequence<IDLDouble>>::NativeValue( |
| 308 scope.GetIsolate(), v8_real_array, exception_state); |
| 309 EXPECT_EQ(1U, double_vector.size()); |
| 310 EXPECT_EQ(double_pi, double_vector[0]); |
| 311 |
| 312 Vector<float> float_vector = |
| 313 NativeValueTraits<IDLSequence<IDLFloat>>::NativeValue( |
| 314 scope.GetIsolate(), v8_real_array, exception_state); |
| 315 EXPECT_EQ(1U, float_vector.size()); |
| 316 EXPECT_EQ(float_pi, float_vector[0]); |
| 317 } |
| 318 { |
| 319 v8::Local<v8::Array> v8_array = v8::Array::New(scope.GetIsolate(), 3); |
| 320 EXPECT_TRUE(v8_array |
| 321 ->Set(scope.GetContext(), ToV8(&scope, 0), |
| 322 ToV8(&scope, "Vini, vidi, vici.")) |
| 323 .ToChecked()); |
| 324 EXPECT_TRUE( |
| 325 v8_array->Set(scope.GetContext(), ToV8(&scope, 1), ToV8(&scope, 65535)) |
| 326 .ToChecked()); |
| 327 EXPECT_TRUE( |
| 328 v8_array->Set(scope.GetContext(), ToV8(&scope, 2), ToV8(&scope, 0.125)) |
| 329 .ToChecked()); |
| 330 |
| 331 NonThrowableExceptionState exception_state; |
| 332 Vector<ScriptValue> script_value_vector = |
| 333 NativeValueTraits<IDLSequence<ScriptValue>>::NativeValue( |
| 334 scope.GetIsolate(), v8_array, exception_state); |
| 335 EXPECT_EQ(3U, script_value_vector.size()); |
| 336 String report_on_zela; |
| 337 EXPECT_TRUE(script_value_vector[0].ToString(report_on_zela)); |
| 338 EXPECT_EQ("Vini, vidi, vici.", report_on_zela); |
| 339 EXPECT_EQ(65535U, |
| 340 ToUInt32(scope.GetIsolate(), script_value_vector[1].V8Value(), |
| 341 kNormalConversion, exception_state)); |
| 342 } |
| 343 { |
| 344 v8::Local<v8::Array> v8_string_array1 = |
| 345 v8::Array::New(scope.GetIsolate(), 2); |
| 346 EXPECT_TRUE( |
| 347 v8_string_array1 |
| 348 ->Set(scope.GetContext(), ToV8(&scope, 0), ToV8(&scope, "foo")) |
| 349 .ToChecked()); |
| 350 EXPECT_TRUE( |
| 351 v8_string_array1 |
| 352 ->Set(scope.GetContext(), ToV8(&scope, 1), ToV8(&scope, "bar")) |
| 353 .ToChecked()); |
| 354 v8::Local<v8::Array> v8_string_array2 = |
| 355 v8::Array::New(scope.GetIsolate(), 3); |
| 356 EXPECT_TRUE( |
| 357 v8_string_array2 |
| 358 ->Set(scope.GetContext(), ToV8(&scope, 0), ToV8(&scope, "x")) |
| 359 .ToChecked()); |
| 360 EXPECT_TRUE( |
| 361 v8_string_array2 |
| 362 ->Set(scope.GetContext(), ToV8(&scope, 1), ToV8(&scope, "y")) |
| 363 .ToChecked()); |
| 364 EXPECT_TRUE( |
| 365 v8_string_array2 |
| 366 ->Set(scope.GetContext(), ToV8(&scope, 2), ToV8(&scope, "z")) |
| 367 .ToChecked()); |
| 368 v8::Local<v8::Array> v8_string_array_array = |
| 369 v8::Array::New(scope.GetIsolate(), 2); |
| 370 EXPECT_TRUE(v8_string_array_array |
| 371 ->Set(scope.GetContext(), ToV8(&scope, 0), v8_string_array1) |
| 372 .ToChecked()); |
| 373 EXPECT_TRUE(v8_string_array_array |
| 374 ->Set(scope.GetContext(), ToV8(&scope, 1), v8_string_array2) |
| 375 .ToChecked()); |
| 376 |
| 377 NonThrowableExceptionState exception_state; |
| 378 Vector<Vector<String>> string_vector_vector = |
| 379 NativeValueTraits<IDLSequence<IDLSequence<IDLString>>>::NativeValue( |
| 380 scope.GetIsolate(), v8_string_array_array, exception_state); |
| 381 EXPECT_EQ(2U, string_vector_vector.size()); |
| 382 EXPECT_EQ(2U, string_vector_vector[0].size()); |
| 383 EXPECT_EQ("foo", string_vector_vector[0][0]); |
| 384 EXPECT_EQ("bar", string_vector_vector[0][1]); |
| 385 EXPECT_EQ(3U, string_vector_vector[1].size()); |
| 386 EXPECT_EQ("x", string_vector_vector[1][0]); |
| 387 EXPECT_EQ("y", string_vector_vector[1][1]); |
| 388 EXPECT_EQ("z", string_vector_vector[1][2]); |
| 389 } |
| 390 { |
| 391 v8::Local<v8::String> script_code = |
| 392 ToV8(&scope, |
| 393 "let arr = [1, 2, 3];" |
| 394 "let iterations = [" |
| 395 " {done: false, value: 8}," |
| 396 " {done: false, value: 5}," |
| 397 " {done: true}" |
| 398 "];" |
| 399 "arr[Symbol.iterator] = function() {" |
| 400 " let i = 0;" |
| 401 " return {next: () => iterations[i++]};" |
| 402 "}; arr") |
| 403 .As<v8::String>(); |
| 404 v8::MicrotasksScope microtasks(scope.GetIsolate(), |
| 405 v8::MicrotasksScope::kDoNotRunMicrotasks); |
| 406 v8::Local<v8::Value> v8_array = |
| 407 v8::Script::Compile(scope.GetContext(), script_code) |
| 408 .ToLocalChecked() |
| 409 ->Run(scope.GetContext()) |
| 410 .ToLocalChecked(); |
| 411 EXPECT_TRUE(v8_array->IsArray()); |
| 412 |
| 413 NonThrowableExceptionState exception_state; |
| 414 const auto& sequence = NativeValueTraits<IDLSequence<IDLByte>>::NativeValue( |
| 415 scope.GetIsolate(), v8_array, exception_state); |
| 416 EXPECT_EQ(Vector<int8_t>({1, 2, 3}), sequence); |
| 417 } |
| 418 { |
| 419 v8::Local<v8::String> script_code = |
| 420 ToV8(&scope, |
| 421 "let obj = {" |
| 422 " iterations: [" |
| 423 " {done: false, value: 55}," |
| 424 " {done: false, value: 0}," |
| 425 " {done: true, value: 99}" |
| 426 " ]," |
| 427 " [Symbol.iterator]() {" |
| 428 " let i = 0;" |
| 429 " return {next: () => this.iterations[i++]};" |
| 430 " }" |
| 431 "}; obj") |
| 432 .As<v8::String>(); |
| 433 v8::MicrotasksScope microtasks(scope.GetIsolate(), |
| 434 v8::MicrotasksScope::kDoNotRunMicrotasks); |
| 435 v8::Local<v8::Value> v8_object = |
| 436 v8::Script::Compile(scope.GetContext(), script_code) |
| 437 .ToLocalChecked() |
| 438 ->Run(scope.GetContext()) |
| 439 .ToLocalChecked(); |
| 440 EXPECT_TRUE(v8_object->IsObject()); |
| 441 |
| 442 NonThrowableExceptionState exception_state; |
| 443 const auto& byte_sequence = |
| 444 NativeValueTraits<IDLSequence<IDLByte>>::NativeValue( |
| 445 scope.GetIsolate(), v8_object, exception_state); |
| 446 EXPECT_EQ(Vector<int8_t>({55, 0}), byte_sequence); |
| 447 const auto& boolean_sequence = |
| 448 NativeValueTraits<IDLSequence<IDLBoolean>>::NativeValue( |
| 449 scope.GetIsolate(), v8_object, exception_state); |
| 450 EXPECT_EQ(Vector<bool>({true, false}), boolean_sequence); |
| 451 } |
| 452 } |
| 453 |
276 } // namespace | 454 } // namespace |
277 | 455 |
278 } // namespace blink | 456 } // namespace blink |
OLD | NEW |