Browse Source

fix: webview crash when removing in close event (#39008)

Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: Shelley Vohr <[email protected]>
trop[bot] 1 year ago
parent
commit
35cf190ab9

+ 3 - 1
shell/browser/api/electron_api_web_contents.cc

@@ -1343,7 +1343,9 @@ void WebContents::CloseContents(content::WebContents* source) {
   for (ExtendedWebContentsObserver& observer : observers_)
     observer.OnCloseContents();
 
-  Destroy();
+  // This is handled by the embedder frame.
+  if (!IsGuest())
+    Destroy();
 }
 
 void WebContents::ActivateContents(content::WebContents* source) {

+ 32 - 0
spec/fixtures/crash-cases/webview-remove-on-wc-close/index.html

@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+  <meta charset="UTF-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <title>Document</title>
+  <style>
+    .webview {
+      border: 1px solid black;
+    }
+  </style>
+</head>
+
+<body>
+  <button class="close-btn">close webview</button>
+  <webview class="webview" src="./webview.html"></webview>
+  <script>
+    const close = document.querySelector('.close-btn')
+    const webview = document.querySelector('.webview')
+
+    webview.addEventListener('close', () => {
+      webview.parentNode.removeChild(webview)
+    })
+
+    close.addEventListener('click', () => {
+      webview.executeJavaScript('window.close()', true)
+    })
+  </script>
+</body>
+
+</html>

+ 29 - 0
spec/fixtures/crash-cases/webview-remove-on-wc-close/index.js

@@ -0,0 +1,29 @@
+const { app, BrowserWindow } = require('electron');
+
+app.whenReady().then(() => {
+  const win = new BrowserWindow({
+    webPreferences: {
+      webviewTag: true
+    }
+  });
+
+  win.loadFile('index.html');
+
+  win.webContents.on('did-attach-webview', (event, contents) => {
+    contents.on('render-process-gone', () => {
+      process.exit(1);
+    });
+
+    contents.on('destroyed', () => {
+      process.exit(0);
+    });
+
+    contents.on('did-finish-load', () => {
+      win.webContents.executeJavaScript('document.querySelector(\'.close-btn\').click()');
+    });
+
+    contents.on('will-prevent-unload', event => {
+      event.preventDefault();
+    });
+  });
+});

+ 19 - 0
spec/fixtures/crash-cases/webview-remove-on-wc-close/webview.html

@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+  <meta charset="UTF-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <title>Document</title>
+</head>
+
+<body>
+  <h1>webview page</h1>
+  <script>
+    window.addEventListener('beforeunload', event => {
+      event.returnValue = 'test'
+    })
+  </script>
+</body>
+
+</html>