From 9e1dc6ac0e7224948049b22e376ff0c7b5c9ff5b Mon Sep 17 00:00:00 2001 From: MoyuScript <i@moyu.moe> Date: Tue, 1 Aug 2017 23:41:12 +0800 Subject: [PATCH] Use correct canvas size for full document render --- src/Bounds.js | 22 ++++++++++++++++++++++ src/index.js | 14 ++++++++------ 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/Bounds.js b/src/Bounds.js index aaba24c..1388fdc 100644 --- a/src/Bounds.js +++ b/src/Bounds.js @@ -78,6 +78,28 @@ export const calculateContentBox = ( ); }; +export const parseDocumentSize = (document: Document): Bounds => { + const body = document.body; + const documentElement = document.documentElement; + + if (!body || !documentElement) { + throw new Error(__DEV__ ? `Unable to get document size` : ''); + } + const width = Math.max( + Math.max(body.scrollWidth, documentElement.scrollWidth), + Math.max(body.offsetWidth, documentElement.offsetWidth), + Math.max(body.clientWidth, documentElement.clientWidth) + ); + + const height = Math.max( + Math.max(body.scrollHeight, documentElement.scrollHeight), + Math.max(body.offsetHeight, documentElement.offsetHeight), + Math.max(body.clientHeight, documentElement.clientHeight) + ); + + return new Bounds(0, 0, width, height); +}; + export const parsePathForBorder = (curves: BoundCurves, borderSide: BorderSide): Path => { switch (borderSide) { case TOP: diff --git a/src/index.js b/src/index.js index 1104a62..d423cbb 100644 --- a/src/index.js +++ b/src/index.js @@ -5,7 +5,7 @@ import {NodeParser} from './NodeParser'; import CanvasRenderer from './CanvasRenderer'; import Logger from './Logger'; import ImageLoader from './ImageLoader'; -import {Bounds} from './Bounds'; +import {Bounds, parseDocumentSize} from './Bounds'; import {cloneWindow} from './Clone'; import Color from './Color'; @@ -62,8 +62,10 @@ const html2canvas = (element: HTMLElement, config: Options): Promise<HTMLCanvasE } const imageLoader = new ImageLoader(options, logger); const stack = NodeParser(clonedElement, imageLoader, logger); - const width = window.innerWidth; - const height = window.innerHeight; + const size = + options.type === 'view' ? windowBounds : parseDocumentSize(clonedElement.ownerDocument); + const width = size.width; + const height = size.height; canvas.width = Math.floor(width * options.scale); canvas.height = Math.floor(height * options.scale); canvas.style.width = `${width}px`; @@ -71,10 +73,10 @@ const html2canvas = (element: HTMLElement, config: Options): Promise<HTMLCanvasE // http://www.w3.org/TR/css3-background/#special-backgrounds const backgroundColor = - clonedElement === ownerDocument.documentElement + clonedElement === clonedElement.ownerDocument.documentElement ? stack.container.style.background.backgroundColor.isTransparent() - ? ownerDocument.body - ? new Color(getComputedStyle(ownerDocument.body).backgroundColor) + ? clonedElement.ownerDocument.body + ? new Color(getComputedStyle(clonedElement.ownerDocument.body).backgroundColor) : null : stack.container.style.background.backgroundColor : null;