function Proxy(src, proxyUrl, document) { var callback = createCallback(supportsCORS); var url = createProxyUrl(proxyUrl, src, callback); return supportsCORS ? XHR(url) : (jsonp(document, url, callback).then(function(response) { return decode64(response.content); })); } var proxyCount = 0; var supportsCORS = ('withCredentials' in new XMLHttpRequest()); var supportsCORSImage = ('crossOrigin' in new Image()); function ProxyURL(src, proxyUrl, document) { var callback = createCallback(supportsCORSImage); var url = createProxyUrl(proxyUrl, src, callback); return (supportsCORSImage ? Promise.resolve(url) : jsonp(document, url, callback).then(function(response) { return "data:" + response.type + ";base64," + response.content; })); } function jsonp(document, url, callback) { return new Promise(function(resolve, reject) { var s = document.createElement("script"); var cleanup = function() { delete window.html2canvas.proxy[callback]; document.body.removeChild(s); }; window.html2canvas.proxy[callback] = function(response) { cleanup(); resolve(response); }; s.src = url; s.onerror = function(e) { cleanup(); reject(e); }; document.body.appendChild(s); }); } function createCallback(useCORS) { return !useCORS ? "html2canvas_" + Date.now() + "_" + (++proxyCount) + "_" + Math.round(Math.random() * 100000) : ""; } function createProxyUrl(proxyUrl, src, callback) { return proxyUrl + "?url=" + encodeURIComponent(src) + (callback.length ? "&callback=html2canvas.proxy." + callback : ""); }