| 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 64ae1f846a5223c03719cc644e5b850749c2c1a3..9cee95448666affe4c841de07f85ea3c1612ad68 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( | 
|  |