Home | History | Annotate | Download | only in gin
      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 
     10 using v8::ArrayBuffer;
     11 using v8::Eternal;
     12 using v8::Isolate;
     13 using v8::Local;
     14 using v8::Object;
     15 using v8::FunctionTemplate;
     16 using v8::ObjectTemplate;
     17 
     18 namespace gin {
     19 
     20 PerIsolateData::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 
     28 PerIsolateData::~PerIsolateData() {
     29   isolate_->SetData(kEmbedderNativeGin, NULL);
     30 }
     31 
     32 PerIsolateData* PerIsolateData::From(Isolate* isolate) {
     33   return static_cast<PerIsolateData*>(isolate->GetData(kEmbedderNativeGin));
     34 }
     35 
     36 void PerIsolateData::SetObjectTemplate(WrapperInfo* info,
     37                                        Local<ObjectTemplate> templ) {
     38   object_templates_[info] = Eternal<ObjectTemplate>(isolate_, templ);
     39 }
     40 
     41 void PerIsolateData::SetFunctionTemplate(WrapperInfo* info,
     42                                          Local<FunctionTemplate> templ) {
     43   function_templates_[info] = Eternal<FunctionTemplate>(isolate_, templ);
     44 }
     45 
     46 v8::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 
     54 v8::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 
     62 void PerIsolateData::SetIndexedPropertyInterceptor(
     63     WrappableBase* base,
     64     IndexedPropertyInterceptor* interceptor) {
     65   indexed_interceptors_[base] = interceptor;
     66 }
     67 
     68 void PerIsolateData::SetNamedPropertyInterceptor(
     69     WrappableBase* base,
     70     NamedPropertyInterceptor* interceptor) {
     71   named_interceptors_[base] = interceptor;
     72 }
     73 
     74 void 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 
     84 void 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 
     94 IndexedPropertyInterceptor* 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 
    103 NamedPropertyInterceptor* 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