diff --git a/index.js b/index.js index f0ac06f..f827220 100644 --- a/index.js +++ b/index.js @@ -34,7 +34,7 @@ const path = require('path'); const defaultDuration = 5; const defaultFPS = 60; const { overwriteRandom } = require('./lib/overwrite-random'); -const { getBrowserFrames, stringArrayFind } = require('./lib/utils'); +const { getBrowserFrames, stringArrayFind, getPageViewportSize, setPageViewportSize } = require('./lib/utils'); module.exports = async function (config) { config = Object.assign({}, config || {}); @@ -150,13 +150,13 @@ module.exports = async function (config) { if (config.viewport || scaleArg) { config.viewport = Object.assign( { - width: page.viewport().width, - height: page.viewport().height, + width: getPageViewportSize(page).width, + height: getPageViewportSize(page).height, deviceScaleFactor: scaleArg ? Number(scaleArg.split('=')[1]) || 1 : 1 }, config.viewport ); - await page.setViewport(config.viewport); + await setPageViewportSize(page, config.viewport); } await overwriteRandom(page, unrandom, log); await timeHandler.overwriteTime(page); diff --git a/lib/capture-canvas.js b/lib/capture-canvas.js index aa17a06..63fc40a 100644 --- a/lib/capture-canvas.js +++ b/lib/capture-canvas.js @@ -33,9 +33,9 @@ const makeCanvasCapturer = require('./make-canvas-capturer'); const canvasToBuffer = async function (page, canvasSelector, type, quality) { - var dataUrl = await page.evaluate((canvasSelector, type, quality) => + var dataUrl = await page.evaluate(({ canvasSelector, type, quality }) => document.querySelector(canvasSelector).toDataURL(type, quality) - , canvasSelector, type, quality); + , { canvasSelector, type, quality }); var data = dataUrl.slice(dataUrl.indexOf(',') + 1); return new Buffer(data, 'base64'); }; diff --git a/lib/capture-screenshot.js b/lib/capture-screenshot.js index ea802c4..fb9a5c1 100644 --- a/lib/capture-screenshot.js +++ b/lib/capture-screenshot.js @@ -30,7 +30,7 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -const { getSelectorDimensions, makeFilePathConverter, makeFileDirectoryIfNeeded } = require('./utils.js'); +const { getSelectorDimensions, getPageViewportSize, makeFilePathConverter, makeFileDirectoryIfNeeded } = require('./utils.js'); module.exports = function (config) { var page = config.page; @@ -47,7 +47,7 @@ module.exports = function (config) { log('Warning: no element found for ' + config.selector); } } - var viewport = page.viewport(); + var viewport = getPageViewportSize(page); var x = config.xOffset || config.left || 0; var y = config.yOffset || config.top || 0; var right = config.right || 0; diff --git a/lib/immediate-canvas-handler.js b/lib/immediate-canvas-handler.js index 6927f28..9fa5573 100644 --- a/lib/immediate-canvas-handler.js +++ b/lib/immediate-canvas-handler.js @@ -52,11 +52,11 @@ module.exports = function (config) { if (config.alwaysSaveCanvasData) { goToTime = async function (browserFrames, time) { // Goes to a certain time. Can't go backwards - return page.evaluate((ms, canvasSelector, type, quality) => { - window._timeweb_processUntilTime(ms); + return page.evaluate(({ ms, canvasSelector, type, quality }) => { + window.timeweb.processUntilTime(ms); var canvasElement = document.querySelector(canvasSelector); window._timesnap_canvasData = canvasElement.toDataURL(type, quality); - }, time, canvasSelector, canvasCaptureMode, quality); + }, { ms: time, canvasSelector, type: canvasCaptureMode, quality }); }; } else { goToTime = oldGoToTime; @@ -64,14 +64,14 @@ module.exports = function (config) { const goToTimeAndAnimateForCapture = async function (browserFrames, time) { // Goes to a certain time. Can't go backwards - return page.evaluate((ms, canvasSelector, type, quality) => { - window._timeweb_processUntilTime(ms); - return window._timeweb_runFramePreparers(ms, function () { - window._timeweb_runAnimationFrames(); + return page.evaluate(({ ms, canvasSelector, type, quality }) => { + window.timeweb.processUntilTime(ms); + return window.timeweb.runFramePreparers(ms, function () { + window.timeweb.runAnimationFrames(); var canvasElement = document.querySelector(canvasSelector); window._timesnap_canvasData = canvasElement.toDataURL(type, quality); }); - }, time, canvasSelector, canvasCaptureMode, quality); + }, { ms: time, canvasSelector, type: canvasCaptureMode, quality }); }; var goToTimeAndAnimate; @@ -81,8 +81,8 @@ module.exports = function (config) { goToTimeAndAnimate = async function (browserFrames, time) { // Goes to a certain time. Can't go backwards return page.evaluate(function (ms) { - window._timeweb_processUntilTime(ms); - return window._timeweb_runFramePreparers(ms, window._timeweb_runAnimationFrames); + window.timeweb.processUntilTime(ms); + return window.timeweb.runFramePreparers(ms, window.timeweb.runAnimationFrames); }, time); }; } diff --git a/lib/overwrite-random.js b/lib/overwrite-random.js index fafc0b3..ffefc0f 100644 --- a/lib/overwrite-random.js +++ b/lib/overwrite-random.js @@ -30,6 +30,8 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +const { evaluateOnNewDocument } = require('./utils.js'); + // unrandomizer seed constants // default seed values are only used if all of the seed values end up being 0 const defaultSeed1 = 10; @@ -61,7 +63,7 @@ const overwriteRandom = function (page, unrandom, log) { }; const overwritePageRandom = function (page, seed1 = 0, seed2 = 0, seed3 = 0, seed4 = 0) { - return page.evaluateOnNewDocument(function (config) { + return evaluateOnNewDocument(page, function (config) { (function (exports) { let shift1 = 23; let shift2 = 17; diff --git a/lib/overwrite-time.js b/lib/overwrite-time.js index 69eb8cd..24cf0a8 100644 --- a/lib/overwrite-time.js +++ b/lib/overwrite-time.js @@ -31,20 +31,21 @@ */ const fs = require('fs'); const path = require('path'); +const { evaluateOnNewDocument } = require('./utils.js'); const timewebLib = fs.readFileSync( path.join(require.resolve('timeweb/dist/timeweb.js')), { encoding: 'utf8' } ); const overwriteTime = async function (page) { - return page.evaluateOnNewDocument(timewebLib); + return evaluateOnNewDocument(page, timewebLib); }; const goToTime = async function (browserFrames, time) { // Goes to a certain time. Can't go backwards return Promise.all(browserFrames.map(function (frame) { return frame.evaluate(function (ms) { - window._timeweb_processUntilTime(ms); + window.timeweb.processUntilTime(ms); }, time); })); }; @@ -53,8 +54,8 @@ const goToTimeAndAnimate = async function (browserFrames, time) { // Goes to a certain time. Can't go backwards return Promise.all(browserFrames.map(function (frame) { return frame.evaluate(function (ms) { - window._timeweb_processUntilTime(ms); - return window._timeweb_runFramePreparers(ms, window._timeweb_runAnimationFrames); + window.timeweb.processUntilTime(ms); + return window.timeweb.runFramePreparers(ms, window.timeweb.runAnimationFrames); }, time); })); }; diff --git a/lib/utils.js b/lib/utils.js index b8e2c3d..5544cfe 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -41,6 +41,38 @@ const getBrowserFrames = function (frame) { return [frame].concat(...frame.childFrames().map(getBrowserFrames)); }; +const evaluateOnNewDocument = function (page, fn, arg) { + if (page.evaluateOnNewDocument) { + if (arg !== undefined) { + page.evaluateOnNewDocument(fn, arg); + } else { + page.evaluateOnNewDocument(fn); + } + } else if (page.addInitScript) { + if (arg !== undefined) { + page.addInitScript(fn, arg); + } else { + page.addInitScript(fn); + } + } +}; + +const getPageViewportSize = function (page) { + if (page.viewport) { + return page.viewport(); + } else if (page.viewportSize) { + return page.viewportSize(); + } +}; + +const setPageViewportSize = async function (page, config) { + if (page.setViewport) { + return page.setViewport(config); + } else if (page.setViewportSize) { + return page.setViewportSize(config); + } +}; + const getSelectorDimensions = async function (page, selector) { return page.evaluate(function (selector) { var el = document.querySelector(selector); @@ -116,6 +148,9 @@ const makeFileDirectoryIfNeeded = function (filepath) { module.exports = { getBrowserFrames, + evaluateOnNewDocument, + getPageViewportSize, + setPageViewportSize, getSelectorDimensions, writeFile, stringArrayFind, diff --git a/package-lock.json b/package-lock.json index f8cc09a..91f9e4f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "timesnap-core", - "version": "0.3.1-prerelease", + "version": "0.3.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1025,9 +1025,9 @@ "dev": true }, "timeweb": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/timeweb/-/timeweb-0.1.1.tgz", - "integrity": "sha512-GP4lwJNKeEvAP30MatdV2Rigi8eASIgzI3rBGyvObU1rg3K3AgfeJSNi5qbrTEUdQYRfknACjb7OYZm16fdkTQ==" + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/timeweb/-/timeweb-0.2.0.tgz", + "integrity": "sha512-VKm6YWgQ0kKQVVsVVMZW3Fhx2ZraWk3QY9CLbPFdKkX5UpItt4KMcmZoZVzj8UVBph+3khLr0XMjlLFhB4c7FA==" }, "tmp": { "version": "0.0.33", diff --git a/package.json b/package.json index c64a5ea..e7fa31b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "timesnap-core", - "version": "0.3.1-prerelease", + "version": "0.3.1", "description": "Take screenshots of web pages at smooth intervals", "repository": { "type": "git", @@ -18,7 +18,7 @@ }, "license": "BSD-3-Clause", "dependencies": { - "timeweb": "^0.1.1", + "timeweb": "^0.2.0", "sprintf-js": "1.1.1" }, "devDependencies": {