From 46eed81aaea02ad5089b1e7769d9e4d878bded94 Mon Sep 17 00:00:00 2001 From: attila Date: Thu, 19 Sep 2024 17:37:27 +0200 Subject: [PATCH] Windows: WebBrowserComponent: Avoid infinite loops caused by CONNECTION_ABORTED errors WebView2 can emit COREWEBVIEW2_WEB_ERROR_STATUS_CONNECTION_ABORTED errors during page navigation, even if the page navigation would happen correctly afterwards. In such situations our internal error handler can recursively encounter this error when trying to navigate to the error handler page. Prior to this commit the implementation could end up in an infinite loop receiving the error and then navigating to the error handler page. --- .../misc/juce_WebBrowserComponent.h | 3 +++ .../juce_WebBrowserComponent_windows.cpp | 24 ++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/modules/juce_gui_extra/misc/juce_WebBrowserComponent.h b/modules/juce_gui_extra/misc/juce_WebBrowserComponent.h index 8366bc4ea3..00baa0ecc0 100644 --- a/modules/juce_gui_extra/misc/juce_WebBrowserComponent.h +++ b/modules/juce_gui_extra/misc/juce_WebBrowserComponent.h @@ -606,6 +606,9 @@ public: The errorInfo contains some platform dependent string describing the error. + + Calling goToURL() inside this callback can encounter further network + errors, potentially causing an infinite loop. */ virtual bool pageLoadHadNetworkError (const String& errorInfo); diff --git a/modules/juce_gui_extra/native/juce_WebBrowserComponent_windows.cpp b/modules/juce_gui_extra/native/juce_WebBrowserComponent_windows.cpp index 0f673b66db..5406ea40ba 100644 --- a/modules/juce_gui_extra/native/juce_WebBrowserComponent_windows.cpp +++ b/modules/juce_gui_extra/native/juce_WebBrowserComponent_windows.cpp @@ -806,7 +806,29 @@ private: auto errorString = "Error code: " + String (errorStatus); if (owner.pageLoadHadNetworkError (errorString)) - owner.goToURL ("data:text/plain;charset=UTF-8," + errorString); + { + const auto adhocErrorPageUrl = "data:text/plain;charset=UTF-8," + errorString; + + if (owner.lastURL == adhocErrorPageUrl) + { + // We encountered an error while trying to navigate to the adhoc + // error page. Trying to navigate to the error page again would + // likely end us up in an infinite error callback loop, so we + // early exit. + // + // Override WebBrowserComponent::pageLoadHadNetworkError and + // return false to avoid such a loop, while still being able to + // take action on the error if necessary. + // + // Receiving Error code: 9 can often be ignored safely with the + // current WebView2 implementation. + jassertfalse; + + return S_OK; + } + + owner.goToURL (adhocErrorPageUrl); + } } }