blob: bce889749415da341e6e6e4082ac06bbeb4bb80a [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:0526
[email protected]60531d52013-11-27 02:10:1527// There is one instance of PerIsolateData per v8::Isolate managed by Gin. This
28// class stores all the Gin-related data that varies per isolate.
[email protected]48c21632013-12-12 21:32:3429class GIN_EXPORT PerIsolateData {
[email protected]a22998a2013-11-10 05:00:5030 public:
Ashley Newsondeda1812024-01-09 12:04:1831 class DisposeObserver : public base::CheckedObserver {
32 public:
33 // Called just before the isolate is about to be disposed. The isolate will
34 // be entered before the observer is notified, but there will not be a
35 // handle scope by default.
36 virtual void OnBeforeDispose(v8::Isolate* isolate) = 0;
37 // Called just after the isolate has been disposed.
38 virtual void OnDisposed() = 0;
39 };
40
Jiahe Zhange97ba772023-07-27 02:46:4141 PerIsolateData(
42 v8::Isolate* isolate,
43 v8::ArrayBuffer::Allocator* allocator,
44 IsolateHolder::AccessMode access_mode,
45 scoped_refptr<base::SingleThreadTaskRunner> task_runner,
Etienne Pierre-doray8e42980e2024-09-04 20:26:2746 scoped_refptr<base::SingleThreadTaskRunner> user_visible_task_runner,
47 scoped_refptr<base::SingleThreadTaskRunner> best_effort_task_runner);
Daniel Hosseinian68c0798d2021-04-16 08:16:0748 PerIsolateData(const PerIsolateData&) = delete;
49 PerIsolateData& operator=(const PerIsolateData&) = delete;
[email protected]a22998a2013-11-10 05:00:5050 ~PerIsolateData();
51
52 static PerIsolateData* From(v8::Isolate* isolate);
53
Andreas Haasd0e233d2025-07-07 18:01:1254 void SetObjectTemplate(const WrapperInfo* info,
Andreas Haas9d612c5a2025-07-03 07:26:5155 v8::Local<v8::ObjectTemplate> object_template);
56
Andreas Haasd0e233d2025-07-07 18:01:1257 v8::Local<v8::ObjectTemplate> GetObjectTemplate(const WrapperInfo* info);
Andreas Haas9d612c5a2025-07-03 07:26:5158
Ashley Newsondeda1812024-01-09 12:04:1859 void AddDisposeObserver(DisposeObserver* observer);
60 void RemoveDisposeObserver(DisposeObserver* observer);
61 void NotifyBeforeDispose();
62 void NotifyDisposed();
63
mostynbc862da82016-04-03 15:54:3364 void EnableIdleTasks(std::unique_ptr<V8IdleTaskRunner> idle_task_runner);
ulan3cbdcd02015-07-20 11:32:5865
[email protected]91cd4fe2013-11-28 09:31:5866 v8::Isolate* isolate() { return isolate_; }
[email protected]73dcce92014-02-20 08:24:0467 v8::ArrayBuffer::Allocator* allocator() { return allocator_; }
Andreas Haasc13cae82017-11-16 12:54:3868 std::shared_ptr<v8::TaskRunner> task_runner() { return task_runner_; }
Etienne Pierre-doray8e42980e2024-09-04 20:26:2769 std::shared_ptr<v8::TaskRunner> user_visible_task_runner() {
70 return user_visible_task_runner_;
71 }
72 std::shared_ptr<v8::TaskRunner> best_effort_task_runner() {
73 return best_effort_task_runner_;
Jiahe Zhange97ba772023-07-27 02:46:4174 }
jochen76acff102016-11-08 08:20:3775
[email protected]a22998a2013-11-10 05:00:5076 private:
Andreas Haasd0e233d2025-07-07 18:01:1277 typedef std::map<const WrapperInfo*, v8::Eternal<v8::ObjectTemplate>>
Andreas Haas9d612c5a2025-07-03 07:26:5178 ObjectTemplateMap;
[email protected]a22998a2013-11-10 05:00:5079
[email protected]60531d52013-11-27 02:10:1580 // PerIsolateData doesn't actually own |isolate_|. Instead, the isolate is
81 // owned by the IsolateHolder, which also owns the PerIsolateData.
Pârise6361d02023-07-19 09:00:4382 raw_ptr<v8::Isolate, AcrossTasksDanglingUntriaged> isolate_;
Pâris8b159582022-08-31 04:13:2883 raw_ptr<v8::ArrayBuffer::Allocator, DanglingUntriaged> allocator_;
Andreas Haas9d612c5a2025-07-03 07:26:5184 ObjectTemplateMap object_templates_;
Ashley Newsondeda1812024-01-09 12:04:1885 base::ObserverList<DisposeObserver> dispose_observers_;
Andreas Haasc13cae82017-11-16 12:54:3886 std::shared_ptr<V8ForegroundTaskRunnerBase> task_runner_;
Etienne Pierre-doray8e42980e2024-09-04 20:26:2787 std::shared_ptr<V8ForegroundTaskRunnerBase> user_visible_task_runner_;
88 std::shared_ptr<V8ForegroundTaskRunnerBase> best_effort_task_runner_;
[email protected]a22998a2013-11-10 05:00:5089};
90
91} // namespace gin
92
93#endif // GIN_PER_ISOLATE_DATA_H_