diff --git a/Userland/Libraries/LibWebView/ViewImplementation.cpp b/Userland/Libraries/LibWebView/ViewImplementation.cpp index 96b67d2f48..3c0bff806d 100644 --- a/Userland/Libraries/LibWebView/ViewImplementation.cpp +++ b/Userland/Libraries/LibWebView/ViewImplementation.cpp @@ -19,6 +19,12 @@ ViewImplementation::ViewImplementation() m_backing_store_shrink_timer = Core::Timer::create_single_shot(3000, [this] { resize_backing_stores_if_needed(WindowResizeInProgress::No); }).release_value_but_fixme_should_propagate_errors(); + + m_repeated_crash_timer = Core::Timer::create_single_shot(1000, [this] { + // Reset the "crashing a lot" counter after 1 second in case we just + // happen to be visiting crashy websites a lot. + this->m_crash_count = 0; + }).release_value_but_fixme_should_propagate_errors(); } WebContentClient& ViewImplementation::client() @@ -304,6 +310,15 @@ void ViewImplementation::handle_web_content_process_crash() { dbgln("WebContent process crashed!"); + ++m_crash_count; + constexpr size_t max_reasonable_crash_count = 5U; + if (m_crash_count >= max_reasonable_crash_count) { + dbgln("WebContent has crashed {} times in quick succession! Not restarting...", m_crash_count); + m_repeated_crash_timer->stop(); + return; + } + m_repeated_crash_timer->restart(); + create_client(); VERIFY(m_client_state.client); diff --git a/Userland/Libraries/LibWebView/ViewImplementation.h b/Userland/Libraries/LibWebView/ViewImplementation.h index f46a279f9a..432681fa7a 100644 --- a/Userland/Libraries/LibWebView/ViewImplementation.h +++ b/Userland/Libraries/LibWebView/ViewImplementation.h @@ -200,6 +200,9 @@ protected: RefPtr m_backup_bitmap; Gfx::IntSize m_backup_bitmap_size; + + size_t m_crash_count = 0; + RefPtr m_repeated_crash_timer; }; }