diff --git a/components/script/canvas_state.rs b/components/script/canvas_state.rs index c9492ed5da5..34ea6741660 100644 --- a/components/script/canvas_state.rs +++ b/components/script/canvas_state.rs @@ -382,12 +382,30 @@ impl CanvasState { ) -> ErrorResult { let result = match image { CanvasImageSource::HTMLCanvasElement(ref canvas) => { + // https://html.spec.whatwg.org/multipage/#check-the-usability-of-the-image-argument + if !canvas.is_valid() { + return Err(Error::InvalidState); + } + self.draw_html_canvas_element(&canvas, htmlcanvas, sx, sy, sw, sh, dx, dy, dw, dh) }, CanvasImageSource::OffscreenCanvas(ref canvas) => { + // https://html.spec.whatwg.org/multipage/#check-the-usability-of-the-image-argument + if !canvas.is_valid() { + return Err(Error::InvalidState); + } + self.draw_offscreen_canvas(&canvas, htmlcanvas, sx, sy, sw, sh, dx, dy, dw, dh) }, CanvasImageSource::HTMLImageElement(ref image) => { + // https://html.spec.whatwg.org/multipage/#drawing-images + // 2. Let usability be the result of checking the usability of image. + // 3. If usability is bad, then return (without drawing anything). + if !image.is_usable()? { + return Ok(()); + } + + // TODO(pylbrecht): is it possible for image.get_url() to return None after the usability check? // https://html.spec.whatwg.org/multipage/#img-error // If the image argument is an HTMLImageElement object that is in the broken state, // then throw an InvalidStateError exception diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs index 59238ca6545..1cfecef1728 100644 --- a/components/script/dom/htmlimageelement.rs +++ b/components/script/dom/htmlimageelement.rs @@ -13,7 +13,7 @@ use crate::dom::bindings::codegen::Bindings::HTMLImageElementBinding::HTMLImageE use crate::dom::bindings::codegen::Bindings::MouseEventBinding::MouseEventMethods; use crate::dom::bindings::codegen::Bindings::NodeBinding::NodeBinding::NodeMethods; use crate::dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; -use crate::dom::bindings::error::Fallible; +use crate::dom::bindings::error::{Error, Fallible}; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::refcounted::Trusted; use crate::dom::bindings::reflector::DomObject; @@ -164,6 +164,26 @@ impl HTMLImageElement { pub fn get_url(&self) -> Option { self.current_request.borrow().parsed_url.clone() } + // https://html.spec.whatwg.org/multipage/#check-the-usability-of-the-image-argument + pub fn is_usable(&self) -> Fallible { + // If image has an intrinsic width or intrinsic height (or both) equal to zero, then return bad. + match &self.current_request.borrow().image { + Some(image) => { + if image.width == 0 || image.height == 0 { + return Ok(false); + } + }, + None => return Ok(false), + } + + match self.current_request.borrow().state { + // If image's current request's state is broken, then throw an "InvalidStateError" DOMException. + State::Broken => Err(Error::InvalidState), + State::CompletelyAvailable => Ok(true), + // If image is not fully decodable, then return bad. + State::PartiallyAvailable | State::Unavailable => Ok(false), + } + } } /// The context required for asynchronously loading an external image. diff --git a/components/script/dom/offscreencanvas.rs b/components/script/dom/offscreencanvas.rs index 70e0573a2c4..130d2b7c49a 100644 --- a/components/script/dom/offscreencanvas.rs +++ b/components/script/dom/offscreencanvas.rs @@ -138,6 +138,10 @@ impl OffscreenCanvas { )); Some(context) } + + pub fn is_valid(&self) -> bool { + self.Width() != 0 && self.Height() != 0 + } } impl OffscreenCanvasMethods for OffscreenCanvas { diff --git a/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/2d.drawImage.broken.html.ini b/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/2d.drawImage.broken.html.ini deleted file mode 100644 index 7143009c054..00000000000 --- a/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/2d.drawImage.broken.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.drawImage.broken.html] - type: testharness - [Canvas test: 2d.drawImage.broken] - expected: FAIL - diff --git a/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/2d.drawImage.incomplete.emptysrc.html.ini b/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/2d.drawImage.incomplete.emptysrc.html.ini deleted file mode 100644 index d47648d6d4a..00000000000 --- a/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/2d.drawImage.incomplete.emptysrc.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.drawImage.incomplete.emptysrc.html] - type: testharness - [Canvas test: 2d.drawImage.incomplete.emptysrc] - expected: FAIL - diff --git a/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/2d.drawImage.incomplete.immediate.html.ini b/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/2d.drawImage.incomplete.immediate.html.ini deleted file mode 100644 index 73034e1a41f..00000000000 --- a/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/2d.drawImage.incomplete.immediate.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.drawImage.incomplete.immediate.html] - type: testharness - [Canvas test: 2d.drawImage.incomplete.immediate] - expected: FAIL - diff --git a/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/2d.drawImage.incomplete.nosrc.html.ini b/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/2d.drawImage.incomplete.nosrc.html.ini deleted file mode 100644 index 4b9cc677204..00000000000 --- a/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/2d.drawImage.incomplete.nosrc.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.drawImage.incomplete.nosrc.html] - type: testharness - [Canvas test: 2d.drawImage.incomplete.nosrc] - expected: FAIL - diff --git a/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/2d.drawImage.incomplete.reload.html.ini b/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/2d.drawImage.incomplete.reload.html.ini deleted file mode 100644 index e84629a9f0d..00000000000 --- a/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/2d.drawImage.incomplete.reload.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.drawImage.incomplete.reload.html] - type: testharness - [Canvas test: 2d.drawImage.incomplete.reload] - expected: FAIL - diff --git a/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/2d.drawImage.incomplete.removedsrc.html.ini b/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/2d.drawImage.incomplete.removedsrc.html.ini deleted file mode 100644 index 0813bec1e54..00000000000 --- a/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/2d.drawImage.incomplete.removedsrc.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.drawImage.incomplete.removedsrc.html] - type: testharness - [Canvas test: 2d.drawImage.incomplete.removedsrc] - expected: FAIL - diff --git a/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.html.ini b/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.html.ini deleted file mode 100644 index fd39e5a9200..00000000000 --- a/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.drawImage.zerocanvas.html] - type: testharness - [Canvas test: 2d.drawImage.zerocanvas] - expected: FAIL - diff --git a/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/drawimage_html_image.html.ini b/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/drawimage_html_image.html.ini index 142318dfec4..1929974d919 100644 --- a/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/drawimage_html_image.html.ini +++ b/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/drawimage_html_image.html.ini @@ -1,8 +1,5 @@ [drawimage_html_image.html] type: testharness - [Draw 100x100 image to 100x100 canvas at 0,0.] - expected: FAIL - [Test scenario 12: sx = -20, sy = -20, sw = 50, sh = 50, dx = 20, dy = 20, dw = 125, dh = 125 --- Pixel 70,99 should be light purple.] expected: FAIL diff --git a/tests/wpt/metadata/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.html.ini b/tests/wpt/metadata/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.html.ini deleted file mode 100644 index c37d1814b13..00000000000 --- a/tests/wpt/metadata/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[2d.drawImage.zerocanvas.html] - [OffscreenCanvas test: 2d.drawImage.zerocanvas] - expected: FAIL - diff --git a/tests/wpt/metadata/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.worker.js.ini b/tests/wpt/metadata/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.worker.js.ini deleted file mode 100644 index 8b67a6c1a53..00000000000 --- a/tests/wpt/metadata/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.worker.js.ini +++ /dev/null @@ -1,4 +0,0 @@ -[2d.drawImage.zerocanvas.worker.html] - [2d] - expected: FAIL -