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

Unified Diff: third_party/WebKit/Source/platform/bindings/V8DOMWrapper.cpp

Issue 2841443005: [Bindings] Create and use V8 context snapshots (Closed)
Patch Set: Work for most comments Created 3 years, 7 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: 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,
Yuki 2017/05/30 14:35:57 Why don't you remove this function?
peria 2017/06/01 08:33:34 Done.
+ 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;

Powered by Google App Engine
This is Rietveld 408576698