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