OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (C) 2009 Google Inc. All rights reserved. | 2 * Copyright (C) 2009 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
58 // cache resulting objects or their constructors. | 58 // cache resulting objects or their constructors. |
59 const DOMWrapperWorld& world = DOMWrapperWorld::World(scope.GetContext()); | 59 const DOMWrapperWorld& world = DOMWrapperWorld::World(scope.GetContext()); |
60 wrapper = type->domTemplate(isolate, world) | 60 wrapper = type->domTemplate(isolate, world) |
61 ->InstanceTemplate() | 61 ->InstanceTemplate() |
62 ->NewInstance(scope.GetContext()) | 62 ->NewInstance(scope.GetContext()) |
63 .ToLocalChecked(); | 63 .ToLocalChecked(); |
64 } | 64 } |
65 return wrapper; | 65 return wrapper; |
66 } | 66 } |
67 | 67 |
68 namespace { | |
69 | |
70 v8::Local<v8::Function> ConstructPlainType(v8::Isolate* isolate, | |
Yuki
2017/05/30 14:35:57
Why don't you remove this function?
peria
2017/06/01 08:33:34
Done.
| |
71 const DOMWrapperWorld& world, | |
72 v8::Local<v8::Context> context, | |
73 const WrapperTypeInfo* type) { | |
74 v8::Context::Scope scope(context); | |
75 // We shouldn't reach this point for the types that are implemented in v8 such | |
76 // as typed arrays and hence don't have domTemplateFunction. | |
77 DCHECK(type->dom_template_function); | |
78 v8::Local<v8::FunctionTemplate> interface_template = | |
79 type->domTemplate(isolate, world); | |
80 // Getting the function might fail if we're running out of stack or memory. | |
81 v8::Local<v8::Function> interface_object; | |
82 if (!interface_template->GetFunction(context).ToLocal(&interface_object)) | |
83 return v8::Local<v8::Function>(); | |
84 | |
85 if (type->parent_class) { | |
86 v8::Local<v8::Object> prototype_template = | |
87 ConstructPlainType(isolate, world, context, type->parent_class); | |
88 CHECK(interface_object->SetPrototype(context, prototype_template) | |
89 .ToChecked()); | |
90 } | |
91 | |
92 v8::Local<v8::Value> prototype_value; | |
93 CHECK(interface_object->Get(context, V8AtomicString(isolate, "prototype")) | |
94 .ToLocal(&prototype_value)); | |
95 CHECK(prototype_value->IsObject()); | |
96 v8::Local<v8::Object> prototype_object = prototype_value.As<v8::Object>(); | |
97 if (prototype_object->InternalFieldCount() == | |
98 kV8PrototypeInternalFieldcount && | |
99 type->wrapper_type_prototype == | |
100 WrapperTypeInfo::kWrapperTypeObjectPrototype) { | |
101 prototype_object->SetAlignedPointerInInternalField( | |
102 kV8PrototypeTypeIndex, const_cast<WrapperTypeInfo*>(type)); | |
103 } | |
104 type->PreparePrototypeAndInterfaceObject( | |
105 context, world, prototype_object, interface_object, interface_template); | |
106 | |
107 return interface_object; | |
108 } | |
109 | |
110 } // namespace | |
111 | |
68 bool V8DOMWrapper::IsWrapper(v8::Isolate* isolate, v8::Local<v8::Value> value) { | 112 bool V8DOMWrapper::IsWrapper(v8::Isolate* isolate, v8::Local<v8::Value> value) { |
69 if (value.IsEmpty() || !value->IsObject()) | 113 if (value.IsEmpty() || !value->IsObject()) |
70 return false; | 114 return false; |
71 v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(value); | 115 v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(value); |
72 | 116 |
73 if (object->InternalFieldCount() < kV8DefaultWrapperInternalFieldCount) | 117 if (object->InternalFieldCount() < kV8DefaultWrapperInternalFieldCount) |
74 return false; | 118 return false; |
75 | 119 |
76 const WrapperTypeInfo* untrusted_wrapper_type_info = | 120 const WrapperTypeInfo* untrusted_wrapper_type_info = |
77 ToWrapperTypeInfo(object); | 121 ToWrapperTypeInfo(object); |
(...skipping 12 matching lines...) Expand all Loading... | |
90 return false; | 134 return false; |
91 | 135 |
92 const ScriptWrappable* untrusted_script_wrappable = ToScriptWrappable(object); | 136 const ScriptWrappable* untrusted_script_wrappable = ToScriptWrappable(object); |
93 const WrapperTypeInfo* untrusted_wrapper_type_info = | 137 const WrapperTypeInfo* untrusted_wrapper_type_info = |
94 ToWrapperTypeInfo(object); | 138 ToWrapperTypeInfo(object); |
95 return untrusted_script_wrappable && untrusted_wrapper_type_info && | 139 return untrusted_script_wrappable && untrusted_wrapper_type_info && |
96 untrusted_wrapper_type_info->gin_embedder == gin::kEmbedderBlink; | 140 untrusted_wrapper_type_info->gin_embedder == gin::kEmbedderBlink; |
97 } | 141 } |
98 | 142 |
99 } // namespace blink | 143 } // namespace blink |
OLD | NEW |