diff --git a/components/canvas/canvas_paint_thread.rs b/components/canvas/canvas_paint_thread.rs index 39c633e127b..b6360c638f9 100644 --- a/components/canvas/canvas_paint_thread.rs +++ b/components/canvas/canvas_paint_thread.rs @@ -547,6 +547,10 @@ impl<'a> CanvasPaintThread<'a> { fn recreate(&mut self, size: Size2D) { self.drawtarget = CanvasPaintThread::create(size); + // Webrender doesn't let images change size, so we clear the webrender image key. + if let Some(image_key) = self.image_key.take() { + self.webrender_api.delete_image(image_key); + } } fn send_pixels(&mut self, chan: IpcSender>>) { diff --git a/components/canvas/webgl_paint_thread.rs b/components/canvas/webgl_paint_thread.rs index 9f87d3a4f51..feabaed7d2a 100644 --- a/components/canvas/webgl_paint_thread.rs +++ b/components/canvas/webgl_paint_thread.rs @@ -291,7 +291,7 @@ impl WebGLPaintThread { #[allow(unsafe_code)] fn recreate(&mut self, size: Size2D) -> Result<(), &'static str> { match self.data { - WebGLPaintTaskData::Readback(ref mut context, _, _) => { + WebGLPaintTaskData::Readback(ref mut context, ref webrender_api, ref mut image_key) => { if size.width > self.size.width || size.height > self.size.height { self.size = try!(context.resize(size)); @@ -299,6 +299,10 @@ impl WebGLPaintThread { self.size = size; context.gl().scissor(0, 0, size.width, size.height); } + // Webrender doesn't let images change size, so we clear the webrender image key. + if let Some(image_key) = image_key.take() { + webrender_api.delete_image(image_key); + } } WebGLPaintTaskData::WebRender(ref api, id) => { let device_size = webrender_traits::DeviceIntSize::from_untyped(&size); diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json index 8ea37343341..e0694fdb2c0 100644 --- a/tests/wpt/mozilla/meta/MANIFEST.json +++ b/tests/wpt/mozilla/meta/MANIFEST.json @@ -6449,6 +6449,18 @@ {} ] ], + "mozilla/canvas/set_dimensions.html": [ + [ + "/_mozilla/mozilla/canvas/set_dimensions.html", + [ + [ + "/_mozilla/mozilla/canvas/set_dimensions_ref.html", + "==" + ] + ], + {} + ] + ], "mozilla/details_ui_closed.html": [ [ "/_mozilla/mozilla/details_ui_closed.html", @@ -9570,6 +9582,11 @@ {} ] ], + "mozilla/canvas/set_dimensions_ref.html": [ + [ + {} + ] + ], "mozilla/click_prevent.html": [ [ {} @@ -25493,6 +25510,14 @@ "794dd75566d0e2086deb0dcfc727dfe1834ca17e", "testharness" ], + "mozilla/canvas/set_dimensions.html": [ + "db6e4fa9b3480609a9a3a582430c64fb49b2b047", + "reftest" + ], + "mozilla/canvas/set_dimensions_ref.html": [ + "dd9ab8e1a360063d40e5155c1228e69154fa0966", + "support" + ], "mozilla/caption.html": [ "51ed2927d2f3910fb9c2dc4bb1ea4d41c261c8c1", "testharness" diff --git a/tests/wpt/mozilla/tests/mozilla/canvas/set_dimensions.html b/tests/wpt/mozilla/tests/mozilla/canvas/set_dimensions.html new file mode 100644 index 00000000000..4afff538f28 --- /dev/null +++ b/tests/wpt/mozilla/tests/mozilla/canvas/set_dimensions.html @@ -0,0 +1,25 @@ + + + + + Resizing a canvas + + + + + + + + diff --git a/tests/wpt/mozilla/tests/mozilla/canvas/set_dimensions_ref.html b/tests/wpt/mozilla/tests/mozilla/canvas/set_dimensions_ref.html new file mode 100644 index 00000000000..b3590cc402f --- /dev/null +++ b/tests/wpt/mozilla/tests/mozilla/canvas/set_dimensions_ref.html @@ -0,0 +1,17 @@ + + + + + Resizing a canvas reference + + + + + + +