Browse Source

fix: crash on browserView.webContents.destroy() (#31827)

Co-authored-by: Shelley Vohr <[email protected]>
trop[bot] 3 years ago
parent
commit
2cc843737b
2 changed files with 11 additions and 3 deletions
  1. 1 2
      shell/browser/api/electron_api_web_contents.cc
  2. 10 1
      spec-main/api-browser-view-spec.ts

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

@@ -980,8 +980,7 @@ void WebContents::DeleteThisIfAlive() {
 void WebContents::Destroy() {
   // The content::WebContents should be destroyed asyncronously when possible
   // as user may choose to destroy WebContents during an event of it.
-  if (Browser::Get()->is_shutting_down() || IsGuest() ||
-      type_ == Type::kBrowserView) {
+  if (Browser::Get()->is_shutting_down() || IsGuest()) {
     DeleteThisIfAlive();
   } else {
     base::PostTask(FROM_HERE, {content::BrowserThread::UI},

+ 10 - 1
spec-main/api-browser-view-spec.ts

@@ -151,7 +151,7 @@ describe('BrowserView module', () => {
       w.addBrowserView(view);
     });
 
-    it('does not crash if the BrowserView webContents are destroyed prior to window removal', () => {
+    it('does not crash if the BrowserView webContents are destroyed prior to window addition', () => {
       expect(() => {
         const view1 = new BrowserView();
         (view1.webContents as any).destroy();
@@ -159,6 +159,15 @@ describe('BrowserView module', () => {
       }).to.not.throw();
     });
 
+    it('does not crash if the webContents is destroyed after a URL is loaded', () => {
+      view = new BrowserView();
+      expect(async () => {
+        view.setBounds({ x: 0, y: 0, width: 400, height: 300 });
+        await view.webContents.loadURL('data:text/html,hello there');
+        view.webContents.destroy();
+      }).to.not.throw();
+    });
+
     it('can handle BrowserView reparenting', async () => {
       view = new BrowserView();