Skip to content

[Bug]: Electron will crash when I call BrowserView.destroy(). #37419

@TianbinTobin

Description

@TianbinTobin

Preflight Checklist

Electron Version

23.1.0

What operating system are you using?

Windows

Operating System Version

Windows 11 22H2 22621.1265

What arch are you using?

x64

Last Known Working Electron version

21.4.2

Expected Behavior

Electron will not exit and browserView will close.

Actual Behavior

Electron exited with code 3221225477.

Testcase Gist URL

No response

Additional Information

I publish fiddle to github failed. /(ㄒoㄒ)/~~

main.js

// Modules to control application life and create native browser window
const { app, BrowserWindow, BrowserView, ipcMain, dialog } = require('electron')
const path = require('path')

function createWindow() {
  // Create the browser window.
  const mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      nodeIntegration: false,
      contextIsolation: true,
      preload: path.join(__dirname, 'preload.js')
    }
  })

  // and load the index.html of the app.
  mainWindow.loadFile('index.html')

  const mainView = new BrowserView({
    webPreferences: {
      nodeIntegration: false,
      contextIsolation: true,
    }
  })

  mainView.webContents.loadURL('https://boardmix.cn/app/')

  mainWindow.setBrowserView(mainView);

  const windowBounds = mainWindow.getContentBounds();
  const viewWidth = windowBounds.width - 2;
  const viewHeight = windowBounds.height - 200 - 1;
  mainView.setBounds({ x: 1, y: 200, width: viewWidth, height: viewHeight });

  ipcMain.on('close', () => {
    if (!mainView.webContents || mainView.webContents.isDestroyed()) {
      dialog.showMessageBox({message: 'webContents is destroyed'})
    } else {
      mainView.webContents.destroy();
    }
  })

  // Open the DevTools.
  // mainWindow.webContents.openDevTools()
}

// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.whenReady().then(() => {
  createWindow()

  app.on('activate', function () {
    // On macOS it's common to re-create a window in the app when the
    // dock icon is clicked and there are no other windows open.
    if (BrowserWindow.getAllWindows().length === 0) createWindow()
  })
})

// Quit when all windows are closed, except on macOS. There, it's common
// for applications and their menu bar to stay active until the user quits
// explicitly with Cmd + Q.
app.on('window-all-closed', function () {
  if (process.platform !== 'darwin') app.quit()
})

// In this file you can include the rest of your app's specific main process
// code. You can also put them in separate files and require them here.

renderer.js

document.querySelector('h1').addEventListener('click', () => {
    desktopManagerApi.close();
})

preload.js

const { contextBridge, ipcRenderer } = require('electron')

contextBridge.exposeInMainWorld('desktopManagerApi', {
  close() {
    ipcRenderer.send('close')
  }
});

But, if i call webContents.close(), the destroyed event not be emitted. webContents.isDestroyed() is false.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions