forked from electron/electron
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix: assert module in the renderer process (electron#39540)
- Loading branch information
1 parent
2481f94
commit ddc7e3e
Showing
2 changed files
with
76 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
75 changes: 75 additions & 0 deletions
75
patches/node/fix_assert_module_in_the_renderer_process.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 | ||
From: Shelley Vohr <[email protected]> | ||
Date: Wed, 16 Aug 2023 19:15:29 +0200 | ||
Subject: fix: assert module in the renderer process | ||
|
||
When creating a Node.js Environment, embedders have the option to disable Node.js' | ||
default overriding of Error.prepareStackTrace. However, the assert module depends on | ||
a WeakMap that is populated with the error stacktraces in the overridden function. | ||
|
||
This adds handling to fall back to the default implementation if Error.prepareStackTrace | ||
if the override has been disabled. | ||
|
||
This will be upstreamed. | ||
|
||
diff --git a/lib/assert.js b/lib/assert.js | ||
index 04c2dd3bfcfdfbb4b8079c306e1d80aa48027787..34658819d09cc20f372798caec79e19c4a36565d 100644 | ||
--- a/lib/assert.js | ||
+++ b/lib/assert.js | ||
@@ -66,6 +66,7 @@ const { inspect } = require('internal/util/inspect'); | ||
const { isPromise, isRegExp } = require('internal/util/types'); | ||
const { EOL } = require('internal/constants'); | ||
const { BuiltinModule } = require('internal/bootstrap/loaders'); | ||
+const { getEmbedderOptions } = require('internal/options'); | ||
const { isError } = require('internal/util'); | ||
|
||
const errorCache = new SafeMap(); | ||
@@ -293,8 +294,16 @@ function getErrMessage(message, fn) { | ||
ErrorCaptureStackTrace(err, fn); | ||
if (errorStackTraceLimitIsWritable) Error.stackTraceLimit = tmpLimit; | ||
|
||
- overrideStackTrace.set(err, (_, stack) => stack); | ||
- const call = err.stack[0]; | ||
+ let call; | ||
+ if (getEmbedderOptions().hasPrepareStackTraceCallback) { | ||
+ overrideStackTrace.set(err, (_, stack) => stack); | ||
+ call = err.stack[0]; | ||
+ } else { | ||
+ const tmpPrepare = Error.prepareStackTrace; | ||
+ Error.prepareStackTrace = (_, stack) => stack; | ||
+ call = err.stack[0]; | ||
+ Error.prepareStackTrace = tmpPrepare; | ||
+ } | ||
|
||
const filename = call.getFileName(); | ||
const line = call.getLineNumber() - 1; | ||
diff --git a/src/api/environment.cc b/src/api/environment.cc | ||
index d5a03d5e10faaa204b3f9f290fed79be824c78b1..c4caef25af670658965fc740ce03c2d2c4ed3e66 100644 | ||
--- a/src/api/environment.cc | ||
+++ b/src/api/environment.cc | ||
@@ -263,6 +263,9 @@ void SetIsolateErrorHandlers(v8::Isolate* isolate, const IsolateSettings& s) { | ||
auto* prepare_stack_trace_cb = s.prepare_stack_trace_callback ? | ||
s.prepare_stack_trace_callback : PrepareStackTraceCallback; | ||
isolate->SetPrepareStackTraceCallback(prepare_stack_trace_cb); | ||
+ } else { | ||
+ auto env = Environment::GetCurrent(isolate); | ||
+ env->set_prepare_stack_trace_callback(Local<Function>()); | ||
} | ||
} | ||
|
||
diff --git a/src/node_options.cc b/src/node_options.cc | ||
index 499d048fcb82e50a302d74e2c7f87f3696103a40..7ad8d80faee840e4dd224d946871b2ff08b0c23c 100644 | ||
--- a/src/node_options.cc | ||
+++ b/src/node_options.cc | ||
@@ -1205,6 +1205,11 @@ void GetEmbedderOptions(const FunctionCallbackInfo<Value>& args) { | ||
Local<Context> context = env->context(); | ||
Local<Object> ret = Object::New(isolate); | ||
|
||
+ if (ret->Set(context, | ||
+ FIXED_ONE_BYTE_STRING(env->isolate(), "hasPrepareStackTraceCallback"), | ||
+ Boolean::New(isolate, !env->prepare_stack_trace_callback().IsEmpty())) | ||
+ .IsNothing()) return; | ||
+ | ||
if (ret->Set(context, | ||
FIXED_ONE_BYTE_STRING(env->isolate(), "shouldNotRegisterESMLoader"), | ||
Boolean::New(isolate, env->should_not_register_esm_loader())) |