diff --git a/components/script/dom/htmlcanvaselement.rs b/components/script/dom/htmlcanvaselement.rs index 2fa7a233c75b..cad4fcec9517 100644 --- a/components/script/dom/htmlcanvaselement.rs +++ b/components/script/dom/htmlcanvaselement.rs @@ -258,39 +258,45 @@ impl HTMLCanvasElementMethods for HTMLCanvasElement { _mime_type: Option, _arguments: Vec) -> Fallible { + // Step 1. if let Some(CanvasContext::Context2d(ref context)) = *self.context.borrow() { - - // Step 1. if !context.origin_is_clean() { return Err(Error::Security); } + } - // Step 2. - if self.Width() == 0 || self.Height() == 0 { - return Ok(DOMString::from("data:,")); - } + // Step 2. + if self.Width() == 0 || self.Height() == 0 { + return Ok(DOMString::from("data:,")); + } - // Step 3. - let window = window_from_node(self); - let image_data = try!(context.GetImageData(Finite::wrap(0f64), Finite::wrap(0f64), - Finite::wrap(self.Width() as f64), - Finite::wrap(self.Height() as f64))); - let raw_data = image_data.get_data_array(&GlobalRef::Window(window.r())); - - // Only handle image/png for now. - let mime_type = "image/png"; - - let mut encoded = Vec::new(); - { - let encoder: PNGEncoder<&mut Vec> = PNGEncoder::new(&mut encoded); - encoder.encode(&raw_data, self.Width(), self.Height(), ColorType::RGBA(8)).unwrap(); + // Step 3. + let raw_data = match *self.context.borrow() { + Some(CanvasContext::Context2d(ref context)) => { + let window = window_from_node(self); + let image_data = try!(context.GetImageData(Finite::wrap(0f64), Finite::wrap(0f64), + Finite::wrap(self.Width() as f64), + Finite::wrap(self.Height() as f64))); + image_data.get_data_array(&GlobalRef::Window(window.r())) } + None => { + // Each pixel is fully-transparent black. + vec![0; (self.Width() * self.Height() * 4) as usize] + } + _ => return Err(Error::NotSupported) // WebGL + }; - let encoded = encoded.to_base64(STANDARD); - Ok(DOMString::from(format!("data:{};base64,{}", mime_type, encoded))) - } else { - Err(Error::NotSupported) + // Only handle image/png for now. + let mime_type = "image/png"; + + let mut encoded = Vec::new(); + { + let encoder: PNGEncoder<&mut Vec> = PNGEncoder::new(&mut encoded); + encoder.encode(&raw_data, self.Width(), self.Height(), ColorType::RGBA(8)).unwrap(); } + + let encoded = encoded.to_base64(STANDARD); + Ok(DOMString::from(format!("data:{};base64,{}", mime_type, encoded))) } } diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/toDataURL.nocontext.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/toDataURL.nocontext.html.ini deleted file mode 100644 index 22cd8e9b1513..000000000000 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/toDataURL.nocontext.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[toDataURL.nocontext.html] - type: testharness - [toDataURL works before any context has been got] - expected: FAIL - diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-canvas-element/toDataURL.nocontext.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-canvas-element/toDataURL.nocontext.html index f1138ee72759..07fb85dc8a1d 100644 --- a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-canvas-element/toDataURL.nocontext.html +++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-canvas-element/toDataURL.nocontext.html @@ -18,12 +18,13 @@

toDataURL.nocontext