Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / gin / per_isolate_data.cc
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