Browse Source

fix: crash calling `BrowserWindow.removeBrowserView()` with destroyed `webContents` (#38884)

fix: crash calling removeBrowserView() with destroyed webContents

https://github.com/electron/electron/issues/37642

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
192295697e

+ 4 - 0
shell/browser/api/electron_api_browser_view.cc

@@ -134,6 +134,10 @@ void BrowserView::WebContentsDestroyed() {
   Unpin();
 }
 
+void BrowserView::OnCloseContents() {
+  api_web_contents_ = nullptr;
+}
+
 // static
 gin::Handle<BrowserView> BrowserView::New(gin_helper::ErrorThrower thrower,
                                           gin::Arguments* args) {

+ 3 - 0
shell/browser/api/electron_api_browser_view.h

@@ -71,6 +71,9 @@ class BrowserView : public gin::Wrappable<BrowserView>,
   // content::WebContentsObserver:
   void WebContentsDestroyed() override;
 
+  // ExtendedWebContentsObserver:
+  void OnCloseContents() override;
+
  private:
   void SetAutoResize(AutoResizeFlags flags);
   void SetBounds(const gfx::Rect& bounds);

+ 14 - 0
spec/api-browser-view-spec.ts

@@ -257,6 +257,20 @@ describe('BrowserView module', () => {
         w.removeBrowserView(view);
       }).to.not.throw();
     });
+
+    it('can be called on a BrowserView with a destroyed webContents', (done) => {
+      view = new BrowserView();
+      w.addBrowserView(view);
+
+      view.webContents.on('destroyed', () => {
+        w.removeBrowserView(view);
+        done();
+      });
+
+      view.webContents.loadURL('data:text/html,hello there').then(() => {
+        view.webContents.close();
+      });
+    });
   });
 
   describe('BrowserWindow.getBrowserViews()', () => {