From fd08a7c47e11f7c78435fa82eae0df753ad36b7d Mon Sep 17 00:00:00 2001 From: VerteDinde Date: Tue, 12 Oct 2021 15:41:05 -0700 Subject: [PATCH 1/2] fix: reset render_frame_disposed_ after hang --- shell/browser/api/electron_api_web_frame_main.cc | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/shell/browser/api/electron_api_web_frame_main.cc b/shell/browser/api/electron_api_web_frame_main.cc index 8f934108a1730..d567a4cf09fe5 100644 --- a/shell/browser/api/electron_api_web_frame_main.cc +++ b/shell/browser/api/electron_api_web_frame_main.cc @@ -100,7 +100,11 @@ void WebFrameMain::MarkRenderFrameDisposed() { void WebFrameMain::UpdateRenderFrameHost(content::RenderFrameHost* rfh) { // Should only be called when swapping frames. - DCHECK(render_frame_); + if (!render_frame_disposed_) { + DCHECK(render_frame_); + } else { + render_frame_disposed_ = false; + } render_frame_ = rfh; renderer_api_.reset(); } @@ -158,7 +162,7 @@ v8::Local WebFrameMain::ExecuteJavaScript( } bool WebFrameMain::Reload() { - if (!CheckRenderFrame()) + if (render_frame_disposed_) return false; return render_frame_->Reload(); } @@ -174,7 +178,7 @@ void WebFrameMain::Send(v8::Isolate* isolate, return; } - if (!CheckRenderFrame()) + if (render_frame_disposed_) return; GetRendererApi()->Message(internal, channel, std::move(message), From bf3462ec999f8037824f560c44fdac92dcaddff7 Mon Sep 17 00:00:00 2001 From: VerteDinde Date: Wed, 13 Oct 2021 13:53:04 -0700 Subject: [PATCH 2/2] fix: handle exception in webContents.send --- lib/browser/api/web-frame-main.ts | 12 ++++++++++-- shell/browser/api/electron_api_web_frame_main.cc | 10 +++------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/lib/browser/api/web-frame-main.ts b/lib/browser/api/web-frame-main.ts index 1ef76aa6f847a..2f75ee615a697 100644 --- a/lib/browser/api/web-frame-main.ts +++ b/lib/browser/api/web-frame-main.ts @@ -7,7 +7,11 @@ WebFrameMain.prototype.send = function (channel, ...args) { throw new Error('Missing required channel argument'); } - return this._send(false /* internal */, channel, args); + try { + return this._send(false /* internal */, channel, args); + } catch (e) { + console.error('Error sending from webFrameMain: ', e); + } }; WebFrameMain.prototype._sendInternal = function (channel, ...args) { @@ -15,7 +19,11 @@ WebFrameMain.prototype._sendInternal = function (channel, ...args) { throw new Error('Missing required channel argument'); } - return this._send(true /* internal */, channel, args); + try { + return this._send(true /* internal */, channel, args); + } catch (e) { + console.error('Error sending from webFrameMain: ', e); + } }; WebFrameMain.prototype.postMessage = function (...args) { diff --git a/shell/browser/api/electron_api_web_frame_main.cc b/shell/browser/api/electron_api_web_frame_main.cc index d567a4cf09fe5..c5a5945ba0a2a 100644 --- a/shell/browser/api/electron_api_web_frame_main.cc +++ b/shell/browser/api/electron_api_web_frame_main.cc @@ -100,11 +100,7 @@ void WebFrameMain::MarkRenderFrameDisposed() { void WebFrameMain::UpdateRenderFrameHost(content::RenderFrameHost* rfh) { // Should only be called when swapping frames. - if (!render_frame_disposed_) { - DCHECK(render_frame_); - } else { - render_frame_disposed_ = false; - } + render_frame_disposed_ = false; render_frame_ = rfh; renderer_api_.reset(); } @@ -162,7 +158,7 @@ v8::Local WebFrameMain::ExecuteJavaScript( } bool WebFrameMain::Reload() { - if (render_frame_disposed_) + if (!CheckRenderFrame()) return false; return render_frame_->Reload(); } @@ -178,7 +174,7 @@ void WebFrameMain::Send(v8::Isolate* isolate, return; } - if (render_frame_disposed_) + if (!CheckRenderFrame()) return; GetRendererApi()->Message(internal, channel, std::move(message),