| 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 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 67 v8::Handle<v8::Value> throwError(v8::Handle<v8::Value>, v8::Isolate*); | 67 v8::Handle<v8::Value> throwError(v8::Handle<v8::Value>, v8::Isolate*); |
| 68 | 68 |
| 69 // A helper for throwing JavaScript TypeError. | 69 // A helper for throwing JavaScript TypeError. |
| 70 v8::Handle<v8::Value> throwTypeError(const String&, v8::Isolate*); | 70 v8::Handle<v8::Value> throwTypeError(const String&, v8::Isolate*); |
| 71 | 71 |
| 72 // FIXME: Remove this once we kill its callers. | 72 // FIXME: Remove this once we kill its callers. |
| 73 v8::Handle<v8::Value> throwUninformativeAndGenericTypeError(v8::Isolate*); | 73 v8::Handle<v8::Value> throwUninformativeAndGenericTypeError(v8::Isolate*); |
| 74 | 74 |
| 75 v8::ArrayBuffer::Allocator* v8ArrayBufferAllocator(); | 75 v8::ArrayBuffer::Allocator* v8ArrayBufferAllocator(); |
| 76 | 76 |
| 77 v8::Handle<v8::Value> toV8Sequence(v8::Handle<v8::Value>, uint32_t& length,
bool& notASequence, v8::Isolate*); | 77 v8::Handle<v8::Value> toV8Sequence(v8::Handle<v8::Value>, uint32_t& length,
v8::Isolate*); |
| 78 | 78 |
| 79 inline v8::Handle<v8::Value> argumentOrNull(const v8::FunctionCallbackInfo<v
8::Value>& info, int index) | 79 inline v8::Handle<v8::Value> argumentOrNull(const v8::FunctionCallbackInfo<v
8::Value>& info, int index) |
| 80 { | 80 { |
| 81 return index >= info.Length() ? v8::Local<v8::Value>() : info[index]; | 81 return index >= info.Length() ? v8::Local<v8::Value>() : info[index]; |
| 82 } | 82 } |
| 83 | 83 |
| 84 // Since v8::Null(isolate) crashes if we pass a null isolate, | 84 // Since v8::Null(isolate) crashes if we pass a null isolate, |
| 85 // we need to use v8NullWithCheck(isolate) if an isolate can be null. | 85 // we need to use v8NullWithCheck(isolate) if an isolate can be null. |
| 86 // | 86 // |
| 87 // FIXME: Remove all null isolates from V8 bindings, and remove v8NullWithCh
eck(isolate). | 87 // FIXME: Remove all null isolates from V8 bindings, and remove v8NullWithCh
eck(isolate). |
| (...skipping 398 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 486 } | 486 } |
| 487 | 487 |
| 488 template <class T, class V8T> | 488 template <class T, class V8T> |
| 489 Vector<RefPtr<T> > toRefPtrNativeArray(v8::Handle<v8::Value> value, int argu
mentIndex, v8::Isolate* isolate, bool* success = 0) | 489 Vector<RefPtr<T> > toRefPtrNativeArray(v8::Handle<v8::Value> value, int argu
mentIndex, v8::Isolate* isolate, bool* success = 0) |
| 490 { | 490 { |
| 491 if (success) | 491 if (success) |
| 492 *success = true; | 492 *success = true; |
| 493 | 493 |
| 494 v8::Local<v8::Value> v8Value(v8::Local<v8::Value>::New(isolate, value)); | 494 v8::Local<v8::Value> v8Value(v8::Local<v8::Value>::New(isolate, value)); |
| 495 uint32_t length = 0; | 495 uint32_t length = 0; |
| 496 bool notASequence = false; | |
| 497 if (value->IsArray()) { | 496 if (value->IsArray()) { |
| 498 length = v8::Local<v8::Array>::Cast(v8Value)->Length(); | 497 length = v8::Local<v8::Array>::Cast(v8Value)->Length(); |
| 499 } else if (toV8Sequence(value, length, notASequence, isolate).IsEmpty())
{ | 498 } else if (toV8Sequence(value, length, isolate).IsEmpty()) { |
| 500 if (notASequence) | 499 throwTypeError(ExceptionMessages::notAnArrayTypeArgumentOrValue(argu
mentIndex), isolate); |
| 501 throwTypeError(ExceptionMessages::notAnArrayTypeArgumentOrValue(
argumentIndex), isolate); | |
| 502 return Vector<RefPtr<T> >(); | 500 return Vector<RefPtr<T> >(); |
| 503 } | 501 } |
| 504 | 502 |
| 505 return toRefPtrNativeArrayUnchecked<T, V8T>(v8Value, length, isolate, su
ccess); | 503 return toRefPtrNativeArrayUnchecked<T, V8T>(v8Value, length, isolate, su
ccess); |
| 506 } | 504 } |
| 507 | 505 |
| 508 template <class T, class V8T> | 506 template <class T, class V8T> |
| 509 Vector<RefPtr<T> > toRefPtrNativeArray(v8::Handle<v8::Value> value, const St
ring& propertyName, v8::Isolate* isolate, bool* success = 0) | 507 Vector<RefPtr<T> > toRefPtrNativeArray(v8::Handle<v8::Value> value, const St
ring& propertyName, v8::Isolate* isolate, bool* success = 0) |
| 510 { | 508 { |
| 511 if (success) | 509 if (success) |
| 512 *success = true; | 510 *success = true; |
| 513 | 511 |
| 514 v8::Local<v8::Value> v8Value(v8::Local<v8::Value>::New(isolate, value)); | 512 v8::Local<v8::Value> v8Value(v8::Local<v8::Value>::New(isolate, value)); |
| 515 uint32_t length = 0; | 513 uint32_t length = 0; |
| 516 bool notASequence = false; | |
| 517 if (value->IsArray()) { | 514 if (value->IsArray()) { |
| 518 length = v8::Local<v8::Array>::Cast(v8Value)->Length(); | 515 length = v8::Local<v8::Array>::Cast(v8Value)->Length(); |
| 519 } else if (toV8Sequence(value, length, notASequence, isolate).IsEmpty())
{ | 516 } else if (toV8Sequence(value, length, isolate).IsEmpty()) { |
| 520 if (notASequence) | 517 throwTypeError(ExceptionMessages::notASequenceTypeProperty(propertyN
ame), isolate); |
| 521 throwTypeError(ExceptionMessages::notASequenceTypeProperty(prope
rtyName), isolate); | |
| 522 return Vector<RefPtr<T> >(); | 518 return Vector<RefPtr<T> >(); |
| 523 } | 519 } |
| 524 | 520 |
| 525 return toRefPtrNativeArrayUnchecked<T, V8T>(v8Value, length, isolate, su
ccess); | 521 return toRefPtrNativeArrayUnchecked<T, V8T>(v8Value, length, isolate, su
ccess); |
| 526 } | 522 } |
| 527 | 523 |
| 528 // Converts a JavaScript value to an array as per the Web IDL specification: | 524 // Converts a JavaScript value to an array as per the Web IDL specification: |
| 529 // http://www.w3.org/TR/2012/CR-WebIDL-20120419/#es-array | 525 // http://www.w3.org/TR/2012/CR-WebIDL-20120419/#es-array |
| 530 template <class T> | 526 template <class T> |
| 531 Vector<T> toNativeArray(v8::Handle<v8::Value> value, int argumentIndex, v8::
Isolate* isolate) | 527 Vector<T> toNativeArray(v8::Handle<v8::Value> value, int argumentIndex, v8::
Isolate* isolate) |
| 532 { | 528 { |
| 533 v8::Local<v8::Value> v8Value(v8::Local<v8::Value>::New(isolate, value)); | 529 v8::Local<v8::Value> v8Value(v8::Local<v8::Value>::New(isolate, value)); |
| 534 uint32_t length = 0; | 530 uint32_t length = 0; |
| 535 bool notASequence = false; | |
| 536 if (value->IsArray()) { | 531 if (value->IsArray()) { |
| 537 length = v8::Local<v8::Array>::Cast(v8Value)->Length(); | 532 length = v8::Local<v8::Array>::Cast(v8Value)->Length(); |
| 538 } else if (toV8Sequence(value, length, notASequence, isolate).IsEmpty())
{ | 533 } else if (toV8Sequence(value, length, isolate).IsEmpty()) { |
| 539 if (notASequence) | 534 throwTypeError(ExceptionMessages::notAnArrayTypeArgumentOrValue(argu
mentIndex), isolate); |
| 540 throwTypeError(ExceptionMessages::notAnArrayTypeArgumentOrValue(
argumentIndex), isolate); | |
| 541 return Vector<T>(); | 535 return Vector<T>(); |
| 542 } | 536 } |
| 543 | 537 |
| 544 Vector<T> result; | 538 Vector<T> result; |
| 545 result.reserveInitialCapacity(length); | 539 result.reserveInitialCapacity(length); |
| 546 typedef NativeValueTraits<T> TraitsType; | 540 typedef NativeValueTraits<T> TraitsType; |
| 547 v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(v8Value); | 541 v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(v8Value); |
| 548 for (uint32_t i = 0; i < length; ++i) | 542 for (uint32_t i = 0; i < length; ++i) |
| 549 result.uncheckedAppend(TraitsType::nativeValue(object->Get(i))); | 543 result.uncheckedAppend(TraitsType::nativeValue(object->Get(i))); |
| 550 return result; | 544 return result; |
| 551 } | 545 } |
| 552 | 546 |
| 553 template <class T> | 547 template <class T> |
| 554 Vector<T> toNativeArguments(const v8::FunctionCallbackInfo<v8::Value>& info,
int startIndex) | 548 Vector<T> toNativeArguments(const v8::FunctionCallbackInfo<v8::Value>& info,
int startIndex) |
| 555 { | 549 { |
| 556 ASSERT(startIndex <= info.Length()); | 550 ASSERT(startIndex <= info.Length()); |
| 557 Vector<T> result; | 551 Vector<T> result; |
| 558 typedef NativeValueTraits<T> TraitsType; | 552 typedef NativeValueTraits<T> TraitsType; |
| 559 int length = info.Length(); | 553 int length = info.Length(); |
| 560 result.reserveInitialCapacity(length); | 554 result.reserveInitialCapacity(length); |
| 561 for (int i = startIndex; i < length; ++i) | 555 for (int i = startIndex; i < length; ++i) |
| 562 result.uncheckedAppend(TraitsType::nativeValue(info[i])); | 556 result.uncheckedAppend(TraitsType::nativeValue(info[i])); |
| 563 return result; | 557 return result; |
| 564 } | 558 } |
| 565 | 559 |
| 566 Vector<v8::Handle<v8::Value> > toVectorOfArguments(const v8::FunctionCallbac
kInfo<v8::Value>&); | 560 Vector<v8::Handle<v8::Value> > toVectorOfArguments(const v8::FunctionCallbac
kInfo<v8::Value>&); |
| 567 | 561 |
| 568 // Validates that the passed object is a sequence type per WebIDL spec | 562 // Validates that the passed object is a sequence type per WebIDL spec |
| 569 // http://www.w3.org/TR/2012/CR-WebIDL-20120419/#es-sequence | 563 // http://www.w3.org/TR/2012/CR-WebIDL-20120419/#es-sequence |
| 570 inline v8::Handle<v8::Value> toV8Sequence(v8::Handle<v8::Value> value, uint3
2_t& length, bool& notASequence, v8::Isolate* isolate) | 564 inline v8::Handle<v8::Value> toV8Sequence(v8::Handle<v8::Value> value, uint3
2_t& length, v8::Isolate* isolate) |
| 571 { | 565 { |
| 572 // Attempt converting to a sequence if the value is not already an array
but is | 566 // Attempt converting to a sequence if the value is not already an array
but is |
| 573 // any kind of object except for a native Date object or a native RegExp
object. | 567 // any kind of object except for a native Date object or a native RegExp
object. |
| 574 ASSERT(!value->IsArray()); | 568 ASSERT(!value->IsArray()); |
| 575 // FIXME: Do we really need to special case Date and RegExp object? | 569 // FIXME: Do we really need to special case Date and RegExp object? |
| 576 // https://www.w3.org/Bugs/Public/show_bug.cgi?id=22806 | 570 // https://www.w3.org/Bugs/Public/show_bug.cgi?id=22806 |
| 577 if (!value->IsObject() || value->IsDate() || value->IsRegExp()) { | 571 if (!value->IsObject() || value->IsDate() || value->IsRegExp()) { |
| 578 // Signal that the caller must handle the type error. | 572 // The caller is responsible for reporting a TypeError. |
| 579 notASequence = true; | |
| 580 return v8Undefined(); | 573 return v8Undefined(); |
| 581 } | 574 } |
| 582 | 575 |
| 583 v8::Local<v8::Value> v8Value(v8::Local<v8::Value>::New(isolate, value)); | 576 v8::Local<v8::Value> v8Value(v8::Local<v8::Value>::New(isolate, value)); |
| 584 v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(v8Value); | 577 v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(v8Value); |
| 585 | 578 |
| 586 // FIXME: The specification states that the length property should be us
ed as fallback, if value | 579 // FIXME: The specification states that the length property should be us
ed as fallback, if value |
| 587 // is not a platform object that supports indexed properties. If it supp
orts indexed properties, | 580 // is not a platform object that supports indexed properties. If it supp
orts indexed properties, |
| 588 // length should actually be one greater than value’s maximum indexed pr
operty index. | 581 // length should actually be one greater than value’s maximum indexed pr
operty index. |
| 589 V8TRYCATCH(v8::Local<v8::Value>, lengthValue, object->Get(v8::String::Ne
wSymbol("length"))); | 582 V8TRYCATCH(v8::Local<v8::Value>, lengthValue, object->Get(v8::String::Ne
wSymbol("length"))); |
| 590 | 583 |
| 591 if (lengthValue->IsUndefined() || lengthValue->IsNull()) { | 584 if (lengthValue->IsUndefined() || lengthValue->IsNull()) { |
| 592 notASequence = true; | 585 // The caller is responsible for reporting a TypeError. |
| 593 return v8Undefined(); | 586 return v8Undefined(); |
| 594 } | 587 } |
| 595 | 588 |
| 596 V8TRYCATCH(uint32_t, sequenceLength, lengthValue->Int32Value()); | 589 V8TRYCATCH(uint32_t, sequenceLength, lengthValue->Int32Value()); |
| 597 length = sequenceLength; | 590 length = sequenceLength; |
| 598 | 591 |
| 599 return v8Value; | 592 return v8Value; |
| 600 } | 593 } |
| 601 | 594 |
| 602 PassRefPtr<NodeFilter> toNodeFilter(v8::Handle<v8::Value>, v8::Isolate*); | 595 PassRefPtr<NodeFilter> toNodeFilter(v8::Handle<v8::Value>, v8::Isolate*); |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 713 | 706 |
| 714 v8::Isolate* mainThreadIsolate(); | 707 v8::Isolate* mainThreadIsolate(); |
| 715 v8::Isolate* toIsolate(ExecutionContext*); | 708 v8::Isolate* toIsolate(ExecutionContext*); |
| 716 v8::Isolate* toIsolate(Frame*); | 709 v8::Isolate* toIsolate(Frame*); |
| 717 | 710 |
| 718 // Can only be called by blink::initialize | 711 // Can only be called by blink::initialize |
| 719 void setMainThreadIsolate(v8::Isolate*); | 712 void setMainThreadIsolate(v8::Isolate*); |
| 720 } // namespace WebCore | 713 } // namespace WebCore |
| 721 | 714 |
| 722 #endif // V8Binding_h | 715 #endif // V8Binding_h |
| OLD | NEW |