From c303346bc33fc1f789c93cef7255a719045c3c6d Mon Sep 17 00:00:00 2001 From: chylex <contact@chylex.com> Date: Sun, 20 Nov 2022 08:04:53 +0100 Subject: [PATCH] Halt reloading after subprocess crash if it happens too often --- .../Handlers/CefRequestHandler.cs | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/windows/TweetImpl.CefSharp/Handlers/CefRequestHandler.cs b/windows/TweetImpl.CefSharp/Handlers/CefRequestHandler.cs index a21e5c2d..579faf55 100644 --- a/windows/TweetImpl.CefSharp/Handlers/CefRequestHandler.cs +++ b/windows/TweetImpl.CefSharp/Handlers/CefRequestHandler.cs @@ -1,3 +1,4 @@ +using System.Diagnostics; using CefSharp; using CefSharp.Handler; using TweetImpl.CefSharp.Adapters; @@ -7,11 +8,11 @@ namespace TweetImpl.CefSharp.Handlers { sealed class CefRequestHandler : RequestHandler { public RequestHandlerLogic<IRequest> Logic { get; } - private readonly bool autoReload; + private readonly AutoReloader? autoReloader; public CefRequestHandler(CefLifeSpanHandler lifeSpanHandler, bool autoReload) { this.Logic = new RequestHandlerLogic<IRequest>(CefRequestAdapter.Instance, lifeSpanHandler.Logic); - this.autoReload = autoReload; + this.autoReloader = autoReload ? new AutoReloader() : null; } protected override bool OnBeforeBrowse(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool userGesture, bool isRedirect) { @@ -23,9 +24,31 @@ protected override bool OnOpenUrlFromTab(IWebBrowser browserControl, IBrowser br } protected override void OnRenderProcessTerminated(IWebBrowser browserControl, IBrowser browser, CefTerminationStatus status) { - if (autoReload) { + if (autoReloader?.RequestReload() == true) { browser.Reload(); } } + + private sealed class AutoReloader { + private readonly Stopwatch lastReload = Stopwatch.StartNew(); + private int rapidReloadCount; + + public bool RequestReload() { + if (rapidReloadCount >= 2) { + lastReload.Stop(); + return false; + } + + if (lastReload.ElapsedMilliseconds < 5000) { + ++rapidReloadCount; + } + else { + rapidReloadCount = 0; + } + + lastReload.Restart(); + return true; + } + } } }