瀏覽代碼

LibWeb: Don't assume backing store allocation succeeds on OOPWV resize

Backing store allocation can fail if the requested size is too small,
or too large. We should not crash when this happens.

Fixes #3986.
Andreas Kling 4 年之前
父節點
當前提交
2d96a07b26
共有 1 個文件被更改,包括 15 次插入4 次删除
  1. 15 4
      Libraries/LibWeb/OutOfProcessWebView.cpp

+ 15 - 4
Libraries/LibWeb/OutOfProcessWebView.cpp

@@ -84,11 +84,22 @@ void OutOfProcessWebView::resize_event(GUI::ResizeEvent& event)
 {
     GUI::ScrollableWidget::resize_event(event);
 
-    m_front_bitmap = Gfx::Bitmap::create(Gfx::BitmapFormat::RGB32, available_size())->to_bitmap_backed_by_shared_buffer();
-    m_front_bitmap->shared_buffer()->share_with(client().server_pid());
+    m_front_bitmap = nullptr;
+    m_back_bitmap = nullptr;
+
+    // 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();
+        ASSERT(m_front_bitmap);
+        m_front_bitmap->shared_buffer()->share_with(client().server_pid());
+    }
 
-    m_back_bitmap = Gfx::Bitmap::create(Gfx::BitmapFormat::RGB32, available_size())->to_bitmap_backed_by_shared_buffer();
-    m_back_bitmap->shared_buffer()->share_with(client().server_pid());
+    // 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_back_bitmap = helper->to_bitmap_backed_by_shared_buffer();
+        ASSERT(m_back_bitmap);
+        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();