From b97a900595af4ca19d2eaf334a758387fc977557 Mon Sep 17 00:00:00 2001 From: Linus Groh Date: Sun, 8 Nov 2020 15:07:57 +0000 Subject: [PATCH] LibWeb: Don't attempt to create new bitmap for zero-size OOPWV It's not possible to construct a Gfx::Bitmap with empty size. Let the client know the new viewport rect and return before even attempting to create new front and back bitmaps. Also consider that we might have to paint the widget but not have a front/back bitmap available (e.g. when only part of a scrollbar is visible, and the inner rect is empty). --- Libraries/LibWeb/OutOfProcessWebView.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Libraries/LibWeb/OutOfProcessWebView.cpp b/Libraries/LibWeb/OutOfProcessWebView.cpp index 87933b1ec6..736f523233 100644 --- a/Libraries/LibWeb/OutOfProcessWebView.cpp +++ b/Libraries/LibWeb/OutOfProcessWebView.cpp @@ -71,6 +71,10 @@ void OutOfProcessWebView::paint_event(GUI::PaintEvent& event) { GUI::ScrollableWidget::paint_event(event); + // If the available size is empty, we don't have a front or back bitmap to draw. + if (available_size().is_empty()) + return; + GUI::Painter painter(*this); painter.add_clip_rect(frame_inner_rect()); painter.add_clip_rect(event.rect()); @@ -84,9 +88,14 @@ void OutOfProcessWebView::resize_event(GUI::ResizeEvent& event) { GUI::ScrollableWidget::resize_event(event); + client().post_message(Messages::WebContentServer::SetViewportRect(Gfx::IntRect({ horizontal_scrollbar().value(), vertical_scrollbar().value() }, available_size()))); + m_front_bitmap = nullptr; m_back_bitmap = nullptr; + if (available_size().is_empty()) + return; + // FIXME: Don't create a temporary bitmap just to convert it to one backed by a shared buffer. if (auto helper = Gfx::Bitmap::create(Gfx::BitmapFormat::RGB32, available_size())) { m_front_bitmap = helper->to_bitmap_backed_by_shared_buffer(); @@ -101,7 +110,6 @@ void OutOfProcessWebView::resize_event(GUI::ResizeEvent& event) m_back_bitmap->shared_buffer()->share_with(client().server_pid()); } - client().post_message(Messages::WebContentServer::SetViewportRect(Gfx::IntRect({ horizontal_scrollbar().value(), vertical_scrollbar().value() }, available_size()))); request_repaint(); }