blob: 81f805779fcdcbce3fc76448ed2fc695274e4a73 [file] [log] [blame]
[email protected]a22998a2013-11-10 05:00:501// 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
ulan3cbdcd02015-07-20 11:32:585#include "gin/per_isolate_data.h"
6
dchenge48600452015-12-28 02:24:507#include <utility>
8
[email protected]5c969b82014-03-12 04:59:059#include "base/logging.h"
skyostila3899862015-06-12 18:21:5810#include "base/single_thread_task_runner.h"
gab54909b722016-05-11 18:34:1111#include "base/threading/thread_task_runner_handle.h"
[email protected]f04b0e92013-11-22 14:20:5512#include "gin/public/gin_embedders.h"
Andreas Haasc13cae82017-11-16 12:54:3813#include "gin/v8_foreground_task_runner.h"
14#include "gin/v8_foreground_task_runner_with_locker.h"
[email protected]a22998a2013-11-10 05:00:5015
[email protected]73dcce92014-02-20 08:24:0416using v8::ArrayBuffer;
[email protected]a22998a2013-11-10 05:00:5017using v8::Eternal;
[email protected]a22998a2013-11-10 05:00:5018using v8::Isolate;
19using v8::Local;
20using v8::Object;
[email protected]97f21ca2013-11-17 17:46:0721using v8::FunctionTemplate;
[email protected]a22998a2013-11-10 05:00:5022using v8::ObjectTemplate;
23
24namespace gin {
25
altimin124814c2017-01-03 14:06:5426PerIsolateData::PerIsolateData(
27 Isolate* isolate,
28 ArrayBuffer::Allocator* allocator,
29 IsolateHolder::AccessMode access_mode,
30 scoped_refptr<base::SingleThreadTaskRunner> task_runner)
Andreas Haasc13cae82017-11-16 12:54:3831 : isolate_(isolate), allocator_(allocator) {
[email protected]f04b0e92013-11-22 14:20:5532 isolate_->SetData(kEmbedderNativeGin, this);
Andreas Haasc13cae82017-11-16 12:54:3833
Siddhartha031fecd62018-01-04 22:02:4734 DCHECK(task_runner);
Andreas Haasc13cae82017-11-16 12:54:3835 if (access_mode == IsolateHolder::kUseLocker) {
36 task_runner_ = std::make_shared<V8ForegroundTaskRunnerWithLocker>(
37 isolate, task_runner);
38 } else {
39 task_runner_ = std::make_shared<V8ForegroundTaskRunner>(task_runner);
40 }
[email protected]a22998a2013-11-10 05:00:5041}
42
43PerIsolateData::~PerIsolateData() {
[email protected]f04b0e92013-11-22 14:20:5544 isolate_->SetData(kEmbedderNativeGin, NULL);
[email protected]a22998a2013-11-10 05:00:5045}
46
47PerIsolateData* PerIsolateData::From(Isolate* isolate) {
[email protected]f04b0e92013-11-22 14:20:5548 return static_cast<PerIsolateData*>(isolate->GetData(kEmbedderNativeGin));
[email protected]a22998a2013-11-10 05:00:5049}
50
[email protected]e87f3122013-11-12 00:41:2751void PerIsolateData::SetObjectTemplate(WrapperInfo* info,
52 Local<ObjectTemplate> templ) {
53 object_templates_[info] = Eternal<ObjectTemplate>(isolate_, templ);
54}
55
[email protected]97f21ca2013-11-17 17:46:0756void PerIsolateData::SetFunctionTemplate(WrapperInfo* info,
57 Local<FunctionTemplate> templ) {
58 function_templates_[info] = Eternal<FunctionTemplate>(isolate_, templ);
59}
60
[email protected]e87f3122013-11-12 00:41:2761v8::Local<v8::ObjectTemplate> PerIsolateData::GetObjectTemplate(
62 WrapperInfo* info) {
63 ObjectTemplateMap::iterator it = object_templates_.find(info);
64 if (it == object_templates_.end())
65 return v8::Local<v8::ObjectTemplate>();
66 return it->second.Get(isolate_);
[email protected]a22998a2013-11-10 05:00:5067}
68
[email protected]97f21ca2013-11-17 17:46:0769v8::Local<v8::FunctionTemplate> PerIsolateData::GetFunctionTemplate(
70 WrapperInfo* info) {
71 FunctionTemplateMap::iterator it = function_templates_.find(info);
72 if (it == function_templates_.end())
73 return v8::Local<v8::FunctionTemplate>();
74 return it->second.Get(isolate_);
75}
76
[email protected]5c969b82014-03-12 04:59:0577void PerIsolateData::SetIndexedPropertyInterceptor(
78 WrappableBase* base,
79 IndexedPropertyInterceptor* interceptor) {
80 indexed_interceptors_[base] = interceptor;
81}
82
83void PerIsolateData::SetNamedPropertyInterceptor(
84 WrappableBase* base,
85 NamedPropertyInterceptor* interceptor) {
86 named_interceptors_[base] = interceptor;
87}
88
89void PerIsolateData::ClearIndexedPropertyInterceptor(
90 WrappableBase* base,
91 IndexedPropertyInterceptor* interceptor) {
92 IndexedPropertyInterceptorMap::iterator it = indexed_interceptors_.find(base);
93 if (it != indexed_interceptors_.end())
94 indexed_interceptors_.erase(it);
95 else
96 NOTREACHED();
97}
98
99void PerIsolateData::ClearNamedPropertyInterceptor(
100 WrappableBase* base,
101 NamedPropertyInterceptor* interceptor) {
102 NamedPropertyInterceptorMap::iterator it = named_interceptors_.find(base);
103 if (it != named_interceptors_.end())
104 named_interceptors_.erase(it);
105 else
106 NOTREACHED();
107}
108
109IndexedPropertyInterceptor* PerIsolateData::GetIndexedPropertyInterceptor(
110 WrappableBase* base) {
111 IndexedPropertyInterceptorMap::iterator it = indexed_interceptors_.find(base);
112 if (it != indexed_interceptors_.end())
113 return it->second;
114 else
115 return NULL;
116}
117
118NamedPropertyInterceptor* PerIsolateData::GetNamedPropertyInterceptor(
119 WrappableBase* base) {
120 NamedPropertyInterceptorMap::iterator it = named_interceptors_.find(base);
121 if (it != named_interceptors_.end())
122 return it->second;
123 else
124 return NULL;
125}
126
ulan3cbdcd02015-07-20 11:32:58127void PerIsolateData::EnableIdleTasks(
mostynbc862da82016-04-03 15:54:33128 std::unique_ptr<V8IdleTaskRunner> idle_task_runner) {
Andreas Haasc13cae82017-11-16 12:54:38129 task_runner_->EnableIdleTasks(std::move(idle_task_runner));
ulan3cbdcd02015-07-20 11:32:58130}
131
[email protected]a22998a2013-11-10 05:00:50132} // namespace gin