1// Copyright 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "base/logging.h" 6#include "base/message_loop/message_loop_proxy.h" 7#include "gin/per_isolate_data.h" 8#include "gin/public/gin_embedders.h" 9 10using v8::ArrayBuffer; 11using v8::Eternal; 12using v8::Isolate; 13using v8::Local; 14using v8::Object; 15using v8::FunctionTemplate; 16using v8::ObjectTemplate; 17 18namespace gin { 19 20PerIsolateData::PerIsolateData(Isolate* isolate, 21 ArrayBuffer::Allocator* allocator) 22 : isolate_(isolate), 23 allocator_(allocator), 24 message_loop_proxy_(base::MessageLoopProxy::current()) { 25 isolate_->SetData(kEmbedderNativeGin, this); 26} 27 28PerIsolateData::~PerIsolateData() { 29 isolate_->SetData(kEmbedderNativeGin, NULL); 30} 31 32PerIsolateData* PerIsolateData::From(Isolate* isolate) { 33 return static_cast<PerIsolateData*>(isolate->GetData(kEmbedderNativeGin)); 34} 35 36void PerIsolateData::SetObjectTemplate(WrapperInfo* info, 37 Local<ObjectTemplate> templ) { 38 object_templates_[info] = Eternal<ObjectTemplate>(isolate_, templ); 39} 40 41void PerIsolateData::SetFunctionTemplate(WrapperInfo* info, 42 Local<FunctionTemplate> templ) { 43 function_templates_[info] = Eternal<FunctionTemplate>(isolate_, templ); 44} 45 46v8::Local<v8::ObjectTemplate> PerIsolateData::GetObjectTemplate( 47 WrapperInfo* info) { 48 ObjectTemplateMap::iterator it = object_templates_.find(info); 49 if (it == object_templates_.end()) 50 return v8::Local<v8::ObjectTemplate>(); 51 return it->second.Get(isolate_); 52} 53 54v8::Local<v8::FunctionTemplate> PerIsolateData::GetFunctionTemplate( 55 WrapperInfo* info) { 56 FunctionTemplateMap::iterator it = function_templates_.find(info); 57 if (it == function_templates_.end()) 58 return v8::Local<v8::FunctionTemplate>(); 59 return it->second.Get(isolate_); 60} 61 62void PerIsolateData::SetIndexedPropertyInterceptor( 63 WrappableBase* base, 64 IndexedPropertyInterceptor* interceptor) { 65 indexed_interceptors_[base] = interceptor; 66} 67 68void PerIsolateData::SetNamedPropertyInterceptor( 69 WrappableBase* base, 70 NamedPropertyInterceptor* interceptor) { 71 named_interceptors_[base] = interceptor; 72} 73 74void PerIsolateData::ClearIndexedPropertyInterceptor( 75 WrappableBase* base, 76 IndexedPropertyInterceptor* interceptor) { 77 IndexedPropertyInterceptorMap::iterator it = indexed_interceptors_.find(base); 78 if (it != indexed_interceptors_.end()) 79 indexed_interceptors_.erase(it); 80 else 81 NOTREACHED(); 82} 83 84void PerIsolateData::ClearNamedPropertyInterceptor( 85 WrappableBase* base, 86 NamedPropertyInterceptor* interceptor) { 87 NamedPropertyInterceptorMap::iterator it = named_interceptors_.find(base); 88 if (it != named_interceptors_.end()) 89 named_interceptors_.erase(it); 90 else 91 NOTREACHED(); 92} 93 94IndexedPropertyInterceptor* PerIsolateData::GetIndexedPropertyInterceptor( 95 WrappableBase* base) { 96 IndexedPropertyInterceptorMap::iterator it = indexed_interceptors_.find(base); 97 if (it != indexed_interceptors_.end()) 98 return it->second; 99 else 100 return NULL; 101} 102 103NamedPropertyInterceptor* PerIsolateData::GetNamedPropertyInterceptor( 104 WrappableBase* base) { 105 NamedPropertyInterceptorMap::iterator it = named_interceptors_.find(base); 106 if (it != named_interceptors_.end()) 107 return it->second; 108 else 109 return NULL; 110} 111 112} // namespace gin 113