From b0de48e85441ff710aab240fdfa8a34adbbee976 Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Thu, 7 Mar 2019 15:45:31 +0100 Subject: src,lib: make DOMException available in all Contexts This allows using `DOMException` from Node.js code for any `vm.Context`. PR-URL: https://github.com/nodejs/node/pull/26497 Reviewed-By: James M Snell --- src/api/environment.cc | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) (limited to 'src/api') diff --git a/src/api/environment.cc b/src/api/environment.cc index c4a8120d1c..6e3c61fac1 100644 --- a/src/api/environment.cc +++ b/src/api/environment.cc @@ -15,6 +15,7 @@ namespace node { using v8::Context; +using v8::EscapableHandleScope; using v8::Function; using v8::HandleScope; using v8::Isolate; @@ -22,7 +23,9 @@ using v8::Local; using v8::MaybeLocal; using v8::Message; using v8::MicrotasksPolicy; +using v8::Object; using v8::ObjectTemplate; +using v8::Private; using v8::String; using v8::Value; @@ -279,6 +282,26 @@ void FreePlatform(MultiIsolatePlatform* platform) { delete platform; } +MaybeLocal GetPerContextExports(Local context) { + Isolate* isolate = context->GetIsolate(); + EscapableHandleScope handle_scope(isolate); + + Local global = context->Global(); + Local key = Private::ForApi(isolate, + FIXED_ONE_BYTE_STRING(isolate, "node:per_context_binding_exports")); + + Local existing_value; + if (!global->GetPrivate(context, key).ToLocal(&existing_value)) + return MaybeLocal(); + if (existing_value->IsObject()) + return handle_scope.Escape(existing_value.As()); + + Local exports = Object::New(isolate); + if (context->Global()->SetPrivate(context, key, exports).IsNothing()) + return MaybeLocal(); + return handle_scope.Escape(exports); +} + Local NewContext(Isolate* isolate, Local object_template) { auto context = Context::New(isolate, nullptr, object_template); @@ -291,16 +314,25 @@ Local NewContext(Isolate* isolate, { // Run per-context JS files. Context::Scope context_scope(context); + Local exports; + if (!GetPerContextExports(context).ToLocal(&exports)) + return Local(); + + Local global_string = FIXED_ONE_BYTE_STRING(isolate, "global"); + Local exports_string = FIXED_ONE_BYTE_STRING(isolate, "exports"); static const char* context_files[] = { "internal/per_context/setup", + "internal/per_context/domexception", nullptr }; for (const char** module = context_files; *module != nullptr; module++) { std::vector> parameters = { - FIXED_ONE_BYTE_STRING(isolate, "global")}; - Local arguments[] = {context->Global()}; + global_string, + exports_string + }; + Local arguments[] = {context->Global(), exports}; MaybeLocal maybe_fn = per_process::native_module_loader.LookupAndCompile( context, *module, ¶meters, nullptr); -- cgit v1.2.3