blob: 5bd5ed3a93792e59a1c6ac9154c617846378a5b4 [file] [log] [blame]
Avi Drissman468e51b62022-09-13 20:47:011// Copyright 2013 The Chromium Authors
[email protected]a22998a2013-11-10 05:00:502// 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"
[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"
Dan Elphick05acd602021-08-30 15:22:0715#include "v8/include/v8-isolate.h"
[email protected]a22998a2013-11-10 05:00:5016
[email protected]73dcce92014-02-20 08:24:0417using v8::ArrayBuffer;
[email protected]a22998a2013-11-10 05:00:5018using v8::Eternal;
[email protected]a22998a2013-11-10 05:00:5019using v8::Isolate;
20using v8::Local;
21using v8::Object;
[email protected]97f21ca2013-11-17 17:46:0722using v8::FunctionTemplate;
[email protected]a22998a2013-11-10 05:00:5023using v8::ObjectTemplate;
24
Jiahe Zhange97ba772023-07-27 02:46:4125namespace {
26std::shared_ptr<gin::V8ForegroundTaskRunnerBase> CreateV8ForegroundTaskRunner(
27 v8::Isolate* isolate,
28 scoped_refptr<base::SingleThreadTaskRunner> task_runner,
29 gin::IsolateHolder::AccessMode access_mode) {
30 if (access_mode == gin::IsolateHolder::kUseLocker) {
31 return std::make_shared<gin::V8ForegroundTaskRunnerWithLocker>(
32 isolate, std::move(task_runner));
33 } else {
34 return std::make_shared<gin::V8ForegroundTaskRunner>(
35 std::move(task_runner));
36 }
37}
38} // namespace
39
[email protected]a22998a2013-11-10 05:00:5040namespace gin {
41
altimin124814c2017-01-03 14:06:5442PerIsolateData::PerIsolateData(
43 Isolate* isolate,
44 ArrayBuffer::Allocator* allocator,
45 IsolateHolder::AccessMode access_mode,
Jiahe Zhange97ba772023-07-27 02:46:4146 scoped_refptr<base::SingleThreadTaskRunner> task_runner,
Etienne Pierre-doray8e42980e2024-09-04 20:26:2747 scoped_refptr<base::SingleThreadTaskRunner> user_visible_task_runner,
48 scoped_refptr<base::SingleThreadTaskRunner> best_effort_task_runner)
Andreas Haasc13cae82017-11-16 12:54:3849 : isolate_(isolate), allocator_(allocator) {
[email protected]f04b0e92013-11-22 14:20:5550 isolate_->SetData(kEmbedderNativeGin, this);
Andreas Haasc13cae82017-11-16 12:54:3851
Siddhartha031fecd62018-01-04 22:02:4752 DCHECK(task_runner);
Jiahe Zhange97ba772023-07-27 02:46:4153 task_runner_ = CreateV8ForegroundTaskRunner(isolate_, std::move(task_runner),
54 access_mode);
Etienne Pierre-doray8e42980e2024-09-04 20:26:2755 if (user_visible_task_runner) {
56 user_visible_task_runner_ = CreateV8ForegroundTaskRunner(
57 isolate_, std::move(user_visible_task_runner), access_mode);
58 }
59 if (best_effort_task_runner) {
60 best_effort_task_runner_ = CreateV8ForegroundTaskRunner(
61 isolate_, std::move(best_effort_task_runner), access_mode);
Andreas Haasc13cae82017-11-16 12:54:3862 }
[email protected]a22998a2013-11-10 05:00:5063}
64
Victor Gomes955595bc2022-01-05 18:19:4265PerIsolateData::~PerIsolateData() = default;
[email protected]a22998a2013-11-10 05:00:5066
67PerIsolateData* PerIsolateData::From(Isolate* isolate) {
[email protected]f04b0e92013-11-22 14:20:5568 return static_cast<PerIsolateData*>(isolate->GetData(kEmbedderNativeGin));
[email protected]a22998a2013-11-10 05:00:5069}
70
[email protected]e87f3122013-11-12 00:41:2771void PerIsolateData::SetObjectTemplate(WrapperInfo* info,
72 Local<ObjectTemplate> templ) {
73 object_templates_[info] = Eternal<ObjectTemplate>(isolate_, templ);
74}
75
[email protected]97f21ca2013-11-17 17:46:0776void PerIsolateData::SetFunctionTemplate(WrapperInfo* info,
77 Local<FunctionTemplate> templ) {
78 function_templates_[info] = Eternal<FunctionTemplate>(isolate_, templ);
79}
80
[email protected]e87f3122013-11-12 00:41:2781v8::Local<v8::ObjectTemplate> PerIsolateData::GetObjectTemplate(
82 WrapperInfo* info) {
83 ObjectTemplateMap::iterator it = object_templates_.find(info);
84 if (it == object_templates_.end())
85 return v8::Local<v8::ObjectTemplate>();
86 return it->second.Get(isolate_);
[email protected]a22998a2013-11-10 05:00:5087}
88
[email protected]97f21ca2013-11-17 17:46:0789v8::Local<v8::FunctionTemplate> PerIsolateData::GetFunctionTemplate(
90 WrapperInfo* info) {
91 FunctionTemplateMap::iterator it = function_templates_.find(info);
92 if (it == function_templates_.end())
93 return v8::Local<v8::FunctionTemplate>();
94 return it->second.Get(isolate_);
95}
96
[email protected]5c969b82014-03-12 04:59:0597void PerIsolateData::SetIndexedPropertyInterceptor(
98 WrappableBase* base,
99 IndexedPropertyInterceptor* interceptor) {
100 indexed_interceptors_[base] = interceptor;
101}
102
103void PerIsolateData::SetNamedPropertyInterceptor(
104 WrappableBase* base,
105 NamedPropertyInterceptor* interceptor) {
106 named_interceptors_[base] = interceptor;
107}
108
109void PerIsolateData::ClearIndexedPropertyInterceptor(
110 WrappableBase* base,
111 IndexedPropertyInterceptor* interceptor) {
112 IndexedPropertyInterceptorMap::iterator it = indexed_interceptors_.find(base);
113 if (it != indexed_interceptors_.end())
114 indexed_interceptors_.erase(it);
115 else
Peter Boström89c827082024-09-20 10:54:38116 NOTREACHED();
[email protected]5c969b82014-03-12 04:59:05117}
118
119void PerIsolateData::ClearNamedPropertyInterceptor(
120 WrappableBase* base,
121 NamedPropertyInterceptor* interceptor) {
122 NamedPropertyInterceptorMap::iterator it = named_interceptors_.find(base);
123 if (it != named_interceptors_.end())
124 named_interceptors_.erase(it);
125 else
Peter Boström89c827082024-09-20 10:54:38126 NOTREACHED();
[email protected]5c969b82014-03-12 04:59:05127}
128
129IndexedPropertyInterceptor* PerIsolateData::GetIndexedPropertyInterceptor(
130 WrappableBase* base) {
131 IndexedPropertyInterceptorMap::iterator it = indexed_interceptors_.find(base);
132 if (it != indexed_interceptors_.end())
133 return it->second;
134 else
135 return NULL;
136}
137
138NamedPropertyInterceptor* PerIsolateData::GetNamedPropertyInterceptor(
139 WrappableBase* base) {
140 NamedPropertyInterceptorMap::iterator it = named_interceptors_.find(base);
141 if (it != named_interceptors_.end())
142 return it->second;
143 else
144 return NULL;
145}
146
Ashley Newsondeda1812024-01-09 12:04:18147void PerIsolateData::AddDisposeObserver(DisposeObserver* observer) {
148 dispose_observers_.AddObserver(observer);
149}
150
151void PerIsolateData::RemoveDisposeObserver(DisposeObserver* observer) {
152 dispose_observers_.RemoveObserver(observer);
153}
154
155void PerIsolateData::NotifyBeforeDispose() {
156 for (auto& observer : dispose_observers_) {
157 observer.OnBeforeDispose(isolate_.get());
158 }
159}
160
161void PerIsolateData::NotifyDisposed() {
162 for (auto& observer : dispose_observers_) {
163 observer.OnDisposed();
164 }
165}
166
ulan3cbdcd02015-07-20 11:32:58167void PerIsolateData::EnableIdleTasks(
mostynbc862da82016-04-03 15:54:33168 std::unique_ptr<V8IdleTaskRunner> idle_task_runner) {
Andreas Haasc13cae82017-11-16 12:54:38169 task_runner_->EnableIdleTasks(std::move(idle_task_runner));
ulan3cbdcd02015-07-20 11:32:58170}
171
[email protected]a22998a2013-11-10 05:00:50172} // namespace gin