first of all, I know that accessing toDataURL
method of canvas when its source image is from another origin is a security issue.
but in my case, I am using data:
url as the source of my img
and then use img
and draw it on canvas
and then call canvas.toDataUrl
.
this works fine on Chrome and Firefox but fails with security error in IE!
any idea?
...
var svgxml = getxmlsvg();
img.onload = function(){
canvas.drawImage(this, 0, 0);
canvas.toDataURL("image/png"); // <--- security error
}
image.src = URL.createObjectURL(new Blob([svgxml], {type: "image/svg+xml;charset=utf-8" }))
Here is the quote from svgopen.org
Transferring data from SVG to Canvas has security issues, which cause
Canvas to become write-only. We argue that these issues could be
avoided with our SVG.toDataURL() proposal (section "Recommendations").
Same Origin and Canvas Origin Policy
Web pages are composed of different elements coming from different
origins. Elements coming from the same origin are considered to be
safe [Origin10].
Canvas has powerful image reading and writing capabilities. It would
be trivial to use canvas as middleman for transfering a local image to
a third-party just by loading image into Canvas element from file://
-URL and then sending the pixel data from the Canvas element to any host with JavaScript.
To prevent information leakage with Canvas, browsers are carefully
protecting the usage of Canvas when the source for image data is not
safe. All Canvas elements are created as their origin-clean attribute
set to true. When any of the actions that may potentially be used for
using Canvas element to transfer content that violates the same origin
policy, the origin-clean property is permanently set to false.
If methods that return the pixel data stored in canvas, such as
toDataURL() or getImageData(), are called on the Canvas element whose
origin-clean is false, then a DOMException 18 SECURITY_ERR is raised
[Canvas10].
But I am creating SVG on the fly in the browser.
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…