blob: 6ec87f63d78de6b2987ceb080ef9645ce2953868 [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
5#ifndef GIN_PER_ISOLATE_DATA_H_
6#define GIN_PER_ISOLATE_DATA_H_
7
8#include <map>
mostynbc862da82016-04-03 15:54:339#include <memory>
[email protected]a22998a2013-11-10 05:00:5010
Ashley Newsondeda1812024-01-09 12:04:1811#include "base/check.h"
Keishi Hattori0e45c022021-11-27 09:25:5212#include "base/memory/raw_ptr.h"
[email protected]b64e5212014-04-04 21:09:1613#include "base/memory/ref_counted.h"
Ashley Newsondeda1812024-01-09 12:04:1814#include "base/observer_list.h"
Patrick Monette643cdf62021-10-15 19:13:4215#include "base/task/single_thread_task_runner.h"
[email protected]48c21632013-12-12 21:32:3416#include "gin/gin_export.h"
jochen76acff102016-11-08 08:20:3717#include "gin/public/isolate_holder.h"
[email protected]c07006b2013-11-20 03:01:4418#include "gin/public/wrapper_info.h"
Andreas Haasc13cae82017-11-16 12:54:3819#include "gin/v8_foreground_task_runner_base.h"
Dan Elphick05acd602021-08-30 15:22:0720#include "v8/include/v8-array-buffer.h"
21#include "v8/include/v8-forward.h"
[email protected]a22998a2013-11-10 05:00:5022
23namespace gin {
24
Andreas Haasc13cae82017-11-16 12:54:3825class V8IdleTaskRunner;
[email protected]5c969b82014-03-12 04:59:0526class IndexedPropertyInterceptor;
27class NamedPropertyInterceptor;
Andreas Haas3c152262025-07-02 12:57:4828class DeprecatedWrappableBase;
[email protected]5c969b82014-03-12 04:59:0529
[email protected]60531d52013-11-27 02:10:1530// There is one instance of PerIsolateData per v8::Isolate managed by Gin. This
31// class stores all the Gin-related data that varies per isolate.
[email protected]48c21632013-12-12 21:32:3432class GIN_EXPORT PerIsolateData {
[email protected]a22998a2013-11-10 05:00:5033 public:
Ashley Newsondeda1812024-01-09 12:04:1834 class DisposeObserver : public base::CheckedObserver {
35 public:
36 // Called just before the isolate is about to be disposed. The isolate will
37 // be entered before the observer is notified, but there will not be a
38 // handle scope by default.
39 virtual void OnBeforeDispose(v8::Isolate* isolate) = 0;
40 // Called just after the isolate has been disposed.
41 virtual void OnDisposed() = 0;
42 };
43
Jiahe Zhange97ba772023-07-27 02:46:4144 PerIsolateData(
45 v8::Isolate* isolate,
46 v8::ArrayBuffer::Allocator* allocator,
47 IsolateHolder::AccessMode access_mode,
48 scoped_refptr<base::SingleThreadTaskRunner> task_runner,
Etienne Pierre-doray8e42980e2024-09-04 20:26:2749 scoped_refptr<base::SingleThreadTaskRunner> user_visible_task_runner,
50 scoped_refptr<base::SingleThreadTaskRunner> best_effort_task_runner);
Daniel Hosseinian68c0798d2021-04-16 08:16:0751 PerIsolateData(const PerIsolateData&) = delete;
52 PerIsolateData& operator=(const PerIsolateData&) = delete;
[email protected]a22998a2013-11-10 05:00:5053 ~PerIsolateData();
54
55 static PerIsolateData* From(v8::Isolate* isolate);
56
[email protected]60531d52013-11-27 02:10:1557 // Each isolate is associated with a collection of v8::ObjectTemplates and
58 // v8::FunctionTemplates. Typically these template objects are created
59 // lazily.
Andreas Haas3c152262025-07-02 12:57:4860 void DeprecatedSetObjectTemplate(
61 DeprecatedWrapperInfo* info,
62 v8::Local<v8::ObjectTemplate> object_template);
63 void SetFunctionTemplate(DeprecatedWrapperInfo* info,
[email protected]97f21ca2013-11-17 17:46:0764 v8::Local<v8::FunctionTemplate> function_template);
[email protected]e87f3122013-11-12 00:41:2765
[email protected]60531d52013-11-27 02:10:1566 // These are low-level functions for retrieving object or function templates
67 // stored in this object. Because these templates are often created lazily,
68 // most clients should call higher-level functions that know how to populate
69 // these templates if they haven't already been created.
Andreas Haas3c152262025-07-02 12:57:4870 v8::Local<v8::ObjectTemplate> DeprecatedGetObjectTemplate(
71 DeprecatedWrapperInfo* info);
72 v8::Local<v8::FunctionTemplate> GetFunctionTemplate(
73 DeprecatedWrapperInfo* info);
[email protected]a22998a2013-11-10 05:00:5074
[email protected]5c969b82014-03-12 04:59:0575 // We maintain a map from Wrappable objects that derive from one of the
76 // interceptor interfaces to the interceptor interface pointers.
Andreas Haas3c152262025-07-02 12:57:4877 void SetIndexedPropertyInterceptor(DeprecatedWrappableBase* base,
[email protected]5c969b82014-03-12 04:59:0578 IndexedPropertyInterceptor* interceptor);
Andreas Haas3c152262025-07-02 12:57:4879 void SetNamedPropertyInterceptor(DeprecatedWrappableBase* base,
[email protected]5c969b82014-03-12 04:59:0580 NamedPropertyInterceptor* interceptor);
81
Andreas Haas3c152262025-07-02 12:57:4882 void ClearIndexedPropertyInterceptor(DeprecatedWrappableBase* base,
[email protected]5c969b82014-03-12 04:59:0583 IndexedPropertyInterceptor* interceptor);
Andreas Haas3c152262025-07-02 12:57:4884 void ClearNamedPropertyInterceptor(DeprecatedWrappableBase* base,
[email protected]5c969b82014-03-12 04:59:0585 NamedPropertyInterceptor* interceptor);
86
87 IndexedPropertyInterceptor* GetIndexedPropertyInterceptor(
Andreas Haas3c152262025-07-02 12:57:4888 DeprecatedWrappableBase* base);
89 NamedPropertyInterceptor* GetNamedPropertyInterceptor(
90 DeprecatedWrappableBase* base);
[email protected]5c969b82014-03-12 04:59:0591
Ashley Newsondeda1812024-01-09 12:04:1892 void AddDisposeObserver(DisposeObserver* observer);
93 void RemoveDisposeObserver(DisposeObserver* observer);
94 void NotifyBeforeDispose();
95 void NotifyDisposed();
96
mostynbc862da82016-04-03 15:54:3397 void EnableIdleTasks(std::unique_ptr<V8IdleTaskRunner> idle_task_runner);
ulan3cbdcd02015-07-20 11:32:5898
[email protected]91cd4fe2013-11-28 09:31:5899 v8::Isolate* isolate() { return isolate_; }
[email protected]73dcce92014-02-20 08:24:04100 v8::ArrayBuffer::Allocator* allocator() { return allocator_; }
Andreas Haasc13cae82017-11-16 12:54:38101 std::shared_ptr<v8::TaskRunner> task_runner() { return task_runner_; }
Etienne Pierre-doray8e42980e2024-09-04 20:26:27102 std::shared_ptr<v8::TaskRunner> user_visible_task_runner() {
103 return user_visible_task_runner_;
104 }
105 std::shared_ptr<v8::TaskRunner> best_effort_task_runner() {
106 return best_effort_task_runner_;
Jiahe Zhange97ba772023-07-27 02:46:41107 }
jochen76acff102016-11-08 08:20:37108
[email protected]a22998a2013-11-10 05:00:50109 private:
Andreas Haas3c152262025-07-02 12:57:48110 typedef std::map<DeprecatedWrapperInfo*, v8::Eternal<v8::ObjectTemplate>>
111 DeprecatedObjectTemplateMap;
112 typedef std::map<DeprecatedWrapperInfo*, v8::Eternal<v8::FunctionTemplate>>
113 FunctionTemplateMap;
114 typedef std::map<DeprecatedWrappableBase*,
Ali Hijazi60a72b0a2024-09-30 17:58:53115 raw_ptr<IndexedPropertyInterceptor, CtnExperimental>>
[email protected]5c969b82014-03-12 04:59:05116 IndexedPropertyInterceptorMap;
Andreas Haas3c152262025-07-02 12:57:48117 typedef std::map<DeprecatedWrappableBase*,
Ali Hijazi60a72b0a2024-09-30 17:58:53118 raw_ptr<NamedPropertyInterceptor, CtnExperimental>>
[email protected]5c969b82014-03-12 04:59:05119 NamedPropertyInterceptorMap;
[email protected]a22998a2013-11-10 05:00:50120
[email protected]60531d52013-11-27 02:10:15121 // PerIsolateData doesn't actually own |isolate_|. Instead, the isolate is
122 // owned by the IsolateHolder, which also owns the PerIsolateData.
Pârise6361d02023-07-19 09:00:43123 raw_ptr<v8::Isolate, AcrossTasksDanglingUntriaged> isolate_;
Pâris8b159582022-08-31 04:13:28124 raw_ptr<v8::ArrayBuffer::Allocator, DanglingUntriaged> allocator_;
Andreas Haas3c152262025-07-02 12:57:48125 DeprecatedObjectTemplateMap deprecated_object_templates_;
[email protected]97f21ca2013-11-17 17:46:07126 FunctionTemplateMap function_templates_;
[email protected]5c969b82014-03-12 04:59:05127 IndexedPropertyInterceptorMap indexed_interceptors_;
128 NamedPropertyInterceptorMap named_interceptors_;
Ashley Newsondeda1812024-01-09 12:04:18129 base::ObserverList<DisposeObserver> dispose_observers_;
Andreas Haasc13cae82017-11-16 12:54:38130 std::shared_ptr<V8ForegroundTaskRunnerBase> task_runner_;
Etienne Pierre-doray8e42980e2024-09-04 20:26:27131 std::shared_ptr<V8ForegroundTaskRunnerBase> user_visible_task_runner_;
132 std::shared_ptr<V8ForegroundTaskRunnerBase> best_effort_task_runner_;
[email protected]a22998a2013-11-10 05:00:50133};
134
135} // namespace gin
136
137#endif // GIN_PER_ISOLATE_DATA_H_