Did I not get enough sleep or what? This following code
var frame=document.getElementById("viewer");
frame.width=100;
frame.height=100;
var ctx=frame.getContext("2d");
var img=new Image();
img.src="http://www.ansearch.com/images/interface/item/small/image.png"
img.onload=function() {
// draw image
ctx.drawImage(img, 0, 0)
// Here's where the error happens:
window.open(frame.toDataURL("image/png"));
}
is throwing this error:
SECURITY_ERR: DOM Exception 18
There's no way this shouldn't work! Can anyone explain this, please?
If you are simply drawing some images on a canvas, make sure you are loading the images from the same domain.
www.example.com is different to example.com
So make sure your images and the url you have in your address bar are the same, www or not.
Setting cross origin attribute on the image objects worked for me (i was using fabricjs)
For those using fabricjs, here's how to patch Image.fromUrl
In the specs it says:
If the image is coming from another server I don't think you can use toDataURL()
If the image is hosted on a host that sets either of Access-Control-Allow-Origin or Access-Control-Allow-Credentials, you can use Cross Origin Resource Sharing (CORS). See here (the crossorigin attribute) for more details.
Your other option is for your server to have an endpoint that fetches and serves an image. (eg. http://your_host/endpoint?url=URL) The downside of that approach being latency and theoretically unnecessary fetching.
If there are more alternate solutions, I'd be interested in hearing about them.