chore_expose_importmoduledynamically_and.patch 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
  2. From: Samuel Attard <[email protected]>
  3. Date: Wed, 8 Mar 2023 13:02:17 -0800
  4. Subject: chore: expose ImportModuleDynamically and
  5. HostInitializeImportMetaObjectCallback to embedders
  6. This also subtly changes the behavior of shouldNotRegisterESMLoader to ensure that node sets up the handlers
  7. internally but simply avoids setting its own handlers on the Isolate. This is so that Electron can set it to
  8. its own blended handler between Node and Blink.
  9. Not upstreamable.
  10. diff --git a/lib/internal/modules/esm/utils.js b/lib/internal/modules/esm/utils.js
  11. index 985784383024450833a8324d45a7af2fe214a09c..356c10aef57454be3b4607156606784f473042cf 100644
  12. --- a/lib/internal/modules/esm/utils.js
  13. +++ b/lib/internal/modules/esm/utils.js
  14. @@ -16,7 +16,7 @@ const {
  15. ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING,
  16. ERR_INVALID_ARG_VALUE,
  17. } = require('internal/errors').codes;
  18. -const { getOptionValue } = require('internal/options');
  19. +const { getOptionValue, getEmbedderOptions } = require('internal/options');
  20. const {
  21. loadPreloadModules,
  22. initializeFrozenIntrinsics,
  23. @@ -148,12 +148,13 @@ async function importModuleDynamicallyCallback(symbol, specifier, assertions) {
  24. // the loader worker in internal/main/worker_thread.js.
  25. let _isLoaderWorker = false;
  26. function initializeESM(isLoaderWorker = false) {
  27. + const shouldSetOnIsolate = !getEmbedderOptions().shouldNotRegisterESMLoader;
  28. _isLoaderWorker = isLoaderWorker;
  29. initializeDefaultConditions();
  30. // Setup per-isolate callbacks that locate data or callbacks that we keep
  31. // track of for different ESM modules.
  32. - setInitializeImportMetaObjectCallback(initializeImportMetaObject);
  33. - setImportModuleDynamicallyCallback(importModuleDynamicallyCallback);
  34. + setInitializeImportMetaObjectCallback(initializeImportMetaObject, shouldSetOnIsolate);
  35. + setImportModuleDynamicallyCallback(importModuleDynamicallyCallback, shouldSetOnIsolate);
  36. }
  37. function isLoaderWorker() {
  38. diff --git a/src/module_wrap.cc b/src/module_wrap.cc
  39. index a1b0f812391486c5a429398326091a30bbe81692..a316d077f2d2ff38564959345cf8ef29a3ac678f 100644
  40. --- a/src/module_wrap.cc
  41. +++ b/src/module_wrap.cc
  42. @@ -547,7 +547,7 @@ MaybeLocal<Module> ModuleWrap::ResolveModuleCallback(
  43. return module->module_.Get(isolate);
  44. }
  45. -static MaybeLocal<Promise> ImportModuleDynamically(
  46. +MaybeLocal<Promise> ImportModuleDynamically(
  47. Local<Context> context,
  48. Local<v8::Data> host_defined_options,
  49. Local<Value> resource_name,
  50. @@ -610,12 +610,13 @@ void ModuleWrap::SetImportModuleDynamicallyCallback(
  51. Environment* env = Environment::GetCurrent(args);
  52. HandleScope handle_scope(isolate);
  53. - CHECK_EQ(args.Length(), 1);
  54. + CHECK_EQ(args.Length(), 2);
  55. CHECK(args[0]->IsFunction());
  56. Local<Function> import_callback = args[0].As<Function>();
  57. env->set_host_import_module_dynamically_callback(import_callback);
  58. - isolate->SetHostImportModuleDynamicallyCallback(ImportModuleDynamically);
  59. + if (args[1]->IsBoolean() && args[1]->BooleanValue(isolate))
  60. + isolate->SetHostImportModuleDynamicallyCallback(ImportModuleDynamically);
  61. }
  62. void ModuleWrap::HostInitializeImportMetaObjectCallback(
  63. @@ -652,13 +653,14 @@ void ModuleWrap::SetInitializeImportMetaObjectCallback(
  64. Environment* env = Environment::GetCurrent(args);
  65. Isolate* isolate = env->isolate();
  66. - CHECK_EQ(args.Length(), 1);
  67. + CHECK_EQ(args.Length(), 2);
  68. CHECK(args[0]->IsFunction());
  69. Local<Function> import_meta_callback = args[0].As<Function>();
  70. env->set_host_initialize_import_meta_object_callback(import_meta_callback);
  71. - isolate->SetHostInitializeImportMetaObjectCallback(
  72. - HostInitializeImportMetaObjectCallback);
  73. + if (args[1]->IsBoolean() && args[1]->BooleanValue(isolate))
  74. + isolate->SetHostInitializeImportMetaObjectCallback(
  75. + HostInitializeImportMetaObjectCallback);
  76. }
  77. MaybeLocal<Value> ModuleWrap::SyntheticModuleEvaluationStepsCallback(
  78. diff --git a/src/module_wrap.h b/src/module_wrap.h
  79. index 6435bad40936fe235822c0597310b94ab98082f3..c51eb99ce3eb54bc30ae922e0357b637b09d53c6 100644
  80. --- a/src/module_wrap.h
  81. +++ b/src/module_wrap.h
  82. @@ -30,7 +30,14 @@ enum HostDefinedOptions : int {
  83. kLength = 9,
  84. };
  85. -class ModuleWrap : public BaseObject {
  86. +NODE_EXTERN v8::MaybeLocal<v8::Promise> ImportModuleDynamically(
  87. + v8::Local<v8::Context> context,
  88. + v8::Local<v8::Data> host_defined_options,
  89. + v8::Local<v8::Value> resource_name,
  90. + v8::Local<v8::String> specifier,
  91. + v8::Local<v8::FixedArray> import_assertions);
  92. +
  93. +class NODE_EXTERN ModuleWrap : public BaseObject {
  94. public:
  95. enum InternalFields {
  96. kModuleSlot = BaseObject::kInternalFieldCount,