Механизм, который вы использовали, должен работать;В какой ОС / браузере / версии вы видите эту ошибку?
В любом случае, несмотря на то, что это должно работать, это не самый эффективный способ, если вы создаете URL-адреса данных и затем восстанавливаете их в одном сеансе.Вместо этого я бы предложил создать новый холст not-in-DOM для хранения вашего состояния и использовать его для рисования на основном холсте:
var states = [];
function saveState(ctx){
var c = document.createElement('canvas');
c.width = ctx.canvas.width;
c.height = ctx.canvas.height;
c.getContext('2d').drawImage(ctx.canvas,0,0);
states.push(c);
return c;
}
function restoreState(ctx,idx){
var off = idx==null ? states.pop() : states[idx];
ctx.drawImage(off,0,0);
}