Phantomjs lance l'exception DOM 18 sur canvas.toDataURL en utilisant des images src

J'essaie de convertir svg en images png en utilisant phantomjs :

var page = require('webpage').create(); page.evaluate(function() { var svg = '<svg class="tnt_tracks_svg" width="800" height="180" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/\ xlink"><rect width="10" height="10" fill="red"></rect></svg>'; var src = 'data:image/svg+xml;base64,' + window.btoa(unescape(encodeURIComponent(svg))); var img = new Image(); img.src = src; img.onload = function() { var canvas = document.createElement('canvas'); canvas.width = img.width; canvas.height = img.height; var context = canvas.getContext('2d'); context.drawImage(img, 0, 0); var src = canvas.toDataURL(); // DOM Exception 18! } }); 

Mais je reçois une exception DOM 18 en appelant à DataURL. J'ai vu dans d'autres questions similaires que cela pourrait se produire si le svg est hébergé dans d'autres domaines, etc. … mais dans mon cas, je fournis le svg src !. Qu'est-ce qui ne va pas avec le code ci-dessus? Pourquoi déclenche-t-il l'exception DOM?

Un code similaire semble bon dans jsfiddle (sans phantomjs, testé en chrome et FF). Et cet exemple fantôme fonctionne également en utilisant fabric.js :

 page.includeJs("http://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.4.0/fabric.min.js", function () { page.evaluate(function() { var svg_text = '<svg width="600" height="400"><g><rect width="10" height="10" fill="red"></rect></g></svg>'; fabric.loadSVGFromString(svg_text, function (objects, options) { var loadedObject = fabric.util.groupSVGElements(objects, options); var canvas = new fabric.Canvas('canvas'); canvas.add(loadedObject); canvas.calcOffset(); canvas.renderAll(); console.log (canvas.toDataURL('png')); }); }); }); 

J'essaie de trouver le code pertinent dans fabric.js, mais toute aide serait très appréciée.

Ok, répond à ma question après quelques recherches …

Il semble que webkit configure toujours l'indicateur origin-clean sur false chaque fois qu'une chaîne data-uri est définie comme un attribut source d'une image HTML, qui est ensuite rendu sur l'élément Canvas. Firefox et Chrome (par exemple), permettent cela pour certains cas, mais pas sur le Web.

Fabric.js ne souffre pas de ce problème car il rend les formes en toile mais n'utilise pas les données uri pour cela, donc la toile n'est pas contaminée.

Une autre solution consiste à utiliser canvg et SVG.toDataURL .

Références ici:

Problème expliqué: http://svgopen.org/2010/papers/62-From_SVG_to_Canvas_and_Back/#security_issues

Les problèmes Webkit: plusieurs, voir par exemple ceci et ceci