mirror of
https://github.com/niklasvh/html2canvas.git
synced 2023-08-10 21:13:10 +03:00
fix: image blob rendering
This commit is contained in:
parent
acb4cd24b8
commit
1acdc827a4
@ -108,10 +108,18 @@ export class Cache {
|
|||||||
const useProxy =
|
const useProxy =
|
||||||
!isInlineImage(key) &&
|
!isInlineImage(key) &&
|
||||||
!isSameOrigin &&
|
!isSameOrigin &&
|
||||||
|
!isBlobImage(key) &&
|
||||||
typeof this._options.proxy === 'string' &&
|
typeof this._options.proxy === 'string' &&
|
||||||
FEATURES.SUPPORT_CORS_XHR &&
|
FEATURES.SUPPORT_CORS_XHR &&
|
||||||
!useCORS;
|
!useCORS;
|
||||||
if (!isSameOrigin && this._options.allowTaint === false && !isInlineImage(key) && !useProxy && !useCORS) {
|
if (
|
||||||
|
!isSameOrigin &&
|
||||||
|
this._options.allowTaint === false &&
|
||||||
|
!isInlineImage(key) &&
|
||||||
|
!isBlobImage(key) &&
|
||||||
|
!useProxy &&
|
||||||
|
!useCORS
|
||||||
|
) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -124,11 +124,7 @@ export class DocumentCloner {
|
|||||||
if (isCanvasElement(node)) {
|
if (isCanvasElement(node)) {
|
||||||
return this.createCanvasClone(node);
|
return this.createCanvasClone(node);
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
if (isIFrameElement(node)) {
|
|
||||||
return this.createIFrameClone(node);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
if (isStyleElement(node)) {
|
if (isStyleElement(node)) {
|
||||||
return this.createStyleClone(node);
|
return this.createStyleClone(node);
|
||||||
}
|
}
|
||||||
@ -195,67 +191,7 @@ export class DocumentCloner {
|
|||||||
|
|
||||||
return clonedCanvas;
|
return clonedCanvas;
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
createIFrameClone(iframe: HTMLIFrameElement) {
|
|
||||||
const tempIframe = <HTMLIFrameElement>iframe.cloneNode(false);
|
|
||||||
const iframeKey = generateIframeKey();
|
|
||||||
tempIframe.setAttribute('data-html2canvas-internal-iframe-key', iframeKey);
|
|
||||||
|
|
||||||
const {width, height} = parseBounds(iframe);
|
|
||||||
|
|
||||||
this.resourceLoader.cache[iframeKey] = getIframeDocumentElement(iframe, this.options)
|
|
||||||
.then(documentElement => {
|
|
||||||
return this.renderer(
|
|
||||||
documentElement,
|
|
||||||
{
|
|
||||||
allowTaint: this.options.allowTaint,
|
|
||||||
backgroundColor: '#ffffff',
|
|
||||||
canvas: null,
|
|
||||||
imageTimeout: this.options.imageTimeout,
|
|
||||||
logging: this.options.logging,
|
|
||||||
proxy: this.options.proxy,
|
|
||||||
removeContainer: this.options.removeContainer,
|
|
||||||
scale: this.options.scale,
|
|
||||||
foreignObjectRendering: this.options.foreignObjectRendering,
|
|
||||||
useCORS: this.options.useCORS,
|
|
||||||
target: new CanvasRenderer(),
|
|
||||||
width,
|
|
||||||
height,
|
|
||||||
x: 0,
|
|
||||||
y: 0,
|
|
||||||
windowWidth: documentElement.ownerDocument.defaultView.innerWidth,
|
|
||||||
windowHeight: documentElement.ownerDocument.defaultView.innerHeight,
|
|
||||||
scrollX: documentElement.ownerDocument.defaultView.pageXOffset,
|
|
||||||
scrollY: documentElement.ownerDocument.defaultView.pageYOffset
|
|
||||||
},
|
|
||||||
);
|
|
||||||
})
|
|
||||||
.then(
|
|
||||||
(canvas: HTMLCanvasElement) =>
|
|
||||||
new Promise((resolve, reject) => {
|
|
||||||
const iframeCanvas = document.createElement('img');
|
|
||||||
iframeCanvas.onload = () => resolve(canvas);
|
|
||||||
iframeCanvas.onerror = (event) => {
|
|
||||||
// Empty iframes may result in empty "data:," URLs, which are invalid from the <img>'s point of view
|
|
||||||
// and instead of `onload` cause `onerror` and unhandled rejection warnings
|
|
||||||
// https://github.com/niklasvh/html2canvas/issues/1502
|
|
||||||
iframeCanvas.src == 'data:,' ? resolve(canvas) : reject(event);
|
|
||||||
};
|
|
||||||
iframeCanvas.src = canvas.toDataURL();
|
|
||||||
if (tempIframe.parentNode && iframe.ownerDocument && iframe.ownerDocument.defaultView) {
|
|
||||||
tempIframe.parentNode.replaceChild(
|
|
||||||
copyCSSStyles(
|
|
||||||
iframe.ownerDocument.defaultView.getComputedStyle(iframe),
|
|
||||||
iframeCanvas
|
|
||||||
),
|
|
||||||
tempIframe
|
|
||||||
);
|
|
||||||
}
|
|
||||||
})
|
|
||||||
);
|
|
||||||
return tempIframe;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
cloneNode(node: Node): Node {
|
cloneNode(node: Node): Node {
|
||||||
if (isTextNode(node)) {
|
if (isTextNode(node)) {
|
||||||
return document.createTextNode(node.data);
|
return document.createTextNode(node.data);
|
||||||
@ -312,8 +248,6 @@ export class DocumentCloner {
|
|||||||
copyCSSStyles(style, clone);
|
copyCSSStyles(style, clone);
|
||||||
}
|
}
|
||||||
|
|
||||||
//this.inlineAllImages(clone);
|
|
||||||
|
|
||||||
if (node.scrollTop !== 0 || node.scrollLeft !== 0) {
|
if (node.scrollTop !== 0 || node.scrollLeft !== 0) {
|
||||||
this.scrolledElements.push([clone, node.scrollLeft, node.scrollTop]);
|
this.scrolledElements.push([clone, node.scrollLeft, node.scrollTop]);
|
||||||
}
|
}
|
||||||
|
@ -32,7 +32,7 @@ if (typeof window !== 'undefined') {
|
|||||||
let instanceCount = 1;
|
let instanceCount = 1;
|
||||||
|
|
||||||
const renderElement = async (element: HTMLElement, opts: Partial<Options>): Promise<HTMLCanvasElement> => {
|
const renderElement = async (element: HTMLElement, opts: Partial<Options>): Promise<HTMLCanvasElement> => {
|
||||||
if (typeof element !== 'object') {
|
if (!element || typeof element !== 'object') {
|
||||||
return Promise.reject('Invalid element provided as first argument');
|
return Promise.reject('Invalid element provided as first argument');
|
||||||
}
|
}
|
||||||
const ownerDocument = element.ownerDocument;
|
const ownerDocument = element.ownerDocument;
|
||||||
|
@ -24,5 +24,19 @@
|
|||||||
|
|
||||||
<img src="../../assets/image.jpg" style="width:0px;height:0px;border:1px solid black" />
|
<img src="../../assets/image.jpg" style="width:0px;height:0px;border:1px solid black" />
|
||||||
<img src="../../assets/image.jpg" style="width:0px;height:0px;" />
|
<img src="../../assets/image.jpg" style="width:0px;height:0px;" />
|
||||||
|
<script>
|
||||||
|
const base64 = "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";
|
||||||
|
const bytes = atob(base64);
|
||||||
|
const uInt8Array = new Uint8Array(bytes.length);
|
||||||
|
|
||||||
|
for (let i = 0; i < bytes.length; ++i) {
|
||||||
|
uInt8Array[i] = bytes.charCodeAt(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
const blob = new Blob([uInt8Array], { type: "image/jpeg" });
|
||||||
|
const img = document.createElement("img");
|
||||||
|
img.src = URL.createObjectURL(blob);
|
||||||
|
document.body.appendChild(img);
|
||||||
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
Loading…
Reference in New Issue
Block a user