html2canvas/src/index.js

90 lines
2.4 KiB
JavaScript
Raw Normal View History

2017-07-29 05:07:42 +03:00
/* @flow */
'use strict';
2017-08-06 19:26:09 +03:00
import type {RenderTarget} from './Renderer';
import CanvasRenderer from './renderer/CanvasRenderer';
2017-07-29 05:07:42 +03:00
import Logger from './Logger';
2017-09-11 17:36:23 +03:00
import {renderElement} from './Window';
import {parseBounds, parseDocumentSize} from './Bounds';
2017-07-29 05:07:42 +03:00
export type Options = {
2017-08-01 17:36:51 +03:00
async: ?boolean,
allowTaint: ?boolean,
2017-08-28 16:27:39 +03:00
backgroundColor: string,
2017-08-01 17:36:51 +03:00
canvas: ?HTMLCanvasElement,
2017-09-28 14:46:00 +03:00
foreignObjectRendering: boolean,
imageTimeout: number,
2017-08-01 17:36:51 +03:00
proxy: ?string,
removeContainer: ?boolean,
scale: number,
target: RenderTarget<*>,
width: number,
height: number,
x: number,
y: number,
scrollX: number,
scrollY: number,
windowWidth: number,
windowHeight: number
2017-07-29 05:07:42 +03:00
};
const html2canvas = (element: HTMLElement, conf: ?Options): Promise<*> => {
2017-09-25 18:01:59 +03:00
// eslint-disable-next-line no-console
2017-08-06 13:13:40 +03:00
if (typeof console === 'object' && typeof console.log === 'function') {
2017-09-25 18:01:59 +03:00
// eslint-disable-next-line no-console
2017-08-06 13:13:40 +03:00
console.log(`html2canvas ${__VERSION__}`);
}
const config = conf || {};
2017-07-29 05:07:42 +03:00
const logger = new Logger();
2017-08-01 15:54:18 +03:00
const ownerDocument = element.ownerDocument;
2017-12-03 12:07:10 +03:00
if (!ownerDocument) {
return Promise.reject(`Provided element is not within a Document`)
}
2017-08-01 15:54:18 +03:00
const defaultView = ownerDocument.defaultView;
const scrollX = defaultView.pageXOffset;
const scrollY = defaultView.pageYOffset;
const isDocument = element.tagName === 'HTML' || element.tagName === 'BODY';
const {width, height, left, top} = isDocument
? parseDocumentSize(ownerDocument)
: parseBounds(element, scrollX, scrollY);
2017-08-01 17:36:51 +03:00
const defaultOptions = {
async: true,
allowTaint: false,
2017-08-17 18:14:44 +03:00
imageTimeout: 15000,
2017-08-01 17:36:51 +03:00
proxy: null,
removeContainer: true,
2017-09-28 14:46:00 +03:00
foreignObjectRendering: true,
scale: defaultView.devicePixelRatio || 1,
2017-08-06 19:26:09 +03:00
target: new CanvasRenderer(config.canvas),
x: left,
y: top,
width: Math.ceil(width),
height: Math.ceil(height),
windowWidth: defaultView.innerWidth,
2017-08-08 19:50:31 +03:00
windowHeight: defaultView.innerHeight,
scrollX: defaultView.pageXOffset,
scrollY: defaultView.pageYOffset
2017-08-01 17:36:51 +03:00
};
2017-09-11 17:36:23 +03:00
const result = renderElement(element, {...defaultOptions, ...config}, logger);
2017-08-03 19:13:20 +03:00
if (__DEV__) {
return result.catch(e => {
logger.error(e);
throw e;
});
}
return result;
2017-07-29 05:07:42 +03:00
};
2017-08-06 19:26:09 +03:00
html2canvas.CanvasRenderer = CanvasRenderer;
2017-07-29 05:07:42 +03:00
module.exports = html2canvas;