Browse Source

fix: process.exit crash in nativeWindowOpen (#30235)

* fix: process.exit crash in nativeWindowOpen

* spec: add regression crash case

* chore: fix main -> index

Co-authored-by: Shelley Vohr <[email protected]>
trop[bot] 3 years ago
parent
commit
407a005ffb

+ 1 - 1
shell/browser/api/electron_api_browser_window.cc

@@ -156,7 +156,7 @@ void BrowserWindow::RenderFrameCreated(
 }
 
 void BrowserWindow::DidFirstVisuallyNonEmptyPaint() {
-  if (window()->IsVisible())
+  if (window()->IsClosed() || window()->IsVisible())
     return;
 
   // When there is a non-empty first paint, resize the RenderWidget to force

+ 3 - 0
spec-main/fixtures/crash-cases/native-window-open-exit/index.html

@@ -0,0 +1,3 @@
+<body>
+  MAIN PAGE
+</body>

+ 40 - 0
spec-main/fixtures/crash-cases/native-window-open-exit/index.js

@@ -0,0 +1,40 @@
+const { app, ipcMain, BrowserWindow } = require('electron');
+const path = require('path');
+const http = require('http');
+
+function createWindow () {
+  const mainWindow = new BrowserWindow({
+    webPreferences: {
+      webSecurity: false,
+      preload: path.join(__dirname, 'preload.js')
+    }
+  });
+
+  mainWindow.loadFile('index.html');
+  mainWindow.webContents.on('render-process-gone', () => {
+    process.exit(1);
+  });
+}
+
+const server = http.createServer((_req, res) => {
+  res.end('<title>hello</title>');
+}).listen(7001, '127.0.0.1');
+
+app.whenReady().then(() => {
+  createWindow();
+  app.on('activate', () => {
+    if (BrowserWindow.getAllWindows().length === 0) {
+      createWindow();
+    }
+  });
+});
+
+app.on('window-all-closed', function () {
+  if (process.platform !== 'darwin') app.quit();
+});
+
+ipcMain.on('test-done', () => {
+  console.log('test passed');
+  server.close();
+  process.exit(0);
+});

+ 6 - 0
spec-main/fixtures/crash-cases/native-window-open-exit/preload.js

@@ -0,0 +1,6 @@
+const { ipcRenderer } = require('electron');
+
+window.addEventListener('DOMContentLoaded', () => {
+  window.open('127.0.0.1:7001', '_blank');
+  setTimeout(() => ipcRenderer.send('test-done'));
+});