107 lines
3.5 KiB
JavaScript
107 lines
3.5 KiB
JavaScript
//creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
"use strict";
|
|
|
|
const PSSVC = Cc["@mozilla.org/gfx/printsettings-service;1"].getService(
|
|
Ci.nsIPrintSettingsService
|
|
);
|
|
|
|
async function printToDestination(aBrowser, aDestination) {
|
|
let tmpDir = Services.dirsvc.get("TmpD", Ci.nsIFile);
|
|
let fileName = `printDestinationTest-${aDestination}.pdf`;
|
|
let filePath = PathUtils.join(tmpDir.path, fileName);
|
|
|
|
info(`Printing to ${filePath}`);
|
|
|
|
let settings = PSSVC.createNewPrintSettings();
|
|
settings.outputFormat = Ci.nsIPrintSettings.kOutputFormatPDF;
|
|
settings.outputDestination = aDestination;
|
|
|
|
settings.headerStrCenter = "";
|
|
settings.headerStrLeft = "";
|
|
settings.headerStrRight = "";
|
|
settings.footerStrCenter = "";
|
|
settings.footerStrLeft = "";
|
|
settings.footerStrRight = "";
|
|
|
|
settings.unwriteableMarginTop = 1; /* Just to ensure settings are respected on both */
|
|
let outStream = null;
|
|
if (aDestination == Ci.nsIPrintSettings.kOutputDestinationFile) {
|
|
settings.toFileName = PathUtils.join(tmpDir.path, fileName);
|
|
} else {
|
|
is(aDestination, Ci.nsIPrintSettings.kOutputDestinationStream);
|
|
outStream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(
|
|
Ci.nsIFileOutputStream
|
|
);
|
|
let tmpFile = tmpDir.clone();
|
|
tmpFile.append(fileName);
|
|
outStream.init(tmpFile, -1, 0o666, 0);
|
|
settings.outputStream = outStream;
|
|
}
|
|
|
|
await aBrowser.browsingContext.print(settings);
|
|
|
|
return filePath;
|
|
}
|
|
|
|
add_task(async function testPrintToStream() {
|
|
await PrintHelper.withTestPage(async helper => {
|
|
let filePath = await printToDestination(
|
|
helper.sourceBrowser,
|
|
Ci.nsIPrintSettings.kOutputDestinationFile
|
|
);
|
|
let streamPath = await printToDestination(
|
|
helper.sourceBrowser,
|
|
Ci.nsIPrintSettings.kOutputDestinationStream
|
|
);
|
|
|
|
// In Cocoa the CGContext adds a hash, plus there are other minor
|
|
// non-user-visible differences, so we need to be a bit more sloppy there.
|
|
//
|
|
// We see one byte difference in Windows and Linux on automation sometimes,
|
|
// though files are consistently the same locally, that needs
|
|
// investigation, but it's probably harmless.
|
|
const maxSizeDifference = AppConstants.platform == "macosx" ? 100 : 2;
|
|
|
|
// Buffering shenanigans? Wait for sizes to match... There's no great
|
|
// IOUtils methods to force a flush without writing anything...
|
|
await TestUtils.waitForCondition(async function () {
|
|
let fileStat = await IOUtils.stat(filePath);
|
|
let streamStat = await IOUtils.stat(streamPath);
|
|
|
|
Assert.greater(
|
|
fileStat.size,
|
|
0,
|
|
"File file should not be empty: " + fileStat.size
|
|
);
|
|
Assert.greater(
|
|
streamStat.size,
|
|
0,
|
|
"Stream file should not be empty: " + streamStat.size
|
|
);
|
|
return Math.abs(fileStat.size - streamStat.size) <= maxSizeDifference;
|
|
}, "Sizes should (almost) match");
|
|
|
|
if (false) {
|
|
// This doesn't work reliably on automation, but works locally, see
|
|
// above...
|
|
let fileData = await IOUtils.read(filePath);
|
|
let streamData = await IOUtils.read(streamPath);
|
|
ok(!!fileData.length, "File should not be empty");
|
|
is(fileData.length, streamData.length, "File size should be equal");
|
|
for (let i = 0; i < fileData.length; ++i) {
|
|
if (fileData[i] != streamData[i]) {
|
|
is(
|
|
fileData[i],
|
|
streamData[i],
|
|
`Files should be equal (byte ${i} different)`
|
|
);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
await IOUtils.remove(filePath);
|
|
await IOUtils.remove(streamPath);
|
|
});
|
|
});
|