Browse Source

fix: NodeService order-of-destruction issue (#39829)

* refactor: make ElectronRendererClient::node_bindings_ a const ptr

refactor: make ElectronRendererClient::electron_bindings_ a const ptr

Co-authored-by: Charles Kerr <[email protected]>

* fix: order-of-destruction bug in NodeService

js_env_ depends on the uv_loop from node_bindings_, but is destroyed after node_bindings_

Co-authored-by: Charles Kerr <[email protected]>

* chore: revert unintentional commit

Co-authored-by: Charles Kerr <[email protected]>

---------

Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: Charles Kerr <[email protected]>
trop[bot] 1 year ago
parent
commit
036a382d66
2 changed files with 14 additions and 6 deletions
  1. 4 4
      shell/services/node/node_service.cc
  2. 10 2
      shell/services/node/node_service.h

+ 4 - 4
shell/services/node/node_service.cc

@@ -20,10 +20,10 @@ namespace electron {
 
 NodeService::NodeService(
     mojo::PendingReceiver<node::mojom::NodeService> receiver)
-    : node_bindings_(
-          NodeBindings::Create(NodeBindings::BrowserEnvironment::kUtility)),
-      electron_bindings_(
-          std::make_unique<ElectronBindings>(node_bindings_->uv_loop())) {
+    : node_bindings_{NodeBindings::Create(
+          NodeBindings::BrowserEnvironment::kUtility)},
+      electron_bindings_{
+          std::make_unique<ElectronBindings>(node_bindings_->uv_loop())} {
   if (receiver.is_valid())
     receiver_.Bind(std::move(receiver));
 }

+ 10 - 2
shell/services/node/node_service.h

@@ -37,10 +37,18 @@ class NodeService : public node::mojom::NodeService {
 
  private:
   bool node_env_stopped_ = false;
+
+  const std::unique_ptr<NodeBindings> node_bindings_;
+
+  // depends-on: node_bindings_'s uv_loop
+  const std::unique_ptr<ElectronBindings> electron_bindings_;
+
+  // depends-on: node_bindings_'s uv_loop
   std::unique_ptr<JavascriptEnvironment> js_env_;
-  std::unique_ptr<NodeBindings> node_bindings_;
-  std::unique_ptr<ElectronBindings> electron_bindings_;
+
+  // depends-on: js_env_'s isolate
   std::shared_ptr<node::Environment> node_env_;
+
   mojo::Receiver<node::mojom::NodeService> receiver_{this};
 };