[ macOS ] REGRESSION(r262366): webgl/1.0.3/conformance/canvas/buffer-offscreen-test...
authordino@apple.com <dino@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 3 Jun 2020 18:48:00 +0000 (18:48 +0000)
committerdino@apple.com <dino@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 3 Jun 2020 18:48:00 +0000 (18:48 +0000)
https://bugs.webkit.org/show_bug.cgi?id=212594
<rdar://problem/63828783>

Reviewed by Eric Carlson.

The change in r262366 split the OpenGL work to prepare a canvas for rendering from the actual painting
(or compositing in this case). Canvas elements were being "prepared" at the end of the HTML run loop
if they'd done anything that would change pixels. The problem is that canvas elements that are not in
the document body are never composited, and thus should never be prepared, otherwise they will clear
their drawing buffer. In other words, a canvas in this state must keep the same buffer through
each rendering frame.

The solution is to check if the canvas is in the tree scope at the time we consider preparing
it for display.

* dom/Document.cpp:
(WebCore::Document::prepareCanvasesForDisplayIfNeeded):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@262498 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/platform/mac/TestExpectations
Source/WebCore/ChangeLog
Source/WebCore/dom/Document.cpp

index 9b71111..9f72e3b 100644 (file)
@@ -1964,9 +1964,6 @@ webkit.org/b/212226 imported/w3c/web-platform-tests/css/css-grid/alignment/self-
 
 webkit.org/b/212488 [ Catalina ] media/video-play-audio-require-user-gesture.html [ Pass Timeout ]
 
-webkit.org/b/212594 webgl/2.0.0/conformance/canvas/buffer-offscreen-test.html [ Failure ]
-webkit.org/b/212594 webgl/1.0.3/conformance/canvas/buffer-offscreen-test.html [ Failure ]
-
 # This test requires an update to system decoders
 webkit.org/b/212565 [ Catalina Mojave ] imported/w3c/web-platform-tests/encoding/single-byte-decoder.html [ Failure ]
 
index a93201c..a8591ac 100644 (file)
@@ -1,3 +1,24 @@
+2020-06-02  Dean Jackson  <dino@apple.com>
+
+        [ macOS ] REGRESSION(r262366): webgl/1.0.3/conformance/canvas/buffer-offscreen-test.html & webgl/2.0.0/conformance/canvas/buffer-offscreen-test.html are constant failures
+        https://bugs.webkit.org/show_bug.cgi?id=212594
+        <rdar://problem/63828783>
+
+        Reviewed by Eric Carlson.
+
+        The change in r262366 split the OpenGL work to prepare a canvas for rendering from the actual painting
+        (or compositing in this case). Canvas elements were being "prepared" at the end of the HTML run loop
+        if they'd done anything that would change pixels. The problem is that canvas elements that are not in
+        the document body are never composited, and thus should never be prepared, otherwise they will clear
+        their drawing buffer. In other words, a canvas in this state must keep the same buffer through
+        each rendering frame.
+
+        The solution is to check if the canvas is in the tree scope at the time we consider preparing
+        it for display.
+
+        * dom/Document.cpp:
+        (WebCore::Document::prepareCanvasesForDisplayIfNeeded):
+
 2020-06-03  John Wilander  <wilander@apple.com>
 
         Storage Access API: Add setting for per-page storage access scope
index e311915..99539c6 100644 (file)
@@ -8587,6 +8587,13 @@ void Document::prepareCanvasesForDisplayIfNeeded()
     // Some canvas contexts need to do work when rendering has finished but
     // before their content is composited.
     for (auto* canvas : m_canvasesNeedingDisplayPreparation) {
+        // However, if they are not in the document body, then they won't
+        // be composited and thus don't need preparation. Unfortunately they
+        // can't tell at the time they were added to the list, since they
+        // could be inserted or removed from the document body afterwards.
+        if (!canvas->isInTreeScope())
+            continue;
+
         auto refCountedCanvas = makeRefPtr(canvas);
         refCountedCanvas->prepareForDisplay();
     }