mirror of
https://github.com/puppeteer/puppeteer
synced 2024-06-14 14:02:48 +00:00
Refactor Page.screenshot() api
This patch refactors Page.screenshot api, accoring to the discussion in #5: - Page.screenshot accepts single optional options object - Page.saveScreenshot is removed - Page.screenshot assumes 'png' screenshot if no type is set and no 'path' property is given Fixes #5.
This commit is contained in:
80
lib/Page.js
80
lib/Page.js
@@ -387,20 +387,52 @@ class Page extends EventEmitter {
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {!Page.ScreenshotType} screenshotType
|
||||
* @param {?{x: number, y: number, width: number, height: number}} clipRect
|
||||
* @param {!Object=} options
|
||||
* @return {!Promise<!Buffer>}
|
||||
*/
|
||||
async screenshot(screenshotType, clipRect) {
|
||||
if (clipRect) {
|
||||
async screenshot(options) {
|
||||
var screenshotType = null;
|
||||
if (options.path) {
|
||||
var mimeType = mime.lookup(options.path);
|
||||
if (mimeType === 'image/png')
|
||||
screenshotType = 'png';
|
||||
else if (mimeType === 'image/jpeg')
|
||||
screenshotType = 'jpeg';
|
||||
else
|
||||
throw new Error('Unsupported screenshot mime type: ' + mimeType);
|
||||
}
|
||||
if (options.type) {
|
||||
if (screenshotType && options.type !== screenshotType)
|
||||
throw new Error(`Passed screenshot type '${options.type}' does not match to the type inferred from the file path: '${screenshotType}'`);
|
||||
if (options.type !== 'png' && options.type !== 'jpeg')
|
||||
throw new Error('Unknown screenshot type: ' + options.type);
|
||||
screenshotType = options.type;
|
||||
}
|
||||
if (!screenshotType)
|
||||
screenshotType = 'png';
|
||||
|
||||
if (options.quality) {
|
||||
console.assert(screenshotType === 'jpeg', 'options.quality is unsupported for the ' + screenshotType + ' screenshots');
|
||||
console.assert(typeof options.quality === 'number', 'Expected options.quality to be a number but found ' + (typeof options.quality));
|
||||
console.assert(Number.isInteger(options.quality), 'Expected options.quality to be an integer');
|
||||
console.assert(options.quality >= 0 && options.quality <= 100, 'Expected options.quality to be between 0 and 100 (inclusive), got ' + options.quality);
|
||||
}
|
||||
if (options.clip) {
|
||||
console.assert(typeof options.clip.x === 'number', 'Expected options.clip.x to be a number but found ' + (typeof options.clip.x));
|
||||
console.assert(typeof options.clip.y === 'number', 'Expected options.clip.y to be a number but found ' + (typeof options.clip.y));
|
||||
console.assert(typeof options.clip.width === 'number', 'Expected options.clip.width to be a number but found ' + (typeof options.clip.width));
|
||||
console.assert(typeof options.clip.height === 'number', 'Expected options.clip.height to be a number but found ' + (typeof options.clip.height));
|
||||
}
|
||||
|
||||
if (options.clip) {
|
||||
await Promise.all([
|
||||
this._client.send('Emulation.setVisibleSize', {
|
||||
width: Math.ceil(clipRect.width / this._screenDPI),
|
||||
height: Math.ceil(clipRect.height / this._screenDPI),
|
||||
width: Math.ceil(options.clip.width / this._screenDPI),
|
||||
height: Math.ceil(options.clip.height / this._screenDPI),
|
||||
}),
|
||||
this._client.send('Emulation.forceViewport', {
|
||||
x: clipRect.x / this._screenDPI,
|
||||
y: clipRect.y / this._screenDPI,
|
||||
x: options.clip.x / this._screenDPI,
|
||||
y: options.clip.y / this._screenDPI,
|
||||
scale: 1,
|
||||
})
|
||||
]);
|
||||
@@ -408,32 +440,18 @@ class Page extends EventEmitter {
|
||||
var result = await this._client.send('Page.captureScreenshot', {
|
||||
fromSurface: true,
|
||||
format: screenshotType,
|
||||
quality: options.quality
|
||||
});
|
||||
if (clipRect) {
|
||||
if (options.clip) {
|
||||
await Promise.all([
|
||||
this.setViewportSize(this.viewportSize()),
|
||||
this._client.send('Emulation.resetViewport')
|
||||
]);
|
||||
}
|
||||
return new Buffer(result.data, 'base64');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} filePath
|
||||
* @param {?{x: number, y: number, width: number, height: number}} clipRect
|
||||
* @return {!Promise}
|
||||
*/
|
||||
async saveScreenshot(filePath, clipRect) {
|
||||
var mimeType = mime.lookup(filePath);
|
||||
var screenshotType = null;
|
||||
if (mimeType === 'image/png')
|
||||
screenshotType = Page.ScreenshotTypes.PNG;
|
||||
else if (mimeType === 'image/jpeg')
|
||||
screenshotType = Page.ScreenshotTypes.JPG;
|
||||
if (!screenshotType)
|
||||
throw new Error(`Cannot render to file ${filePath} - unsupported mimeType ${mimeType}`);
|
||||
var buffer = await this.screenshot(screenshotType, clipRect);
|
||||
fs.writeFileSync(filePath, buffer);
|
||||
var buffer = new Buffer(result.data, 'base64');
|
||||
if (options.path)
|
||||
fs.writeFileSync(options.path, buffer);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -522,12 +540,6 @@ class InPageCallback {
|
||||
}
|
||||
}
|
||||
|
||||
/** @enum {string} */
|
||||
Page.ScreenshotTypes = {
|
||||
PNG: 'png',
|
||||
JPG: 'jpeg',
|
||||
};
|
||||
|
||||
/** @enum {string} */
|
||||
Page.PaperFormats = {
|
||||
Letter: {width: 8.5, height: 11},
|
||||
|
||||
Reference in New Issue
Block a user