瀏覽代碼

LibWeb: Coalesce nested repaint requests instead of swallowing them

Previously we would ignore repaint requests that came in via OOPWV while
the WebContent process was busy with a previous paint request.

This caused some easy-to-trigger bugs where the painted content would be
"one paint behind", especially noticeable when scrolling.
Andreas Kling 3 年之前
父節點
當前提交
f72a37b9d4
共有 2 個文件被更改,包括 9 次插入1 次删除
  1. 8 1
      Userland/Libraries/LibWeb/OutOfProcessWebView.cpp
  2. 1 0
      Userland/Libraries/LibWeb/OutOfProcessWebView.h

+ 8 - 1
Userland/Libraries/LibWeb/OutOfProcessWebView.cpp

@@ -207,6 +207,11 @@ void OutOfProcessWebView::notify_server_did_paint(Badge<WebContentClient>, i32 b
         // We don't need the backup bitmap anymore, so drop it.
         m_backup_bitmap = nullptr;
         update();
+
+        if (m_client_state.got_repaint_requests_while_painting) {
+            m_client_state.got_repaint_requests_while_painting = false;
+            request_repaint();
+        }
     }
 }
 
@@ -399,8 +404,10 @@ void OutOfProcessWebView::request_repaint()
     if (!m_client_state.back_bitmap.bitmap)
         return;
     // Don't request a repaint until pending paint requests have finished.
-    if (m_client_state.back_bitmap.pending_paints)
+    if (m_client_state.back_bitmap.pending_paints) {
+        m_client_state.got_repaint_requests_while_painting = true;
         return;
+    }
     m_client_state.back_bitmap.pending_paints++;
     client().async_paint(m_client_state.back_bitmap.bitmap->rect().translated(horizontal_scrollbar().value(), vertical_scrollbar().value()), m_client_state.back_bitmap.id);
 }

+ 1 - 0
Userland/Libraries/LibWeb/OutOfProcessWebView.h

@@ -125,6 +125,7 @@ private:
         SharedBitmap back_bitmap;
         i32 next_bitmap_id { 0 };
         bool has_usable_bitmap { false };
+        bool got_repaint_requests_while_painting { false };
     } m_client_state;
 
     RefPtr<Gfx::Bitmap> m_backup_bitmap;