OLD | NEW |
1 // Copyright (c) 2017 The Chromium Authors. All rights reserved. | 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 | 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 #ifndef NativeValueTraitsImpl_h | 5 #ifndef NativeValueTraitsImpl_h |
6 #define NativeValueTraitsImpl_h | 6 #define NativeValueTraitsImpl_h |
7 | 7 |
8 #include "bindings/core/v8/IDLTypes.h" | 8 #include "bindings/core/v8/IDLTypes.h" |
9 #include "bindings/core/v8/NativeValueTraits.h" | 9 #include "bindings/core/v8/NativeValueTraits.h" |
10 #include "bindings/core/v8/V8BindingForCore.h" | 10 #include "bindings/core/v8/V8BindingForCore.h" |
(...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
423 return ImplType(); | 423 return ImplType(); |
424 } | 424 } |
425 v8::Local<v8::Object> v8_object = v8::Local<v8::Object>::Cast(v8_value); | 425 v8::Local<v8::Object> v8_object = v8::Local<v8::Object>::Cast(v8_value); |
426 v8::TryCatch block(isolate); | 426 v8::TryCatch block(isolate); |
427 | 427 |
428 // "3. Let keys be ? O.[[OwnPropertyKeys]]()." | 428 // "3. Let keys be ? O.[[OwnPropertyKeys]]()." |
429 v8::Local<v8::Array> keys; | 429 v8::Local<v8::Array> keys; |
430 // While we could pass v8::ONLY_ENUMERABLE below, doing so breaks | 430 // While we could pass v8::ONLY_ENUMERABLE below, doing so breaks |
431 // web-platform-tests' headers-record.html and deviates from the spec | 431 // web-platform-tests' headers-record.html and deviates from the spec |
432 // algorithm. | 432 // algorithm. |
433 // Symbols are being skipped due to | |
434 // https://github.com/heycam/webidl/issues/294. | |
435 if (!v8_object | 433 if (!v8_object |
436 ->GetOwnPropertyNames(context, | 434 ->GetOwnPropertyNames(context, |
437 static_cast<v8::PropertyFilter>( | 435 static_cast<v8::PropertyFilter>( |
438 v8::PropertyFilter::ALL_PROPERTIES | | 436 v8::PropertyFilter::ALL_PROPERTIES)) |
439 v8::PropertyFilter::SKIP_SYMBOLS)) | |
440 .ToLocal(&keys)) { | 437 .ToLocal(&keys)) { |
441 exception_state.RethrowV8Exception(block.Exception()); | 438 exception_state.RethrowV8Exception(block.Exception()); |
442 return ImplType(); | 439 return ImplType(); |
443 } | 440 } |
444 if (keys->Length() > ImplType::MaxCapacity()) { | 441 if (keys->Length() > ImplType::MaxCapacity()) { |
445 exception_state.ThrowRangeError("Array length exceeds supported limit."); | 442 exception_state.ThrowRangeError("Array length exceeds supported limit."); |
446 return ImplType(); | 443 return ImplType(); |
447 } | 444 } |
448 | 445 |
449 // "2. Let result be a new empty instance of record<K, V>." | 446 // "2. Let result be a new empty instance of record<K, V>." |
450 ImplType result; | 447 ImplType result; |
451 result.ReserveInitialCapacity(keys->Length()); | 448 result.ReserveInitialCapacity(keys->Length()); |
452 | 449 |
453 // The conversion algorithm needs a data structure with fast insertion at | 450 // The conversion algorithm needs a data structure with fast insertion at |
454 // the end while at the same time requiring fast checks for previous insert | 451 // the end while at the same time requiring fast checks for previous insert |
455 // of a given key. |seenKeys| is a key/position in |result| map that aids in | 452 // of a given key. |seenKeys| is a key/position in |result| map that aids in |
456 // the latter part. | 453 // the latter part. |
457 HashMap<String, size_t> seen_keys; | 454 HashMap<String, size_t> seen_keys; |
458 | 455 |
459 for (uint32_t i = 0; i < keys->Length(); ++i) { | 456 for (uint32_t i = 0; i < keys->Length(); ++i) { |
460 // "4. Repeat, for each element key of keys in List order:" | 457 // "4. Repeat, for each element key of keys in List order:" |
461 v8::Local<v8::Value> key; | 458 v8::Local<v8::Value> key; |
462 if (!keys->Get(context, i).ToLocal(&key)) { | 459 if (!keys->Get(context, i).ToLocal(&key)) { |
463 exception_state.RethrowV8Exception(block.Exception()); | 460 exception_state.RethrowV8Exception(block.Exception()); |
464 return ImplType(); | 461 return ImplType(); |
465 } | 462 } |
466 | 463 |
| 464 // V8's GetOwnPropertyNames() does not convert numeric property indices |
| 465 // to strings, so we have to do it ourselves. |
| 466 if (!key->IsName()) |
| 467 key = key->ToString(context).ToLocalChecked(); |
| 468 |
467 // "4.1. Let desc be ? O.[[GetOwnProperty]](key)." | 469 // "4.1. Let desc be ? O.[[GetOwnProperty]](key)." |
468 v8::Local<v8::Value> desc; | 470 v8::Local<v8::Value> desc; |
469 if (!v8_object | 471 if (!v8_object->GetOwnPropertyDescriptor(context, key.As<v8::Name>()) |
470 ->GetOwnPropertyDescriptor( | |
471 context, key->ToString(context).ToLocalChecked()) | |
472 .ToLocal(&desc)) { | 472 .ToLocal(&desc)) { |
473 exception_state.RethrowV8Exception(block.Exception()); | 473 exception_state.RethrowV8Exception(block.Exception()); |
474 return ImplType(); | 474 return ImplType(); |
475 } | 475 } |
476 | 476 |
477 // "4.2. If desc is not undefined and desc.[[Enumerable]] is true:" | 477 // "4.2. If desc is not undefined and desc.[[Enumerable]] is true:" |
478 // We can call ToLocalChecked() and ToChecked() here because | 478 // We can call ToLocalChecked() and ToChecked() here because |
479 // GetOwnPropertyDescriptor is responsible for catching any exceptions | 479 // GetOwnPropertyDescriptor is responsible for catching any exceptions |
480 // and failures, and if we got to this point of the code we have a proper | 480 // and failures, and if we got to this point of the code we have a proper |
481 // object that was not created by a user. | 481 // object that was not created by a user. |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
524 } | 524 } |
525 } | 525 } |
526 // "5. Return result." | 526 // "5. Return result." |
527 return result; | 527 return result; |
528 } | 528 } |
529 }; | 529 }; |
530 | 530 |
531 } // namespace blink | 531 } // namespace blink |
532 | 532 |
533 #endif // NativeValueTraitsImpl_h | 533 #endif // NativeValueTraitsImpl_h |
OLD | NEW |