Innovenergy_trunk/frontend/node_modules/testcafe/lib/screenshots/utils.js

37 lines
6.7 KiB
JavaScript
Raw Normal View History

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.copyImagePart = exports.generateScreenshotMark = void 0;
const pngjs_1 = require("pngjs");
const lodash_1 = require("lodash");
const nanoid_1 = require("nanoid");
const constants_1 = require("./constants");
const ALPHABET = '01';
function generateScreenshotMark() {
// NOTE: 32-bit id
const id = (0, nanoid_1.customAlphabet)(ALPHABET, constants_1.MARK_LENGTH)();
// NOTE: array of RGB values
const markSeed = (0, lodash_1.flatten)((0, lodash_1.map)(id, bit => bit === '0' ? [0, 0, 0, 255] : [255, 255, 255, 255]));
// NOTE: macOS browsers can't display an element, if it's CSS height is lesser than 1.
// It happens on Retina displays, because they have more than 1 physical pixel in a CSS pixel.
// So increase mark size by prepending transparent pixels before the actual mark.
const imageData = (0, lodash_1.times)(constants_1.MARK_BYTES_PER_PIXEL * constants_1.MARK_LENGTH * (constants_1.MARK_HEIGHT - 1), (0, lodash_1.constant)(0)).concat(markSeed);
const imageDataBuffer = Buffer.from(imageData);
const pngImage = new pngjs_1.PNG({ width: constants_1.MARK_LENGTH, height: constants_1.MARK_HEIGHT });
imageDataBuffer.copy(pngImage.data);
const markData = 'data:image/png;base64,' + pngjs_1.PNG.sync.write(pngImage).toString('base64');
return { markSeed, markData };
}
exports.generateScreenshotMark = generateScreenshotMark;
function copyImagePart(pngImage, { clipLeft, clipTop, clipRight, clipBottom }) {
const width = clipRight - clipLeft;
const height = clipBottom - clipTop;
const dstImage = new pngjs_1.PNG({ width, height });
const stride = dstImage.width * constants_1.MARK_BYTES_PER_PIXEL;
for (let i = 0; i < height; i++) {
const srcStartIndex = (pngImage.width * (i + clipTop) + clipLeft) * constants_1.MARK_BYTES_PER_PIXEL;
pngImage.data.copy(dstImage.data, stride * i, srcStartIndex, srcStartIndex + stride);
}
return dstImage;
}
exports.copyImagePart = copyImagePart;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyZWVuc2hvdHMvdXRpbHMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaUNBQTRCO0FBQzVCLG1DQUtnQjtBQUVoQixtQ0FBd0M7QUFDeEMsMkNBSXFCO0FBRXJCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQztBQUV0QixTQUFnQixzQkFBc0I7SUFDbEMsa0JBQWtCO0lBQ2xCLE1BQU0sRUFBRSxHQUFHLElBQUEsdUJBQWMsRUFBQyxRQUFRLEVBQUUsdUJBQVcsQ0FBQyxFQUFFLENBQUM7SUFFbkQsNEJBQTRCO0lBQzVCLE1BQU0sUUFBUSxHQUFHLElBQUEsZ0JBQU8sRUFBQyxJQUFBLFlBQUcsRUFBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUU5RixzRkFBc0Y7SUFDdEYsOEZBQThGO0lBQzlGLGlGQUFpRjtJQUNqRixNQUFNLFNBQVMsR0FBUyxJQUFBLGNBQUssRUFBQyxnQ0FBb0IsR0FBRyx1QkFBVyxHQUFHLENBQUMsdUJBQVcsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFBLGlCQUFRLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEgsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMvQyxNQUFNLFFBQVEsR0FBVSxJQUFJLFdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSx1QkFBVyxFQUFFLE1BQU0sRUFBRSx1QkFBVyxFQUFFLENBQUMsQ0FBQztJQUU3RSxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVwQyxNQUFNLFFBQVEsR0FBRyx3QkFBd0IsR0FBRyxXQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFeEYsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQztBQUNsQyxDQUFDO0FBbkJELHdEQW1CQztBQUVELFNBQWdCLGFBQWEsQ0FBRSxRQUFRLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUU7SUFDakYsTUFBTSxLQUFLLEdBQUksU0FBUyxHQUFHLFFBQVEsQ0FBQztJQUNwQyxNQUFNLE1BQU0sR0FBRyxVQUFVLEdBQUcsT0FBTyxDQUFDO0lBRXBDLE1BQU0sUUFBUSxHQUFHLElBQUksV0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFFNUMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLEtBQUssR0FBRyxnQ0FBb0IsQ0FBQztJQUVyRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzdCLE1BQU0sYUFBYSxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxnQ0FBb0IsQ0FBQztRQUV6RixRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsYUFBYSxFQUFFLGFBQWEsR0FBRyxNQUFNLENBQUMsQ0FBQztLQUN4RjtJQUVELE9BQU8sUUFBUSxDQUFDO0FBQ3BCLENBQUM7QUFmRCxzQ0FlQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBORyB9IGZyb20gJ3BuZ2pzJztcbmltcG9ydCB7XG4gICAgbWFwLFxuICAgIGZsYXR0ZW4sXG4gICAgdGltZXMsXG4gICAgY29uc3RhbnQsXG59IGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCB7IGN1c3RvbUFscGhhYmV0IH0gZnJvbSAnbmFub2lkJztcbmltcG9ydCB7XG4gICAgTUFSS19MRU5HVEgsXG4gICAgTUFSS19IRUlHSFQsXG4gICAgTUFSS19CWVRFU19QRVJfUElYRUwsXG59IGZyb20gJy4vY29uc3RhbnRzJztcblxuY29uc3QgQUxQSEFCRVQgPSAnMDEnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVTY3JlZW5zaG90TWFyayAoKSB7XG4gICAgLy8gTk9URTogMzItYml0IGlkXG4gICAgY29uc3QgaWQgPSBjdXN0b21BbHBoYWJldChBTFBIQUJFVCwgTUFSS19MRU5HVEgpKCk7XG5cbiAgICAvLyBOT1RFOiBhcnJheSBvZiBSR0IgdmFsdWVzXG4gICAgY29uc3QgbWFya1NlZWQgPSBmbGF0dGVuKG1hcChpZCwgYml0ID0+IGJpdCA9PT0gJzAnID8gWzAsIDAsIDAsIDI1NV0gOiBbMjU1LCAyNTUsIDI1NSwgMjU1XSkpO1xuXG4gICAgLy8gTk9URTogbWFjT1MgYnJvd3NlcnMgY2FuJ3QgZGlzcGxheSBhbiBlbGVtZW50LCBpZiBpdCdzIENTUyBoZWlnaHQgaXMgbGVzc2VyIHRoYW4gMS5cbiAgICAvLyBJdCBoYXBwZW5zIG9uIFJldGluYSBkaXNwbGF5cywgYmVjYXVzZSB0aGV5IGhhdmUgbW9yZSB0aGFuIDEgcGh5c2ljYWwgcGl4ZWwgaW4gYSBDU1MgcGl4ZWwuXG4gICAgLy8gU28gaW5jcmVhc2UgbWFyayBzaXplIGJ5IHByZXBlbmRpbmcgdHJhbnNwYXJlbnQgcGl4ZWxzIGJlZm9yZSB0aGUgYWN0dWFsIG1hcmsuXG4gICAgY29uc3QgaW1hZ2VEYXRhICAgICAgID0gdGltZXMoTUFSS19CWVRFU19QRVJfUElYRUwgKiBNQVJLX0xFTkdUSCAqIChNQVJLX0hFSUdIVCAtIDEpLCBjb25zdGFudCgwKSkuY29uY2F0KG1hcmtTZWVkKTtcbiAgICBjb25zdCBpbWFnZURhdGFCdWZmZXIgPSBCdWZmZXIuZnJvbShpbWFnZURhdGEpO1xuICAgIGNvbnN0IHBuZ0ltYWdlICAgICAgICA9IG5ldyBQTkcoeyB3aWR0aDogTUFSS19MRU5HVEgsIGhlaWdodDogTUFSS19IRUlHSFQgfSk7XG5cbiAgICBpbWFnZURhdGFCdWZmZXIuY29weShwbmdJbWFnZS5kYXRhKTtcblxuICAgIGNvbnN0IG1hcmtEYXRhID0gJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwnICsgUE5HLnN5bmMud3JpdGUocG5nSW1hZ2UpLnRvU3RyaW5nKCdiYXNlNjQnKTtcblxuICAgIHJldHVybiB7IG1hcmtTZWVkLCBtYXJrRGF0YSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29weUltYWdlUGFydCAocG5nS