Browse Source

fix: uv loop polling when render process reuse enabled (#25924)

Shelley Vohr 4 years ago
parent
commit
13f319eddf
2 changed files with 27 additions and 3 deletions
  1. 3 3
      shell/renderer/electron_renderer_client.cc
  2. 24 0
      spec-main/api-browser-window-spec.ts

+ 3 - 3
shell/renderer/electron_renderer_client.cc

@@ -108,12 +108,12 @@ void ElectronRendererClient::DidCreateScriptContext(
 
   injected_frames_.insert(render_frame);
 
-  // If this is the first environment we are creating, prepare the node
-  // bindings.
   if (!node_integration_initialized_) {
     node_integration_initialized_ = true;
     node_bindings_->Initialize();
     node_bindings_->PrepareMessageLoop();
+  } else if (reuse_renderer_processes_enabled) {
+    node_bindings_->PrepareMessageLoop();
   }
 
   // Setup node tracing controller.
@@ -129,7 +129,7 @@ void ElectronRendererClient::DidCreateScriptContext(
 
   // If we have disabled the site instance overrides we should prevent loading
   // any non-context aware native module
-  if (command_line->HasSwitch(switches::kDisableElectronSiteInstanceOverrides))
+  if (reuse_renderer_processes_enabled)
     env->ForceOnlyContextAwareNativeModules();
   env->WarnNonContextAwareNativeModules();
 

+ 24 - 0
spec-main/api-browser-window-spec.ts

@@ -4202,6 +4202,30 @@ describe('BrowserWindow module', () => {
     });
   });
 
+  describe('reloading with allowRendererProcessReuse enabled', () => {
+    it('does not cause Node.js module API hangs after reload', (done) => {
+      const w = new BrowserWindow({
+        show: false,
+        webPreferences: {
+          nodeIntegration: true
+        }
+      });
+
+      let count = 0;
+      ipcMain.on('async-node-api-done', () => {
+        if (count === 3) {
+          ipcMain.removeAllListeners('async-node-api-done');
+          done();
+        } else {
+          count++;
+          w.reload();
+        }
+      });
+
+      w.loadFile(path.join(fixtures, 'pages', 'send-after-node.html'));
+    });
+  });
+
   ifdescribe(features.isOffscreenRenderingEnabled())('offscreen rendering', () => {
     let w: BrowserWindow;
     beforeEach(function () {