blob: 2ccec600dc7eab5733ce615e66256e876c39a6f9 [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
Hans Wennborgdcc5ada2020-04-27 13:27:239#include "base/check.h"
10#include "base/notreached.h"
Patrick Monette643cdf62021-10-15 19:13:4211#include "base/task/single_thread_task_runner.h"
gab54909b722016-05-11 18:34:1112#include "base/threading/thread_task_runner_handle.h"
[email protected]f04b0e92013-11-22 14:20:5513#include "gin/public/gin_embedders.h"
Andreas Haasc13cae82017-11-16 12:54:3814#include "gin/v8_foreground_task_runner.h"
15#include "gin/v8_foreground_task_runner_with_locker.h"
Dan Elphick05acd602021-08-30 15:22:0716#include "v8/include/v8-isolate.h"
[email protected]a22998a2013-11-10 05:00:5017
[email protected]73dcce92014-02-20 08:24:0418using v8::ArrayBuffer;
[email protected]a22998a2013-11-10 05:00:5019using v8::Eternal;
[email protected]a22998a2013-11-10 05:00:5020using v8::Isolate;
21using v8::Local;
22using v8::Object;
[email protected]97f21ca2013-11-17 17:46:0723using v8::FunctionTemplate;
[email protected]a22998a2013-11-10 05:00:5024using v8::ObjectTemplate;
25
26namespace gin {
27
altimin124814c2017-01-03 14:06:5428PerIsolateData::PerIsolateData(
29 Isolate* isolate,
30 ArrayBuffer::Allocator* allocator,
31 IsolateHolder::AccessMode access_mode,
32 scoped_refptr<base::SingleThreadTaskRunner> task_runner)
Andreas Haasc13cae82017-11-16 12:54:3833 : isolate_(isolate), allocator_(allocator) {
[email protected]f04b0e92013-11-22 14:20:5534 isolate_->SetData(kEmbedderNativeGin, this);
Andreas Haasc13cae82017-11-16 12:54:3835
Siddhartha031fecd62018-01-04 22:02:4736 DCHECK(task_runner);
Andreas Haasc13cae82017-11-16 12:54:3837 if (access_mode == IsolateHolder::kUseLocker) {
38 task_runner_ = std::make_shared<V8ForegroundTaskRunnerWithLocker>(
39 isolate, task_runner);
40 } else {
41 task_runner_ = std::make_shared<V8ForegroundTaskRunner>(task_runner);
42 }
[email protected]a22998a2013-11-10 05:00:5043}
44
Victor Gomes955595bc2022-01-05 18:19:4245PerIsolateData::~PerIsolateData() = default;
[email protected]a22998a2013-11-10 05:00:5046
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