diff --git a/shell/browser/api/electron_api_web_contents.cc b/shell/browser/api/electron_api_web_contents.cc index da7389567aa4..be1a45b8e91a 100644 --- a/shell/browser/api/electron_api_web_contents.cc +++ b/shell/browser/api/electron_api_web_contents.cc @@ -2760,15 +2760,17 @@ void WebContents::CloseDevTools() { if (type_ == Type::kRemote) return; - DCHECK(inspectable_web_contents_); - inspectable_web_contents_->CloseDevTools(); + if (inspectable_web_contents_) + inspectable_web_contents_->CloseDevTools(); } bool WebContents::IsDevToolsOpened() { if (type_ == Type::kRemote) return false; - DCHECK(inspectable_web_contents_); + if (!inspectable_web_contents_) + return false; + return inspectable_web_contents_->IsDevToolsViewShowing(); } @@ -2776,19 +2778,24 @@ std::u16string WebContents::GetDevToolsTitle() { if (type_ == Type::kRemote) return {}; - DCHECK(inspectable_web_contents_); + if (!inspectable_web_contents_) + return {}; + return inspectable_web_contents_->GetDevToolsTitle(); } void WebContents::SetDevToolsTitle(const std::u16string& title) { - inspectable_web_contents_->SetDevToolsTitle(title); + if (inspectable_web_contents_) + inspectable_web_contents_->SetDevToolsTitle(title); } bool WebContents::IsDevToolsFocused() { if (type_ == Type::kRemote) return false; - DCHECK(inspectable_web_contents_); + if (!inspectable_web_contents_) + return false; + return inspectable_web_contents_->GetView()->IsDevToolsViewFocused(); } @@ -2836,10 +2843,9 @@ void WebContents::InspectElement(int x, int y) { if (type_ == Type::kRemote) return; - if (!enable_devtools_) + if (!enable_devtools_ || !inspectable_web_contents_) return; - DCHECK(inspectable_web_contents_); if (!inspectable_web_contents_->GetDevToolsWebContents()) OpenDevTools(nullptr); inspectable_web_contents_->InspectElement(x, y); diff --git a/spec/api-web-contents-view-spec.ts b/spec/api-web-contents-view-spec.ts index 63f45c140edd..1d55c8253172 100644 --- a/spec/api-web-contents-view-spec.ts +++ b/spec/api-web-contents-view-spec.ts @@ -167,6 +167,26 @@ describe('WebContentsView', () => { }); }); + it('does not crash when closed via window.close()', async () => { + const bw = new BrowserWindow(); + const wcv = new WebContentsView(); + + await bw.loadURL('data:text/html,

Main Window

'); + bw.contentView.addChildView(wcv); + + const dto = new Promise((resolve) => { + wcv.webContents.on('blur', () => { + const devToolsOpen = wcv.webContents.isDevToolsOpened(); + resolve(devToolsOpen); + }); + }); + + wcv.webContents.loadURL('data:text/html,'); + + const open = await dto; + expect(open).to.be.false(); + }); + it('can be fullscreened', async () => { const w = new BaseWindow(); const v = new WebContentsView();