fix: validate printToPDF
margins
against pageSize
(#41157)
fix: validate margins against pageSize
This commit is contained in:
parent
85bebfb180
commit
6df3443617
2 changed files with 25 additions and 1 deletions
|
@ -220,6 +220,16 @@ function parsePageSize (pageSize: string | ElectronInternal.PageSize) {
|
||||||
let pendingPromise: Promise<any> | undefined;
|
let pendingPromise: Promise<any> | undefined;
|
||||||
WebContents.prototype.printToPDF = async function (options) {
|
WebContents.prototype.printToPDF = async function (options) {
|
||||||
const margins = checkType(options.margins ?? {}, 'object', 'margins');
|
const margins = checkType(options.margins ?? {}, 'object', 'margins');
|
||||||
|
const pageSize = parsePageSize(options.pageSize ?? 'letter');
|
||||||
|
|
||||||
|
const { top, bottom, left, right } = margins;
|
||||||
|
const validHeight = [top, bottom].every(u => u === undefined || u <= pageSize.paperHeight);
|
||||||
|
const validWidth = [left, right].every(u => u === undefined || u <= pageSize.paperWidth);
|
||||||
|
|
||||||
|
if (!validHeight || !validWidth) {
|
||||||
|
throw new Error('margins must be less than or equal to pageSize');
|
||||||
|
}
|
||||||
|
|
||||||
const printSettings = {
|
const printSettings = {
|
||||||
requestID: getNextId(),
|
requestID: getNextId(),
|
||||||
landscape: checkType(options.landscape ?? false, 'boolean', 'landscape'),
|
landscape: checkType(options.landscape ?? false, 'boolean', 'landscape'),
|
||||||
|
@ -236,7 +246,7 @@ WebContents.prototype.printToPDF = async function (options) {
|
||||||
preferCSSPageSize: checkType(options.preferCSSPageSize ?? false, 'boolean', 'preferCSSPageSize'),
|
preferCSSPageSize: checkType(options.preferCSSPageSize ?? false, 'boolean', 'preferCSSPageSize'),
|
||||||
generateTaggedPDF: checkType(options.generateTaggedPDF ?? false, 'boolean', 'generateTaggedPDF'),
|
generateTaggedPDF: checkType(options.generateTaggedPDF ?? false, 'boolean', 'generateTaggedPDF'),
|
||||||
generateDocumentOutline: checkType(options.generateDocumentOutline ?? false, 'boolean', 'generateDocumentOutline'),
|
generateDocumentOutline: checkType(options.generateDocumentOutline ?? false, 'boolean', 'generateDocumentOutline'),
|
||||||
...parsePageSize(options.pageSize ?? 'letter')
|
...pageSize
|
||||||
};
|
};
|
||||||
|
|
||||||
if (this._printToPDF) {
|
if (this._printToPDF) {
|
||||||
|
|
|
@ -2053,6 +2053,20 @@ describe('webContents module', () => {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('rejects when margins exceed physical page size', async () => {
|
||||||
|
await w.loadURL('data:text/html,<h1>Hello, World!</h1>');
|
||||||
|
|
||||||
|
await expect(w.webContents.printToPDF({
|
||||||
|
pageSize: 'Letter',
|
||||||
|
margins: {
|
||||||
|
top: 100,
|
||||||
|
bottom: 100,
|
||||||
|
left: 5,
|
||||||
|
right: 5
|
||||||
|
}
|
||||||
|
})).to.eventually.be.rejectedWith('margins must be less than or equal to pageSize');
|
||||||
|
});
|
||||||
|
|
||||||
it('does not crash when called multiple times in parallel', async () => {
|
it('does not crash when called multiple times in parallel', async () => {
|
||||||
await w.loadURL('data:text/html,<h1>Hello, World!</h1>');
|
await w.loadURL('data:text/html,<h1>Hello, World!</h1>');
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue