diff --git a/Userland/Libraries/LibWeb/OutOfProcessWebView.cpp b/Userland/Libraries/LibWeb/OutOfProcessWebView.cpp
index b731c0c6ea..84fc62bf5d 100644
--- a/Userland/Libraries/LibWeb/OutOfProcessWebView.cpp
+++ b/Userland/Libraries/LibWeb/OutOfProcessWebView.cpp
@@ -59,6 +59,10 @@ void OutOfProcessWebView::create_client()
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("
Crashed: ");
@@ -106,16 +110,14 @@ void OutOfProcessWebView::paint_event(GUI::PaintEvent& event)
GUI::Painter painter(*this);
painter.add_clip_rect(event.rect());
- if (!m_client_state.has_usable_bitmap) {
- painter.fill_rect(frame_inner_rect(), palette().base());
+ if (auto* bitmap = m_client_state.has_usable_bitmap ? m_client_state.front_bitmap.ptr() : m_backup_bitmap.ptr()) {
+ painter.add_clip_rect(frame_inner_rect());
+ painter.translate(frame_thickness(), frame_thickness());
+ painter.blit({ 0, 0 }, *bitmap, bitmap->rect());
return;
}
- painter.add_clip_rect(frame_inner_rect());
- painter.translate(frame_thickness(), frame_thickness());
-
- ASSERT(m_client_state.front_bitmap);
- painter.blit({ 0, 0 }, *m_client_state.front_bitmap, m_client_state.front_bitmap->rect());
+ painter.fill_rect(frame_inner_rect(), palette().base());
}
void OutOfProcessWebView::resize_event(GUI::ResizeEvent& event)
@@ -128,6 +130,11 @@ void OutOfProcessWebView::handle_resize()
{
client().post_message(Messages::WebContentServer::SetViewportRect(Gfx::IntRect({ horizontal_scrollbar().value(), vertical_scrollbar().value() }, available_size())));
+ if (m_client_state.has_usable_bitmap) {
+ // NOTE: We keep the outgoing front bitmap as a backup so we have something to paint until we get a new one.
+ m_backup_bitmap = m_client_state.front_bitmap;
+ }
+
if (m_client_state.front_bitmap) {
m_client_state.front_bitmap = nullptr;
client().post_message(Messages::WebContentServer::RemoveBackingStore(m_client_state.front_bitmap_id));
@@ -193,6 +200,8 @@ void OutOfProcessWebView::notify_server_did_paint(Badge, i32 b
m_client_state.has_usable_bitmap = true;
swap(m_client_state.back_bitmap, m_client_state.front_bitmap);
swap(m_client_state.back_bitmap_id, m_client_state.front_bitmap_id);
+ // We don't need the backup bitmap anymore, so drop it.
+ m_backup_bitmap = nullptr;
update();
}
}
diff --git a/Userland/Libraries/LibWeb/OutOfProcessWebView.h b/Userland/Libraries/LibWeb/OutOfProcessWebView.h
index 3bdfa39969..c6db3c982e 100644
--- a/Userland/Libraries/LibWeb/OutOfProcessWebView.h
+++ b/Userland/Libraries/LibWeb/OutOfProcessWebView.h
@@ -99,6 +99,8 @@ private:
i32 next_bitmap_id { 0 };
bool has_usable_bitmap { false };
} m_client_state;
+
+ RefPtr m_backup_bitmap;
};
}