fix_assert_module_in_the_renderer_process.patch 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
  2. From: Shelley Vohr <[email protected]>
  3. Date: Wed, 16 Aug 2023 19:15:29 +0200
  4. Subject: fix: assert module in the renderer process
  5. When creating a Node.js Environment, embedders have the option to disable Node.js'
  6. default overriding of Error.prepareStackTrace. However, the assert module depends on
  7. a WeakMap that is populated with the error stacktraces in the overridden function.
  8. This adds handling to fall back to the default implementation if Error.prepareStackTrace
  9. if the override has been disabled.
  10. This will be upstreamed.
  11. diff --git a/lib/assert.js b/lib/assert.js
  12. index 9dfcf80a913942c93b206c6f871ac7807c7a7e81..4d25a22aedf7d7182bb709864e29b7e725336323 100644
  13. --- a/lib/assert.js
  14. +++ b/lib/assert.js
  15. @@ -66,6 +66,7 @@ const { inspect } = require('internal/util/inspect');
  16. const { isPromise, isRegExp } = require('internal/util/types');
  17. const { EOL } = require('internal/constants');
  18. const { BuiltinModule } = require('internal/bootstrap/realm');
  19. +const { getEmbedderOptions } = require('internal/options');
  20. const { isError, deprecate } = require('internal/util');
  21. const errorCache = new SafeMap();
  22. @@ -294,8 +295,16 @@ function getErrMessage(message, fn) {
  23. ErrorCaptureStackTrace(err, fn);
  24. if (errorStackTraceLimitIsWritable) Error.stackTraceLimit = tmpLimit;
  25. - overrideStackTrace.set(err, (_, stack) => stack);
  26. - const call = err.stack[0];
  27. + let call;
  28. + if (getEmbedderOptions().hasPrepareStackTraceCallback) {
  29. + overrideStackTrace.set(err, (_, stack) => stack);
  30. + call = err.stack[0];
  31. + } else {
  32. + const tmpPrepare = Error.prepareStackTrace;
  33. + Error.prepareStackTrace = (_, stack) => stack;
  34. + call = err.stack[0];
  35. + Error.prepareStackTrace = tmpPrepare;
  36. + }
  37. let filename = call.getFileName();
  38. const line = call.getLineNumber() - 1;
  39. diff --git a/src/api/environment.cc b/src/api/environment.cc
  40. index f9d29f0065b1de63a62cfdce74a9705c22dd87d7..3f44160f1bd40fc2d4658f10edf0d0b374732ca2 100644
  41. --- a/src/api/environment.cc
  42. +++ b/src/api/environment.cc
  43. @@ -277,6 +277,9 @@ void SetIsolateErrorHandlers(v8::Isolate* isolate, const IsolateSettings& s) {
  44. auto* prepare_stack_trace_cb = s.prepare_stack_trace_callback ?
  45. s.prepare_stack_trace_callback : PrepareStackTraceCallback;
  46. isolate->SetPrepareStackTraceCallback(prepare_stack_trace_cb);
  47. + } else {
  48. + auto env = Environment::GetCurrent(isolate);
  49. + env->set_prepare_stack_trace_callback(Local<Function>());
  50. }
  51. }
  52. diff --git a/src/node_options.cc b/src/node_options.cc
  53. index 753311e15f161547be4277016efe11cc57d351db..8e98b76e29824565739010b885375d63c992bdf8 100644
  54. --- a/src/node_options.cc
  55. +++ b/src/node_options.cc
  56. @@ -1317,6 +1317,11 @@ void GetEmbedderOptions(const FunctionCallbackInfo<Value>& args) {
  57. Local<Context> context = env->context();
  58. Local<Object> ret = Object::New(isolate);
  59. + if (ret->Set(context,
  60. + FIXED_ONE_BYTE_STRING(env->isolate(), "hasPrepareStackTraceCallback"),
  61. + Boolean::New(isolate, !env->prepare_stack_trace_callback().IsEmpty()))
  62. + .IsNothing()) return;
  63. +
  64. if (ret->Set(context,
  65. FIXED_ONE_BYTE_STRING(env->isolate(), "shouldNotRegisterESMLoader"),
  66. Boolean::New(isolate, env->should_not_register_esm_loader()))