| Index: third_party/WebKit/Source/platform/bindings/V8DOMWrapper.cpp
|
| diff --git a/third_party/WebKit/Source/platform/bindings/V8DOMWrapper.cpp b/third_party/WebKit/Source/platform/bindings/V8DOMWrapper.cpp
|
| index 186ca2f0102b663fa9f0a738baee8afe53280562..d2d9e79933fb37b1230b70e39db8d5e722729d31 100644
|
| --- a/third_party/WebKit/Source/platform/bindings/V8DOMWrapper.cpp
|
| +++ b/third_party/WebKit/Source/platform/bindings/V8DOMWrapper.cpp
|
| @@ -65,6 +65,50 @@ v8::Local<v8::Object> V8DOMWrapper::CreateWrapper(
|
| return wrapper;
|
| }
|
|
|
| +namespace {
|
| +
|
| +v8::Local<v8::Function> ConstructPlainType(v8::Isolate* isolate,
|
| + const DOMWrapperWorld& world,
|
| + v8::Local<v8::Context> context,
|
| + const WrapperTypeInfo* type) {
|
| + v8::Context::Scope scope(context);
|
| + // We shouldn't reach this point for the types that are implemented in v8 such
|
| + // as typed arrays and hence don't have domTemplateFunction.
|
| + DCHECK(type->dom_template_function);
|
| + v8::Local<v8::FunctionTemplate> interface_template =
|
| + type->domTemplate(isolate, world);
|
| + // Getting the function might fail if we're running out of stack or memory.
|
| + v8::Local<v8::Function> interface_object;
|
| + if (!interface_template->GetFunction(context).ToLocal(&interface_object))
|
| + return v8::Local<v8::Function>();
|
| +
|
| + if (type->parent_class) {
|
| + v8::Local<v8::Object> prototype_template =
|
| + ConstructPlainType(isolate, world, context, type->parent_class);
|
| + CHECK(interface_object->SetPrototype(context, prototype_template)
|
| + .ToChecked());
|
| + }
|
| +
|
| + v8::Local<v8::Value> prototype_value;
|
| + CHECK(interface_object->Get(context, V8AtomicString(isolate, "prototype"))
|
| + .ToLocal(&prototype_value));
|
| + CHECK(prototype_value->IsObject());
|
| + v8::Local<v8::Object> prototype_object = prototype_value.As<v8::Object>();
|
| + if (prototype_object->InternalFieldCount() ==
|
| + kV8PrototypeInternalFieldcount &&
|
| + type->wrapper_type_prototype ==
|
| + WrapperTypeInfo::kWrapperTypeObjectPrototype) {
|
| + prototype_object->SetAlignedPointerInInternalField(
|
| + kV8PrototypeTypeIndex, const_cast<WrapperTypeInfo*>(type));
|
| + }
|
| + type->PreparePrototypeAndInterfaceObject(
|
| + context, world, prototype_object, interface_object, interface_template);
|
| +
|
| + return interface_object;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| bool V8DOMWrapper::IsWrapper(v8::Isolate* isolate, v8::Local<v8::Value> value) {
|
| if (value.IsEmpty() || !value->IsObject())
|
| return false;
|
|
|