blob: 9d2d6b248e485a9559df447b7f0fb3cded4cead2 [file] [log] [blame]
James Robinsona9763132014-10-06 11:18:13 -07001// 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"
James Robinsonc4d0fb22016-01-28 14:31:21 -08006#include "base/message_loop/message_loop.h"
7#include "base/single_thread_task_runner.h"
James Robinsona9763132014-10-06 11:18:13 -07008#include "gin/per_isolate_data.h"
9#include "gin/public/gin_embedders.h"
10
11using v8::ArrayBuffer;
12using v8::Eternal;
13using v8::Isolate;
14using v8::Local;
15using v8::Object;
16using v8::FunctionTemplate;
17using v8::ObjectTemplate;
18
19namespace gin {
20
21PerIsolateData::PerIsolateData(Isolate* isolate,
22 ArrayBuffer::Allocator* allocator)
23 : isolate_(isolate),
24 allocator_(allocator),
James Robinsonc4d0fb22016-01-28 14:31:21 -080025 task_runner_(base::MessageLoop::current()->task_runner()) {
James Robinsona9763132014-10-06 11:18:13 -070026 isolate_->SetData(kEmbedderNativeGin, this);
27}
28
29PerIsolateData::~PerIsolateData() {
30 isolate_->SetData(kEmbedderNativeGin, NULL);
31}
32
33PerIsolateData* PerIsolateData::From(Isolate* isolate) {
34 return static_cast<PerIsolateData*>(isolate->GetData(kEmbedderNativeGin));
35}
36
37void PerIsolateData::SetObjectTemplate(WrapperInfo* info,
38 Local<ObjectTemplate> templ) {
39 object_templates_[info] = Eternal<ObjectTemplate>(isolate_, templ);
40}
41
42void PerIsolateData::SetFunctionTemplate(WrapperInfo* info,
43 Local<FunctionTemplate> templ) {
44 function_templates_[info] = Eternal<FunctionTemplate>(isolate_, templ);
45}
46
47v8::Local<v8::ObjectTemplate> PerIsolateData::GetObjectTemplate(
48 WrapperInfo* info) {
49 ObjectTemplateMap::iterator it = object_templates_.find(info);
50 if (it == object_templates_.end())
51 return v8::Local<v8::ObjectTemplate>();
52 return it->second.Get(isolate_);
53}
54
55v8::Local<v8::FunctionTemplate> PerIsolateData::GetFunctionTemplate(
56 WrapperInfo* info) {
57 FunctionTemplateMap::iterator it = function_templates_.find(info);
58 if (it == function_templates_.end())
59 return v8::Local<v8::FunctionTemplate>();
60 return it->second.Get(isolate_);
61}
62
63void PerIsolateData::SetIndexedPropertyInterceptor(
64 WrappableBase* base,
65 IndexedPropertyInterceptor* interceptor) {
66 indexed_interceptors_[base] = interceptor;
67}
68
69void PerIsolateData::SetNamedPropertyInterceptor(
70 WrappableBase* base,
71 NamedPropertyInterceptor* interceptor) {
72 named_interceptors_[base] = interceptor;
73}
74
75void PerIsolateData::ClearIndexedPropertyInterceptor(
76 WrappableBase* base,
77 IndexedPropertyInterceptor* interceptor) {
78 IndexedPropertyInterceptorMap::iterator it = indexed_interceptors_.find(base);
79 if (it != indexed_interceptors_.end())
80 indexed_interceptors_.erase(it);
81 else
82 NOTREACHED();
83}
84
85void PerIsolateData::ClearNamedPropertyInterceptor(
86 WrappableBase* base,
87 NamedPropertyInterceptor* interceptor) {
88 NamedPropertyInterceptorMap::iterator it = named_interceptors_.find(base);
89 if (it != named_interceptors_.end())
90 named_interceptors_.erase(it);
91 else
92 NOTREACHED();
93}
94
95IndexedPropertyInterceptor* PerIsolateData::GetIndexedPropertyInterceptor(
96 WrappableBase* base) {
97 IndexedPropertyInterceptorMap::iterator it = indexed_interceptors_.find(base);
98 if (it != indexed_interceptors_.end())
99 return it->second;
100 else
101 return NULL;
102}
103
104NamedPropertyInterceptor* PerIsolateData::GetNamedPropertyInterceptor(
105 WrappableBase* base) {
106 NamedPropertyInterceptorMap::iterator it = named_interceptors_.find(base);
107 if (it != named_interceptors_.end())
108 return it->second;
109 else
110 return NULL;
111}
112
113} // namespace gin