From b90a5baa6dc7f745bf8779dd79d51229a3f8593d Mon Sep 17 00:00:00 2001 From: Shelley Vohr Date: Mon, 5 Dec 2022 18:07:49 +0100 Subject: [PATCH] fix: new WebAssembly API support in Node.js (#36420) --- script/node-disabled-tests.json | 1 - shell/app/node_main.cc | 9 ++++++--- shell/browser/javascript_environment.cc | 20 +++++++++++++++++--- shell/browser/javascript_environment.h | 5 +++-- 4 files changed, 26 insertions(+), 9 deletions(-) diff --git a/script/node-disabled-tests.json b/script/node-disabled-tests.json index 75ac34527968..e3c02f543643 100644 --- a/script/node-disabled-tests.json +++ b/script/node-disabled-tests.json @@ -121,7 +121,6 @@ "parallel/test-trace-events-v8", "parallel/test-trace-events-vm", "parallel/test-trace-events-worker-metadata", - "parallel/test-wasm-web-api", "parallel/test-webcrypto-derivebits-cfrg", "parallel/test-webcrypto-derivekey-cfrg", "parallel/test-webcrypto-encrypt-decrypt", diff --git a/shell/app/node_main.cc b/shell/app/node_main.cc index efadfd0d031b..3a8fc540c141 100644 --- a/shell/app/node_main.cc +++ b/shell/app/node_main.cc @@ -205,7 +205,11 @@ int NodeMain(int argc, char* argv[]) { uv_loop_configure(loop, UV_METRICS_IDLE_TIME); // Initialize gin::IsolateHolder. - JavascriptEnvironment gin_env(loop); + bool setup_wasm_streaming = + node::per_process::cli_options->get_per_isolate_options() + ->get_per_env_options() + ->experimental_fetch; + JavascriptEnvironment gin_env(loop, setup_wasm_streaming); v8::Isolate* isolate = gin_env.isolate(); @@ -226,8 +230,7 @@ int NodeMain(int argc, char* argv[]) { static_cast(env_flags)); CHECK_NE(nullptr, env); - node::IsolateSettings is; - node::SetIsolateUpForNode(isolate, is); + node::SetIsolateUpForNode(isolate); gin_helper::Dictionary process(isolate, env->process_object()); process.SetMethod("crash", &ElectronBindings::Crash); diff --git a/shell/browser/javascript_environment.cc b/shell/browser/javascript_environment.cc index 0e674a72c577..e7244dd09500 100644 --- a/shell/browser/javascript_environment.cc +++ b/shell/browser/javascript_environment.cc @@ -24,6 +24,7 @@ #include "shell/common/gin_helper/cleaned_up_at_exit.h" #include "shell/common/node_includes.h" #include "third_party/blink/public/common/switches.h" +#include "third_party/electron_node/src/node_wasm_web_api.h" namespace { v8::Isolate* g_isolate; @@ -73,8 +74,9 @@ struct base::trace_event::TraceValue::Helper< namespace electron { -JavascriptEnvironment::JavascriptEnvironment(uv_loop_t* event_loop) - : isolate_(Initialize(event_loop)), +JavascriptEnvironment::JavascriptEnvironment(uv_loop_t* event_loop, + bool setup_wasm_streaming) + : isolate_(Initialize(event_loop, setup_wasm_streaming)), isolate_holder_(base::ThreadTaskRunnerHandle::Get(), gin::IsolateHolder::kSingleThread, gin::IsolateHolder::kAllowAtomicsWait, @@ -247,7 +249,8 @@ class TracingControllerImpl : public node::tracing::TracingController { } }; -v8::Isolate* JavascriptEnvironment::Initialize(uv_loop_t* event_loop) { +v8::Isolate* JavascriptEnvironment::Initialize(uv_loop_t* event_loop, + bool setup_wasm_streaming) { auto* cmd = base::CommandLine::ForCurrentProcess(); // --js-flags. @@ -276,6 +279,17 @@ v8::Isolate* JavascriptEnvironment::Initialize(uv_loop_t* event_loop) { v8::Isolate* isolate = v8::Isolate::Allocate(); platform_->RegisterIsolate(isolate, event_loop); + + // This is done here because V8 checks for the callback in NewContext. + // Our setup order doesn't allow for calling SetupIsolateForNode + // before NewContext without polluting JavaScriptEnvironment with + // Node.js logic and so we conditionally do it here to keep + // concerns separate. + if (setup_wasm_streaming) { + isolate->SetWasmStreamingCallback( + node::wasm_web_api::StartStreamingCompilation); + } + g_isolate = isolate; return isolate; diff --git a/shell/browser/javascript_environment.h b/shell/browser/javascript_environment.h index de9cbf409efe..c40a939127a4 100644 --- a/shell/browser/javascript_environment.h +++ b/shell/browser/javascript_environment.h @@ -22,7 +22,8 @@ class MicrotasksRunner; // Manage the V8 isolate and context automatically. class JavascriptEnvironment { public: - explicit JavascriptEnvironment(uv_loop_t* event_loop); + explicit JavascriptEnvironment(uv_loop_t* event_loop, + bool setup_wasm_streaming = false); ~JavascriptEnvironment(); // disable copy @@ -41,7 +42,7 @@ class JavascriptEnvironment { static v8::Isolate* GetIsolate(); private: - v8::Isolate* Initialize(uv_loop_t* event_loop); + v8::Isolate* Initialize(uv_loop_t* event_loop, bool setup_wasm_streaming); std::unique_ptr platform_; v8::Isolate* isolate_;