Files
electron/shell/browser/javascript_environment.h
David Sanders b1525cf35d build: run clang-tidy on Electron's headers (#54015)
* build: run clang-tidy on Electron's headers

* chore: google-explicit-constructor

* chore: readability-redundant-member-init

* chore: modernize-use-equals-delete

* chore: modernize-use-default-member-init

* chore: google-default-arguments
2026-09-16 20:10:23 -07:00

84 lines
2.6 KiB
C++

// Copyright (c) 2013 GitHub, Inc.
// Use of this source code is governed by the MIT license that can be
// found in the LICENSE file.
#ifndef ELECTRON_SHELL_BROWSER_JAVASCRIPT_ENVIRONMENT_H_
#define ELECTRON_SHELL_BROWSER_JAVASCRIPT_ENVIRONMENT_H_
#include <memory>
#include <optional>
#include "shell/common/uv_includes.h"
#include "third_party/electron_node/src/tracing/agent.h"
#include "v8/include/v8-locker.h"
namespace gin {
class IsolateHolder;
} // namespace gin
namespace node {
class MultiIsolatePlatform;
struct SnapshotData;
} // namespace node
namespace v8 {
class Isolate;
class TracingController;
} // namespace v8
namespace electron {
class MicrotasksRunner;
// Manage the V8 isolate and context automatically.
class JavascriptEnvironment {
public:
explicit JavascriptEnvironment(
uv_loop_t* event_loop,
bool setup_wasm_streaming = false,
v8::TracingController* tracing_controller = nullptr);
~JavascriptEnvironment();
// disable copy
JavascriptEnvironment(const JavascriptEnvironment&) = delete;
JavascriptEnvironment& operator=(const JavascriptEnvironment&) = delete;
void CreateMicrotasksRunner();
void DestroyMicrotasksRunner();
node::MultiIsolatePlatform* platform() const { return platform_.get(); }
size_t max_young_generation_size_in_bytes() const {
return max_young_generation_size_;
}
[[nodiscard]] v8::Isolate* isolate() const;
[[nodiscard]] static v8::Isolate* GetIsolate();
// The embedded Node.js startup snapshot this process's JavascriptEnvironment
// isolate is (to be) created from, or nullptr when the Node.js environment
// is bootstrapped from scratch: on builds without a Node snapshot
// (cross-compiled targets), when a custom V8 snapshot is loaded, and in
// process types that never have a JavascriptEnvironment. When non-null the
// constructor creates no context; the main context comes out of
// node::CreateEnvironment (pass it an empty one) and the caller enters it.
[[nodiscard]] static const node::SnapshotData* NodeSnapshot();
private:
v8::Isolate* Initialize(uv_loop_t* event_loop,
bool setup_wasm_streaming,
v8::TracingController* tracing_controller);
std::unique_ptr<node::MultiIsolatePlatform> platform_;
size_t max_young_generation_size_ = 0;
std::unique_ptr<gin::IsolateHolder> isolate_holder_;
// depends-on: isolate_holder_'s isolate
std::optional<v8::Locker> locker_;
std::unique_ptr<MicrotasksRunner> microtasks_runner_;
};
} // namespace electron
#endif // ELECTRON_SHELL_BROWSER_JAVASCRIPT_ENVIRONMENT_H_