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

Side by Side Diff: third_party/WebKit/Source/bindings/core/v8/NativeValueTraitsImplTest.cpp

Issue 2810843002: bindings: Make the sequence conversion code more complaint with WebIDL. (Closed)
Patch Set: Created 3 years, 8 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 // 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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698