[Chromium] Animation updates fail when using a canvas as a CSS backround-image style...
authorjunov@google.com <junov@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 30 Nov 2012 21:11:31 +0000 (21:11 +0000)
committerjunov@google.com <junov@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 30 Nov 2012 21:11:31 +0000 (21:11 +0000)
https://bugs.webkit.org/show_bug.cgi?id=103643

Reviewed by Stephen White.

.:

New test to verify that elements using a canvas as a style image
source are redrawn when the canvas is animated.  Added as a manual test
because the bug was not reproducible in DumpRenderTree.

* ManualTests/animated-canvas-as-background.html: Added.

Source/WebCore:

CanvasRenderingContext2D::didDraw was not propagating the change
notification to observers in the accelerated compositing case.
Problem fixed by adding observer notifications.

New manual test: animated-canvas-as-background.html

* html/HTMLCanvasElement.cpp:
(WebCore::HTMLCanvasElement::didDraw):
The observer notification was factored out into a separate method
so that it can be invoked directly for accelerated compositing.
(WebCore):
(WebCore::HTMLCanvasElement::notifyObserversCanvasChanged):
* html/HTMLCanvasElement.h:
(HTMLCanvasElement):
* html/canvas/CanvasRenderingContext2D.cpp:
(WebCore::CanvasRenderingContext2D::didDraw):
Added observer notification call to trigger repainting of elements that
use this canvas for their style.

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

ChangeLog
ManualTests/animated-canvas-as-background.html [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/html/HTMLCanvasElement.cpp
Source/WebCore/html/HTMLCanvasElement.h
Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp

index 3ebedc1..585cefc 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2012-11-30  Justin Novosad  <junov@google.com>
+
+        [Chromium] Animation updates fail when using a canvas as a CSS backround-image style with -webkit-canvas
+        https://bugs.webkit.org/show_bug.cgi?id=103643
+
+        Reviewed by Stephen White.
+
+        New test to verify that elements using a canvas as a style image
+        source are redrawn when the canvas is animated.  Added as a manual test
+        because the bug was not reproducible in DumpRenderTree.
+
+        * ManualTests/animated-canvas-as-background.html: Added.
+
 2012-11-30  Pierre Rossi  <pierre.rossi@gmail.com>
 
         [Qt] Unreviewed build break
diff --git a/ManualTests/animated-canvas-as-background.html b/ManualTests/animated-canvas-as-background.html
new file mode 100644 (file)
index 0000000..94f1772
--- /dev/null
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html>
+<head>
+<style>
+#container {
+    width: 300px;
+    height: 300px;
+    background-image: -webkit-canvas(sourceCanvas);
+    background-size: 100%;
+    display: inline-block;
+}
+</style>
+</head>
+<body>
+    <p>This test passes if two green squares are displayed below.</p>
+    <div>
+        <div style="display: inline-block">
+            <div id="container"></div>
+        </div>
+        <div id="canvas-container" style="display: inline-block"></div>
+    </div>
+    <script>
+        var ctx = document.getCSSCanvasContext('2d', 'sourceCanvas', 300, 300);
+        var canvas = ctx.canvas;
+
+        function asyncDraw2() {
+            ctx.fillStyle = "green";
+            ctx.fillRect(0, 0, 300, 300);
+        }
+
+        function asyncDraw1() {
+            ctx.fillStyle = "red";
+            ctx.fillRect(0, 0, 300, 300);
+            window.webkitRequestAnimationFrame(asyncDraw2);
+        }
+
+        window.webkitRequestAnimationFrame(asyncDraw1);
+
+        document.querySelector('#canvas-container').appendChild(canvas);
+    </script>
+</body>
+</html>
index 8fc6c0b..c341c52 100644 (file)
@@ -1,3 +1,29 @@
+2012-11-30  Justin Novosad  <junov@google.com>
+
+        [Chromium] Animation updates fail when using a canvas as a CSS backround-image style with -webkit-canvas
+        https://bugs.webkit.org/show_bug.cgi?id=103643
+
+        Reviewed by Stephen White.
+
+        CanvasRenderingContext2D::didDraw was not propagating the change
+        notification to observers in the accelerated compositing case.
+        Problem fixed by adding observer notifications.
+
+        New manual test: animated-canvas-as-background.html
+
+        * html/HTMLCanvasElement.cpp:
+        (WebCore::HTMLCanvasElement::didDraw):
+        The observer notification was factored out into a separate method
+        so that it can be invoked directly for accelerated compositing.
+        (WebCore):
+        (WebCore::HTMLCanvasElement::notifyObserversCanvasChanged):
+        * html/HTMLCanvasElement.h:
+        (HTMLCanvasElement):
+        * html/canvas/CanvasRenderingContext2D.cpp:
+        (WebCore::CanvasRenderingContext2D::didDraw):
+        Added observer notification call to trigger repainting of elements that
+        use this canvas for their style.
+
 2012-11-30  James Simonsen  <simonjam@chromium.org>
 
         Report CSS as initiator instead of elements, except body
index 006f9ab..7cbf2ed 100644 (file)
@@ -229,6 +229,11 @@ void HTMLCanvasElement::didDraw(const FloatRect& rect)
         ro->repaintRectangle(enclosingIntRect(m_dirtyRect));
     }
 
+    notifyObserversCanvasChanged(rect);
+}
+
+void HTMLCanvasElement::notifyObserversCanvasChanged(const FloatRect& rect)
+{
     HashSet<CanvasObserver*>::iterator end = m_observers.end();
     for (HashSet<CanvasObserver*>::iterator it = m_observers.begin(); it != end; ++it)
         (*it)->canvasChanged(this, rect);
index 2fd5d48..40067ee 100644 (file)
@@ -99,6 +99,7 @@ public:
 
     // Used for rendering
     void didDraw(const FloatRect&);
+    void notifyObserversCanvasChanged(const FloatRect&);
 
     void paint(GraphicsContext*, const LayoutRect&, bool useLowQualityScale = false);
 
index 3eb38a1..6e6b599 100644 (file)
@@ -1814,6 +1814,7 @@ void CanvasRenderingContext2D::didDraw(const FloatRect& r, unsigned options)
         if (renderBox && renderBox->hasAcceleratedCompositing()) {
             renderBox->contentChanged(CanvasPixelsChanged);
             canvas()->clearCopiedImage();
+            canvas()->notifyObserversCanvasChanged(r);
             return;
         }
     }