diff options
Diffstat (limited to 'testing/marionette/print.js')
-rw-r--r-- | testing/marionette/print.js | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/testing/marionette/print.js b/testing/marionette/print.js new file mode 100644 index 0000000000..72f98ed77e --- /dev/null +++ b/testing/marionette/print.js @@ -0,0 +1,129 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +const EXPORTED_SYMBOLS = ["print"]; + +const { XPCOMUtils } = ChromeUtils.import( + "resource://gre/modules/XPCOMUtils.jsm" +); + +XPCOMUtils.defineLazyModuleGetters(this, { + clearInterval: "resource://gre/modules/Timer.jsm", + OS: "resource://gre/modules/osfile.jsm", + setInterval: "resource://gre/modules/Timer.jsm", + + assert: "chrome://marionette/content/assert.js", + Log: "chrome://marionette/content/log.js", + pprint: "chrome://marionette/content/format.js", +}); + +XPCOMUtils.defineLazyGetter(this, "logger", () => Log.get()); + +this.print = { + maxScaleValue: 2.0, + minScaleValue: 0.1, + letterPaperSizeCm: { + width: 21.59, + height: 27.94, + }, +}; + +print.addDefaultSettings = function(settings) { + const { + landscape = false, + margin = { + top: 1, + bottom: 1, + left: 1, + right: 1, + }, + page = print.letterPaperSizeCm, + shrinkToFit = true, + printBackground = false, + scale = 1.0, + } = settings; + return { landscape, margin, page, shrinkToFit, printBackground, scale }; +}; + +function getPrintSettings(settings, filePath) { + const psService = Cc["@mozilla.org/gfx/printsettings-service;1"].getService( + Ci.nsIPrintSettingsService + ); + + let cmToInches = cm => cm / 2.54; + const printSettings = psService.newPrintSettings; + printSettings.isInitializedFromPrinter = true; + printSettings.isInitializedFromPrefs = true; + printSettings.outputFormat = Ci.nsIPrintSettings.kOutputFormatPDF; + printSettings.printerName = "marionette"; + printSettings.printSilent = true; + printSettings.printToFile = true; + printSettings.showPrintProgress = false; + printSettings.toFileName = filePath; + + // Setting the paperSizeUnit to kPaperSizeMillimeters doesn't work on mac + printSettings.paperSizeUnit = Ci.nsIPrintSettings.kPaperSizeInches; + printSettings.paperWidth = cmToInches(settings.page.width); + printSettings.paperHeight = cmToInches(settings.page.height); + + printSettings.marginBottom = cmToInches(settings.margin.bottom); + printSettings.marginLeft = cmToInches(settings.margin.left); + printSettings.marginRight = cmToInches(settings.margin.right); + printSettings.marginTop = cmToInches(settings.margin.top); + + printSettings.printBGColors = settings.printBackground; + printSettings.printBGImages = settings.printBackground; + printSettings.scaling = settings.scale; + printSettings.shrinkToFit = settings.shrinkToFit; + + printSettings.headerStrCenter = ""; + printSettings.headerStrLeft = ""; + printSettings.headerStrRight = ""; + printSettings.footerStrCenter = ""; + printSettings.footerStrLeft = ""; + printSettings.footerStrRight = ""; + + // Override any os-specific unwriteable margins + printSettings.unwriteableMarginTop = 0; + printSettings.unwriteableMarginLeft = 0; + printSettings.unwriteableMarginBottom = 0; + printSettings.unwriteableMarginRight = 0; + + if (settings.landscape) { + printSettings.orientation = Ci.nsIPrintSettings.kLandscapeOrientation; + } + return printSettings; +} + +print.printToFile = async function(browser, outerWindowID, settings) { + // Create a unique filename for the temporary PDF file + const basePath = OS.Path.join(OS.Constants.Path.tmpDir, "marionette.pdf"); + const { file, path: filePath } = await OS.File.openUnique(basePath); + await file.close(); + + let printSettings = getPrintSettings(settings, filePath); + + await browser.print(outerWindowID, printSettings); + + // Bug 1603739 - With e10s enabled the promise returned by print() resolves + // too early, which means the file hasn't been completely written. + await new Promise(resolve => { + const DELAY_CHECK_FILE_COMPLETELY_WRITTEN = 100; + + let lastSize = 0; + const timerId = setInterval(async () => { + const fileInfo = await OS.File.stat(filePath); + if (lastSize > 0 && fileInfo.size == lastSize) { + clearInterval(timerId); + resolve(); + } + lastSize = fileInfo.size; + }, DELAY_CHECK_FILE_COMPLETELY_WRITTEN); + }); + + logger.debug(`PDF output written to ${filePath}`); + return filePath; +}; |