mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-06-11 10:18:15 +09:00
LibWeb: Defer the handling of WebContent process crashes
Handling crashes synchronously is finicky since we're modifying the m_client_state struct while in a callback lambda owned by it. Let's avoid all the footguns here by simply using deferred_invoke() and handling the crash on next event loop iteration instead.
This commit is contained in:
parent
38781cb131
commit
e405a8f730
Notes:
sideshowbarker
2024-07-18 22:00:49 +09:00
Author: https://github.com/awesomekling
Commit: e405a8f730
2 changed files with 28 additions and 19 deletions
|
@ -52,31 +52,38 @@ OutOfProcessWebView::~OutOfProcessWebView()
|
|||
{
|
||||
}
|
||||
|
||||
void OutOfProcessWebView::handle_web_content_process_crash()
|
||||
{
|
||||
create_client();
|
||||
ASSERT(m_client_state.client);
|
||||
|
||||
// Don't keep a stale backup bitmap around.
|
||||
m_backup_bitmap = nullptr;
|
||||
|
||||
handle_resize();
|
||||
StringBuilder builder;
|
||||
builder.append("<html><head><title>Crashed: ");
|
||||
builder.append(escape_html_entities(m_url.to_string()));
|
||||
builder.append("</title></head><body>");
|
||||
builder.append("<h1>Web page crashed");
|
||||
if (!m_url.host().is_empty()) {
|
||||
builder.appendff(" on {}", escape_html_entities(m_url.host()));
|
||||
}
|
||||
builder.append("</h1>");
|
||||
builder.appendff("The web page <a href=\"{}\">{}</a> has crashed.<br><br>You can reload the page to try again.", escape_html_entities(m_url.to_string_encoded()), escape_html_entities(m_url.to_string()));
|
||||
builder.append("</body></html>");
|
||||
load_html(builder.to_string(), m_url);
|
||||
}
|
||||
|
||||
void OutOfProcessWebView::create_client()
|
||||
{
|
||||
m_client_state = {};
|
||||
|
||||
m_client_state.client = WebContentClient::construct(*this);
|
||||
m_client_state.client->on_web_content_process_crash = [this] {
|
||||
create_client();
|
||||
ASSERT(m_client_state.client);
|
||||
|
||||
// Don't keep a stale backup bitmap around.
|
||||
m_backup_bitmap = nullptr;
|
||||
|
||||
handle_resize();
|
||||
StringBuilder builder;
|
||||
builder.append("<html><head><title>Crashed: ");
|
||||
builder.append(escape_html_entities(m_url.to_string()));
|
||||
builder.append("</title></head><body>");
|
||||
builder.append("<h1>Web page crashed");
|
||||
if (!m_url.host().is_empty()) {
|
||||
builder.appendff(" on {}", escape_html_entities(m_url.host()));
|
||||
}
|
||||
builder.append("</h1>");
|
||||
builder.appendff("The web page <a href=\"{}\">{}</a> has crashed.<br><br>You can reload the page to try again.", escape_html_entities(m_url.to_string_encoded()), escape_html_entities(m_url.to_string()));
|
||||
builder.append("</body></html>");
|
||||
load_html(builder.to_string(), m_url);
|
||||
deferred_invoke([this] {
|
||||
handle_web_content_process_crash();
|
||||
});
|
||||
};
|
||||
|
||||
client().post_message(Messages::WebContentServer::UpdateSystemTheme(Gfx::current_system_theme_buffer()));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue