Index: Source/bindings/templates/interface.cpp |
diff --git a/Source/bindings/templates/interface.cpp b/Source/bindings/templates/interface.cpp |
index 62ef12032a44491e9b7ddde3325162c119766708..0823552d536cd4f0beee8af4fc6702beeacf70eb 100644 |
--- a/Source/bindings/templates/interface.cpp |
+++ b/Source/bindings/templates/interface.cpp |
@@ -727,11 +727,13 @@ V8DOMConfiguration::installAttribute({{method.function_template}}, v8::Handle<v8 |
{##############################################################################} |
{% block get_dom_template %} |
+{% if not is_array_buffer_or_view %} |
v8::Handle<v8::FunctionTemplate> {{v8_class}}::domTemplate(v8::Isolate* isolate) |
{ |
return V8DOMConfiguration::domClassTemplate(isolate, const_cast<WrapperTypeInfo*>(&wrapperTypeInfo), install{{v8_class}}Template); |
} |
+{% endif %} |
{% endblock %} |
@@ -739,14 +741,98 @@ v8::Handle<v8::FunctionTemplate> {{v8_class}}::domTemplate(v8::Isolate* isolate) |
{% block has_instance %} |
bool {{v8_class}}::hasInstance(v8::Handle<v8::Value> v8Value, v8::Isolate* isolate) |
{ |
+ {% if is_array_buffer_or_view %} |
+ return v8Value->Is{{interface_name}}(); |
+ {% else %} |
return V8PerIsolateData::from(isolate)->hasInstance(&wrapperTypeInfo, v8Value); |
+ {% endif %} |
} |
+{% if not is_array_buffer_or_view %} |
v8::Handle<v8::Object> {{v8_class}}::findInstanceInPrototypeChain(v8::Handle<v8::Value> v8Value, v8::Isolate* isolate) |
{ |
return V8PerIsolateData::from(isolate)->findInstanceInPrototypeChain(&wrapperTypeInfo, v8Value); |
} |
+{% endif %} |
+{% endblock %} |
+ |
+ |
+{##############################################################################} |
+{% block to_impl %} |
+{% if interface_name == 'ArrayBuffer' %} |
+{{cpp_class}}* V8ArrayBuffer::toImpl(v8::Handle<v8::Object> object) |
+{ |
+ ASSERT(object->IsArrayBuffer()); |
+ v8::Local<v8::ArrayBuffer> v8buffer = object.As<v8::ArrayBuffer>(); |
+ if (v8buffer->IsExternal()) { |
+ const WrapperTypeInfo* wrapperTypeInfo = toWrapperTypeInfo(object); |
+ RELEASE_ASSERT(wrapperTypeInfo); |
+ RELEASE_ASSERT(wrapperTypeInfo->ginEmbedder == gin::kEmbedderBlink); |
+ return blink::toScriptWrappableBase(object)->toImpl<{{cpp_class}}>(); |
+ } |
+ |
+ v8::ArrayBuffer::Contents v8Contents = v8buffer->Externalize(); |
+ // This special way to create ArrayBuffer via ArrayBufferContents makes the |
+ // underlying ArrayBufferContents not call ArrayBufferDeallocationObserver:: |
+ // blinkAllocatedMemory. The array buffer created by V8 already called it, |
+ // so we shouldn't call it. |
+ WTF::ArrayBufferContents contents(v8Contents.Data(), v8Contents.ByteLength(), DOMArrayBufferDeallocationObserver::instance()); |
+ RefPtr<{{cpp_class}}> buffer = {{cpp_class}}::create(contents); |
+ buffer->associateWithWrapper(buffer->wrapperTypeInfo(), object, v8::Isolate::GetCurrent()); |
+ |
+ return blink::toScriptWrappableBase(object)->toImpl<{{cpp_class}}>(); |
+} |
+ |
+{% elif interface_name == 'ArrayBufferView' %} |
+{{cpp_class}}* V8ArrayBufferView::toImpl(v8::Handle<v8::Object> object) |
+{ |
+ ASSERT(object->IsArrayBufferView()); |
+ ScriptWrappableBase* internalPointer = blink::toScriptWrappableBase(object); |
+ if (internalPointer) |
+ return internalPointer->toImpl<{{cpp_class}}>(); |
+ |
+ if (object->IsInt8Array()) |
+ return V8Int8Array::toImpl(object); |
+ if (object->IsInt16Array()) |
+ return V8Int16Array::toImpl(object); |
+ if (object->IsInt32Array()) |
+ return V8Int32Array::toImpl(object); |
+ if (object->IsUint8Array()) |
+ return V8Uint8Array::toImpl(object); |
+ if (object->IsUint8ClampedArray()) |
+ return V8Uint8ClampedArray::toImpl(object); |
+ if (object->IsUint16Array()) |
+ return V8Uint16Array::toImpl(object); |
+ if (object->IsUint32Array()) |
+ return V8Uint32Array::toImpl(object); |
+ if (object->IsFloat32Array()) |
+ return V8Float32Array::toImpl(object); |
+ if (object->IsFloat64Array()) |
+ return V8Float64Array::toImpl(object); |
+ if (object->IsDataView()) |
+ return V8DataView::toImpl(object); |
+ |
+ ASSERT_NOT_REACHED(); |
+ return 0; |
+} |
+ |
+{% elif is_array_buffer_or_view %} |
+{{cpp_class}}* {{v8_class}}::toImpl(v8::Handle<v8::Object> object) |
+{ |
+ ASSERT(object->Is{{interface_name}}()); |
+ ScriptWrappableBase* internalPointer = blink::toScriptWrappableBase(object); |
+ if (internalPointer) |
+ return internalPointer->toImpl<{{cpp_class}}>(); |
+ |
+ v8::Handle<v8::{{interface_name}}> v8View = object.As<v8::{{interface_name}}>(); |
+ RefPtr<{{cpp_class}}> typedArray = {{cpp_class}}::create(V8ArrayBuffer::toImpl(v8View->Buffer()), v8View->ByteOffset(), v8View->{% if interface_name == 'DataView' %}Byte{% endif %}Length()); |
+ typedArray->associateWithWrapper(typedArray->wrapperTypeInfo(), object, v8::Isolate::GetCurrent()); |
+ |
+ return typedArray->toImpl<{{cpp_class}}>(); |
+} |
+ |
+{% endif %} |
{% endblock %} |
@@ -754,7 +840,11 @@ v8::Handle<v8::Object> {{v8_class}}::findInstanceInPrototypeChain(v8::Handle<v8: |
{% block to_impl_with_type_check %} |
{{cpp_class}}* {{v8_class}}::toImplWithTypeCheck(v8::Isolate* isolate, v8::Handle<v8::Value> value) |
{ |
+ {% if is_array_buffer_or_view %} |
+ return hasInstance(value, isolate) ? toImpl(v8::Handle<v8::Object>::Cast(value)) : 0; |
+ {% else %} |
return hasInstance(value, isolate) ? blink::toScriptWrappableBase(v8::Handle<v8::Object>::Cast(value))->toImpl<{{cpp_class}}>() : 0; |
+ {% endif %} |
} |
{% endblock %} |
@@ -855,7 +945,6 @@ v8::Handle<v8::Object> {{v8_class}}::createWrapper({{pass_cpp_type}} impl, v8::H |
{##############################################################################} |
{% block deref_object_and_to_v8_no_inline %} |
- |
void {{v8_class}}::refObject(ScriptWrappableBase* internalPointer) |
{ |
{% if gc_type == 'WillBeGarbageCollectedObject' %} |