fix: crash when destroying node env with pending promises (#33280)
* fix: crash when destroying node env with pending promises * chore: add spec
This commit is contained in:
parent
652680e801
commit
b2c5623a13
4 changed files with 64 additions and 9 deletions
|
@ -151,17 +151,22 @@ void ElectronRendererClient::WillReleaseScriptContext(
|
|||
if (env == node_bindings_->uv_env())
|
||||
node_bindings_->set_uv_env(nullptr);
|
||||
|
||||
// Destroy the node environment. We only do this if node support has been
|
||||
// enabled for sub-frames to avoid a change-of-behavior / introduce crashes
|
||||
// for existing users.
|
||||
// We also do this if we have disable electron site instance overrides to
|
||||
// avoid memory leaks
|
||||
auto prefs = render_frame->GetBlinkPreferences();
|
||||
gin_helper::MicrotasksScope microtasks_scope(env->isolate());
|
||||
// Destroying the node environment will also run the uv loop,
|
||||
// Node.js expects `kExplicit` microtasks policy and will run microtasks
|
||||
// checkpoints after every call into JavaScript. Since we use a different
|
||||
// policy in the renderer - switch to `kExplicit` and then drop back to the
|
||||
// previous policy value.
|
||||
v8::Isolate* isolate = context->GetIsolate();
|
||||
auto old_policy = isolate->GetMicrotasksPolicy();
|
||||
DCHECK_EQ(v8::MicrotasksScope::GetCurrentDepth(isolate), 0);
|
||||
isolate->SetMicrotasksPolicy(v8::MicrotasksPolicy::kExplicit);
|
||||
|
||||
node::FreeEnvironment(env);
|
||||
if (env == node_bindings_->uv_env())
|
||||
node::FreeIsolateData(node_bindings_->isolate_data());
|
||||
|
||||
isolate->SetMicrotasksPolicy(old_policy);
|
||||
|
||||
// ElectronBindings is tracking node environments.
|
||||
electron_bindings_->EnvironmentDestroyed(env);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue