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

Unified Diff: Source/bindings/templates/interface.cpp

Issue 606653006: bindings: Adds DOMArrayBuffer, etc. as thin wrappers for ArrayBuffer, etc. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Synced. Created 6 years, 2 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 side-by-side diff with in-line comments
Download patch
Index: Source/bindings/templates/interface.cpp
diff --git a/Source/bindings/templates/interface.cpp b/Source/bindings/templates/interface.cpp
index 8e9b8ac9a13a00b436cfd92f3dacf20a09b670da..ce38368b6d3201436c4292e2a6377103f6ce289f 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 is_v8object %}
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,91 @@ 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_v8object %}
return V8PerIsolateData::from(isolate)->hasInstance(&wrapperTypeInfo, v8Value);
+ {% else %}
+ return v8Value->Is{{interface_name}}();
+ {% endif %}
}
+{% if is_v8object %}
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' %}
+DOMArrayBuffer* V8ArrayBuffer::toImpl(v8::Handle<v8::Object> object)
+{
+ ASSERT(object->IsArrayBuffer());
+ v8::Local<v8::ArrayBuffer> v8buffer = object.As<v8::ArrayBuffer>();
+ if (v8buffer->IsExternal()) {
+ RELEASE_ASSERT(toWrapperTypeInfo(object)->ginEmbedder == gin::kEmbedderBlink);
+ return blink::toScriptWrappableBase(object)->toImpl<DOMArrayBuffer>();
+ }
+
+ v8::ArrayBuffer::Contents v8Contents = v8buffer->Externalize();
+ WTF::ArrayBufferContents contents(v8Contents.Data(), v8Contents.ByteLength(), 0);
+ RefPtr<DOMArrayBuffer> buffer = DOMArrayBuffer::create(contents);
+ buffer->associateWithWrapper(buffer->wrapperTypeInfo(), object, v8::Isolate::GetCurrent());
+
+ return blink::toScriptWrappableBase(object)->toImpl<DOMArrayBuffer>();
+}
+{% elif interface_name == 'ArrayBufferView' %}
+DOMArrayBufferView* V8ArrayBufferView::toImpl(v8::Handle<v8::Object> object)
+{
+ ASSERT(object->IsArrayBufferView());
+ ScriptWrappableBase* internalPointer = blink::toScriptWrappableBase(object);
+ if (internalPointer)
haraken 2014/10/16 05:41:41 BTW, let's rename internalPointer to scriptWrappab
Yuki 2014/10/16 14:21:50 Will do.
+ return internalPointer->toImpl<DOMArrayBufferView>();
+
+ 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_type %}
+{{cpp_class}}* {{v8_class}}::toImpl(v8::Handle<v8::Object> object)
+{
+ ASSERT(object->Is{{interface_name}}());
+ ScriptWrappableBase* internalPointer = blink::toScriptWrappableBase(object);
+ if (internalPointer)
haraken 2014/10/16 05:41:41 We have the internalPointer check both in V8ArrayB
Yuki 2014/10/16 14:21:50 It's a matter of the speed performance. Obviously
+ 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());
+
+ internalPointer = blink::toScriptWrappableBase(object);
+ ASSERT(internalPointer);
haraken 2014/10/16 05:41:41 ASSERT(internalPointer == typedArray) ?
Yuki 2014/10/16 14:21:50 Done.
+ return internalPointer->toImpl<{{cpp_class}}>();
haraken 2014/10/16 05:41:41 Actually it's redundant to get an internalPointer
Yuki 2014/10/16 14:21:50 Done.
+}
+{% endif %}
{% endblock %}
@@ -754,7 +833,7 @@ 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)
{
- return hasInstance(value, isolate) ? blink::toScriptWrappableBase(v8::Handle<v8::Object>::Cast(value))->toImpl<{{cpp_class}}>() : 0;
+ return hasInstance(value, isolate) ? toImpl(v8::Handle<v8::Object>::Cast(value)) : 0;
}
{% endblock %}

Powered by Google App Engine
This is Rietveld 408576698