Index: third_party/WebKit/Source/bindings/core/v8/V8DOMConfiguration.cpp |
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8DOMConfiguration.cpp b/third_party/WebKit/Source/bindings/core/v8/V8DOMConfiguration.cpp |
index 5c35cc01aad088b6736f297559db5aff0425a197..e23a994719b2f092f239e9de999ad746924da681 100644 |
--- a/third_party/WebKit/Source/bindings/core/v8/V8DOMConfiguration.cpp |
+++ b/third_party/WebKit/Source/bindings/core/v8/V8DOMConfiguration.cpp |
@@ -28,8 +28,14 @@ |
#include "bindings/core/v8/V8DOMConfiguration.h" |
+#include "bindings/core/v8/V8Document.h" |
+#include "bindings/core/v8/V8EventTarget.h" |
+#include "bindings/core/v8/V8HTMLDocument.h" |
+#include "bindings/core/v8/V8Node.h" |
#include "bindings/core/v8/V8ObjectConstructor.h" |
#include "bindings/core/v8/V8PerContextData.h" |
+#include "bindings/core/v8/V8SnapshotCreator.h" |
+#include "bindings/core/v8/V8Window.h" |
#include "platform/instrumentation/tracing/TraceEvent.h" |
namespace blink { |
@@ -678,16 +684,52 @@ v8::Local<v8::FunctionTemplate> V8DOMConfiguration::DomClassTemplate( |
WrapperTypeInfo* wrapper_type_info, |
InstallTemplateFunction configure_dom_class_template) { |
V8PerIsolateData* data = V8PerIsolateData::From(isolate); |
- v8::Local<v8::FunctionTemplate> result = |
+ v8::Local<v8::FunctionTemplate> interface_template = |
data->FindInterfaceTemplate(world, wrapper_type_info); |
- if (!result.IsEmpty()) |
- return result; |
- |
- result = v8::FunctionTemplate::New( |
- isolate, V8ObjectConstructor::IsValidConstructorMode); |
- configure_dom_class_template(isolate, world, result); |
- data->SetInterfaceTemplate(world, wrapper_type_info, result); |
- return result; |
+ if (!interface_template.IsEmpty()) |
+ return interface_template; |
+ |
+ if (V8SnapshotCreator::TakingSnapshot()) { |
+ interface_template = |
+ data->FindInterfaceTemplateTemp(world, wrapper_type_info); |
+ if (!interface_template.IsEmpty()) |
+ return interface_template; |
+ } else if (data->UseSnapshot()) { |
+ static const WrapperTypeInfo* snapshot_types[] = { |
+ &V8EventTarget::wrapperTypeInfo, &V8Window::wrapperTypeInfo, |
+ &V8Node::wrapperTypeInfo, &V8Document::wrapperTypeInfo, |
+ &V8HTMLDocument::wrapperTypeInfo, |
+ }; |
+ const int index_offset = |
+ world.IsMainWorld() ? 0 : WTF_ARRAY_LENGTH(snapshot_types); |
+ |
+ // Snapshotted templates are expected to be used just to get |
+ // wrapper_type_info. |
+ for (size_t i = 0; i < WTF_ARRAY_LENGTH(snapshot_types); ++i) { |
+ if (snapshot_types[i]->Equals(wrapper_type_info)) { |
+ if (v8::FunctionTemplate::FromSnapshot(isolate, index_offset + i) |
+ .ToLocal(&interface_template)) { |
+ } |
+ break; |
+ } |
+ } |
+ } |
+ |
+ if (interface_template.IsEmpty()) { |
+ interface_template = v8::FunctionTemplate::New( |
+ isolate, V8ObjectConstructor::IsValidConstructorMode); |
+ configure_dom_class_template(isolate, world, interface_template); |
+ } |
+ CHECK(!interface_template.IsEmpty()); |
+ |
+ if (V8SnapshotCreator::TakingSnapshot()) { |
+ data->SetInterfaceTemplateTemp(world, wrapper_type_info, |
+ interface_template); |
+ } else { |
+ data->SetInterfaceTemplate(world, wrapper_type_info, interface_template); |
+ } |
+ |
+ return interface_template; |
} |
void V8DOMConfiguration::SetClassString( |