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
+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
--- /dev/null
+<!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>
+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
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);
// Used for rendering
void didDraw(const FloatRect&);
+ void notifyObserversCanvasChanged(const FloatRect&);
void paint(GraphicsContext*, const LayoutRect&, bool useLowQualityScale = false);
if (renderBox && renderBox->hasAcceleratedCompositing()) {
renderBox->contentChanged(CanvasPixelsChanged);
canvas()->clearCopiedImage();
+ canvas()->notifyObserversCanvasChanged(r);
return;
}
}