From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Wed, 8 Mar 2023 13:02:17 -0800 Subject: chore: expose ImportModuleDynamically and HostInitializeImportMetaObjectCallback to embedders This also subtly changes the behavior of shouldNotRegisterESMLoader to ensure that node sets up the handlers internally but simply avoids setting its own handlers on the Isolate. This is so that Electron can set it to its own blended handler between Node and Blink. Not upstreamable. diff --git a/lib/internal/modules/esm/utils.js b/lib/internal/modules/esm/utils.js index fd17ce8695c55f8f38ed19d59960acc1a7692bc8..96754db3277b3a0445b69275368602166c6d5423 100644 --- a/lib/internal/modules/esm/utils.js +++ b/lib/internal/modules/esm/utils.js @@ -30,7 +30,7 @@ const { ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING, ERR_INVALID_ARG_VALUE, } = require('internal/errors').codes; -const { getOptionValue } = require('internal/options'); +const { getOptionValue, getEmbedderOptions } = require('internal/options'); const { loadPreloadModules, initializeFrozenIntrinsics, @@ -280,12 +280,13 @@ let _forceDefaultLoader = false; * @param {boolean} [forceDefaultLoader=false] - A boolean indicating disabling custom loaders. */ function initializeESM(forceDefaultLoader = false) { + const shouldSetOnIsolate = !getEmbedderOptions().shouldNotRegisterESMLoader; _forceDefaultLoader = forceDefaultLoader; initializeDefaultConditions(); // Setup per-realm callbacks that locate data or callbacks that we keep // track of for different ESM modules. - setInitializeImportMetaObjectCallback(initializeImportMetaObject); - setImportModuleDynamicallyCallback(importModuleDynamicallyCallback); + setInitializeImportMetaObjectCallback(initializeImportMetaObject, shouldSetOnIsolate); + setImportModuleDynamicallyCallback(importModuleDynamicallyCallback, shouldSetOnIsolate); } /** diff --git a/src/module_wrap.cc b/src/module_wrap.cc index 912acc8da815405531d8b527383f19c3731be100..8d48f4693c3b5f0d1d94d3edadc48c4f36d1bf97 100644 --- a/src/module_wrap.cc +++ b/src/module_wrap.cc @@ -858,7 +858,7 @@ MaybeLocal ModuleWrap::ResolveModuleCallback( return module->module_.Get(isolate); } -static MaybeLocal ImportModuleDynamically( +MaybeLocal ImportModuleDynamically( Local context, Local host_defined_options, Local resource_name, @@ -923,12 +923,13 @@ void ModuleWrap::SetImportModuleDynamicallyCallback( Realm* realm = Realm::GetCurrent(args); HandleScope handle_scope(isolate); - CHECK_EQ(args.Length(), 1); + CHECK_EQ(args.Length(), 2); CHECK(args[0]->IsFunction()); Local import_callback = args[0].As(); realm->set_host_import_module_dynamically_callback(import_callback); - isolate->SetHostImportModuleDynamicallyCallback(ImportModuleDynamically); + if (args[1]->IsBoolean() && args[1]->BooleanValue(isolate)) + isolate->SetHostImportModuleDynamicallyCallback(ImportModuleDynamically); } void ModuleWrap::HostInitializeImportMetaObjectCallback( @@ -970,13 +971,14 @@ void ModuleWrap::SetInitializeImportMetaObjectCallback( Realm* realm = Realm::GetCurrent(args); Isolate* isolate = realm->isolate(); - CHECK_EQ(args.Length(), 1); + CHECK_EQ(args.Length(), 2); CHECK(args[0]->IsFunction()); Local import_meta_callback = args[0].As(); realm->set_host_initialize_import_meta_object_callback(import_meta_callback); - isolate->SetHostInitializeImportMetaObjectCallback( - HostInitializeImportMetaObjectCallback); + if (args[1]->IsBoolean() && args[1]->BooleanValue(isolate)) + isolate->SetHostInitializeImportMetaObjectCallback( + HostInitializeImportMetaObjectCallback); } MaybeLocal ModuleWrap::SyntheticModuleEvaluationStepsCallback( diff --git a/src/module_wrap.h b/src/module_wrap.h index 83b5793013cbc453cf92c0a006fc7be3c06ad276..90353954bc497cb4ae413dc134850f8abb4efc7c 100644 --- a/src/module_wrap.h +++ b/src/module_wrap.h @@ -8,6 +8,7 @@ #include #include #include "base_object.h" +#include "node.h" #include "v8-script.h" namespace node { @@ -33,7 +34,14 @@ enum HostDefinedOptions : int { kLength = 9, }; -class ModuleWrap : public BaseObject { +NODE_EXTERN v8::MaybeLocal ImportModuleDynamically( + v8::Local context, + v8::Local host_defined_options, + v8::Local resource_name, + v8::Local specifier, + v8::Local import_assertions); + +class NODE_EXTERN ModuleWrap : public BaseObject { public: enum InternalFields { kModuleSlot = BaseObject::kInternalFieldCount, @@ -91,6 +99,8 @@ class ModuleWrap : public BaseObject { static void CreateRequiredModuleFacade( const v8::FunctionCallbackInfo& args); + static ModuleWrap* GetFromModule(node::Environment*, v8::Local); + private: ModuleWrap(Realm* realm, v8::Local object, @@ -129,7 +139,6 @@ class ModuleWrap : public BaseObject { v8::Local specifier, v8::Local import_attributes, v8::Local referrer); - static ModuleWrap* GetFromModule(node::Environment*, v8::Local); v8::Global module_; std::unordered_map> resolve_cache_;