diff --git a/components/script/canvas_state.rs b/components/script/canvas_state.rs index c9492ed5da50..ebf36bad32b3 100644 --- a/components/script/canvas_state.rs +++ b/components/script/canvas_state.rs @@ -388,6 +388,14 @@ impl CanvasState { 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 59238ca65457..1cfecef1728b 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/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 7143009c0549..000000000000 --- 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 d47648d6d4ac..000000000000 --- 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 73034e1a41fd..000000000000 --- 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 4b9cc677204f..000000000000 --- 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 e84629a9f0d7..000000000000 --- 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 0813bec1e54a..000000000000 --- 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/drawimage_html_image.html.ini b/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/drawimage_html_image.html.ini index 142318dfec44..1929974d9192 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