Img.onerror called randomly - SVG string as source












0















I have a routine that takes a canvas context and an SVG string and renders it onto the canvas, that returns a promise that resolves once done.



For whatever reason, it fails in Firefox & Safari(haven't tried in IE), but seems to be the only solution I can get to work all the time in Chrome. I've tried a couple different alternatives:




  • convert it to a blob first, run that blob through createObjectURL, set img src to that, draw image on canvas. This works most of the time over HTTP, but over HTTPS it fails the majority of time, but not all the time.

  • Convert it to a blob, use file reader to read it as a base64 SVG representation, set img src to the base64, draw image on canvas.


code:



export default (ctx, rawSVG, { width, height }) =>
new Promise((resolve, reject) => {
const img = new Image(width, height);
img.onload = () => {
ctx.drawImage(img, 0, 0);
resolve(img);
};

img.onerror = err => reject(err);

img.src = `data:image/svg+xml;utf8,${encodeURIComponent(rawSVG)}`;
});









share|improve this question

























  • Things to check: 1. Depending on the details of your SVG, it might not have an intrinsic size. Try to set explicit width and height parameters on the Image() constructor. 2. Try to url-escape the SVG string; an unescaped # will lead to an invalid url.

    – ccprog
    Nov 19 '18 at 17:05











  • Thanks for the suggestions @ccprog, I've made those changes(and updated code example) and Firefox no longer goes into the "onerror" routine, however it doesn't seem to draw the SVG either. Chrome still works.

    – Dave
    Nov 19 '18 at 19:18













  • It would probably helpfull to see the source of the SVG (at least the prolog/<svg> tag)

    – ccprog
    Nov 19 '18 at 19:26
















0















I have a routine that takes a canvas context and an SVG string and renders it onto the canvas, that returns a promise that resolves once done.



For whatever reason, it fails in Firefox & Safari(haven't tried in IE), but seems to be the only solution I can get to work all the time in Chrome. I've tried a couple different alternatives:




  • convert it to a blob first, run that blob through createObjectURL, set img src to that, draw image on canvas. This works most of the time over HTTP, but over HTTPS it fails the majority of time, but not all the time.

  • Convert it to a blob, use file reader to read it as a base64 SVG representation, set img src to the base64, draw image on canvas.


code:



export default (ctx, rawSVG, { width, height }) =>
new Promise((resolve, reject) => {
const img = new Image(width, height);
img.onload = () => {
ctx.drawImage(img, 0, 0);
resolve(img);
};

img.onerror = err => reject(err);

img.src = `data:image/svg+xml;utf8,${encodeURIComponent(rawSVG)}`;
});









share|improve this question

























  • Things to check: 1. Depending on the details of your SVG, it might not have an intrinsic size. Try to set explicit width and height parameters on the Image() constructor. 2. Try to url-escape the SVG string; an unescaped # will lead to an invalid url.

    – ccprog
    Nov 19 '18 at 17:05











  • Thanks for the suggestions @ccprog, I've made those changes(and updated code example) and Firefox no longer goes into the "onerror" routine, however it doesn't seem to draw the SVG either. Chrome still works.

    – Dave
    Nov 19 '18 at 19:18













  • It would probably helpfull to see the source of the SVG (at least the prolog/<svg> tag)

    – ccprog
    Nov 19 '18 at 19:26














0












0








0








I have a routine that takes a canvas context and an SVG string and renders it onto the canvas, that returns a promise that resolves once done.



For whatever reason, it fails in Firefox & Safari(haven't tried in IE), but seems to be the only solution I can get to work all the time in Chrome. I've tried a couple different alternatives:




  • convert it to a blob first, run that blob through createObjectURL, set img src to that, draw image on canvas. This works most of the time over HTTP, but over HTTPS it fails the majority of time, but not all the time.

  • Convert it to a blob, use file reader to read it as a base64 SVG representation, set img src to the base64, draw image on canvas.


code:



export default (ctx, rawSVG, { width, height }) =>
new Promise((resolve, reject) => {
const img = new Image(width, height);
img.onload = () => {
ctx.drawImage(img, 0, 0);
resolve(img);
};

img.onerror = err => reject(err);

img.src = `data:image/svg+xml;utf8,${encodeURIComponent(rawSVG)}`;
});









share|improve this question
















I have a routine that takes a canvas context and an SVG string and renders it onto the canvas, that returns a promise that resolves once done.



For whatever reason, it fails in Firefox & Safari(haven't tried in IE), but seems to be the only solution I can get to work all the time in Chrome. I've tried a couple different alternatives:




  • convert it to a blob first, run that blob through createObjectURL, set img src to that, draw image on canvas. This works most of the time over HTTP, but over HTTPS it fails the majority of time, but not all the time.

  • Convert it to a blob, use file reader to read it as a base64 SVG representation, set img src to the base64, draw image on canvas.


code:



export default (ctx, rawSVG, { width, height }) =>
new Promise((resolve, reject) => {
const img = new Image(width, height);
img.onload = () => {
ctx.drawImage(img, 0, 0);
resolve(img);
};

img.onerror = err => reject(err);

img.src = `data:image/svg+xml;utf8,${encodeURIComponent(rawSVG)}`;
});






javascript image svg base64






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 19 '18 at 19:17







Dave

















asked Nov 19 '18 at 15:43









DaveDave

1,41921426




1,41921426













  • Things to check: 1. Depending on the details of your SVG, it might not have an intrinsic size. Try to set explicit width and height parameters on the Image() constructor. 2. Try to url-escape the SVG string; an unescaped # will lead to an invalid url.

    – ccprog
    Nov 19 '18 at 17:05











  • Thanks for the suggestions @ccprog, I've made those changes(and updated code example) and Firefox no longer goes into the "onerror" routine, however it doesn't seem to draw the SVG either. Chrome still works.

    – Dave
    Nov 19 '18 at 19:18













  • It would probably helpfull to see the source of the SVG (at least the prolog/<svg> tag)

    – ccprog
    Nov 19 '18 at 19:26



















  • Things to check: 1. Depending on the details of your SVG, it might not have an intrinsic size. Try to set explicit width and height parameters on the Image() constructor. 2. Try to url-escape the SVG string; an unescaped # will lead to an invalid url.

    – ccprog
    Nov 19 '18 at 17:05











  • Thanks for the suggestions @ccprog, I've made those changes(and updated code example) and Firefox no longer goes into the "onerror" routine, however it doesn't seem to draw the SVG either. Chrome still works.

    – Dave
    Nov 19 '18 at 19:18













  • It would probably helpfull to see the source of the SVG (at least the prolog/<svg> tag)

    – ccprog
    Nov 19 '18 at 19:26

















Things to check: 1. Depending on the details of your SVG, it might not have an intrinsic size. Try to set explicit width and height parameters on the Image() constructor. 2. Try to url-escape the SVG string; an unescaped # will lead to an invalid url.

– ccprog
Nov 19 '18 at 17:05





Things to check: 1. Depending on the details of your SVG, it might not have an intrinsic size. Try to set explicit width and height parameters on the Image() constructor. 2. Try to url-escape the SVG string; an unescaped # will lead to an invalid url.

– ccprog
Nov 19 '18 at 17:05













Thanks for the suggestions @ccprog, I've made those changes(and updated code example) and Firefox no longer goes into the "onerror" routine, however it doesn't seem to draw the SVG either. Chrome still works.

– Dave
Nov 19 '18 at 19:18







Thanks for the suggestions @ccprog, I've made those changes(and updated code example) and Firefox no longer goes into the "onerror" routine, however it doesn't seem to draw the SVG either. Chrome still works.

– Dave
Nov 19 '18 at 19:18















It would probably helpfull to see the source of the SVG (at least the prolog/<svg> tag)

– ccprog
Nov 19 '18 at 19:26





It would probably helpfull to see the source of the SVG (at least the prolog/<svg> tag)

– ccprog
Nov 19 '18 at 19:26












0






active

oldest

votes











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53378130%2fimg-onerror-called-randomly-svg-string-as-source%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























0






active

oldest

votes








0






active

oldest

votes









active

oldest

votes






active

oldest

votes
















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53378130%2fimg-onerror-called-randomly-svg-string-as-source%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

mysqli_query(): Empty query in /home/lucindabrummitt/public_html/blog/wp-includes/wp-db.php on line 1924

How to change which sound is reproduced for terminal bell?

Can I use Tabulator js library in my java Spring + Thymeleaf project?