From 10be99e172a98311e638db3979f501b1931be2aa 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 780a9766970c4..d1788dc9afc14 100644 --- a/shell/browser/api/electron_api_web_frame_main.cc +++ b/shell/browser/api/electron_api_web_frame_main.cc @@ -78,7 +78,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(); } @@ -136,7 +140,7 @@ v8::Local WebFrameMain::ExecuteJavaScript( } bool WebFrameMain::Reload() { - if (!CheckRenderFrame()) + if (render_frame_disposed_) return false; return render_frame_->Reload(); } @@ -152,7 +156,7 @@ void WebFrameMain::Send(v8::Isolate* isolate, return; } - if (!CheckRenderFrame()) + if (render_frame_disposed_) return; GetRendererApi()->Message(internal, channel, std::move(message), From b695c0f6d97cc3d27640c95605ed27b044c36d07 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 d1788dc9afc14..4a92e30da956b 100644 --- a/shell/browser/api/electron_api_web_frame_main.cc +++ b/shell/browser/api/electron_api_web_frame_main.cc @@ -78,11 +78,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(); } @@ -140,7 +136,7 @@ v8::Local WebFrameMain::ExecuteJavaScript( } bool WebFrameMain::Reload() { - if (render_frame_disposed_) + if (!CheckRenderFrame()) return false; return render_frame_->Reload(); } @@ -156,7 +152,7 @@ void WebFrameMain::Send(v8::Isolate* isolate, return; } - if (render_frame_disposed_) + if (!CheckRenderFrame()) return; GetRendererApi()->Message(internal, channel, std::move(message),