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; + } + } } }