Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/* Any copyright is dedicated to the Public Domain.
"use strict";
// Chaos mode slowdown causes intermittent failures - See bug 1698240.
requestLongerTimeout(2);
async function changeMargin(helper, scroll, value) {
let marginSelect = helper.get("margins-picker");
info(" current value is " + marginSelect.value);
marginSelect.focus();
if (scroll) {
marginSelect.scrollIntoView({ block: "center" });
}
marginSelect.value = value;
marginSelect.dispatchEvent(
new marginSelect.ownerGlobal.Event("input", {
bubbles: true,
composed: true,
})
);
marginSelect.dispatchEvent(
new marginSelect.ownerGlobal.Event("change", {
bubbles: true,
})
);
}
function changeDefaultToCustom(helper) {
info("Trying to change margin from default -> custom");
return changeMargin(helper, true, "custom");
}
function changeCustomToDefault(helper) {
info("Trying to change margin from custom -> default");
return changeMargin(helper, false, "default");
}
function changeCustomToNone(helper) {
info("Trying to change margin from custom -> none");
return changeMargin(helper, false, "none");
}
function assertPendingMarginsUpdate(helper) {
ok(
Object.keys(helper.win.PrintEventHandler._delayedChanges).length,
"At least one delayed task is added"
);
ok(
helper.win.PrintEventHandler._delayedSettingsChangeTask.isArmed,
"The update task is armed"
);
}
function assertNoPendingMarginsUpdate(helper) {
ok(
!helper.win.PrintEventHandler._delayedSettingsChangeTask.isArmed,
"The update task isn't armed"
);
}
async function setupLetterPaper() {
const INCHES_PER_POINT = 1 / 72;
const printerList = Cc["@mozilla.org/gfx/printerlist;1"].createInstance(
Ci.nsIPrinterList
);
let fallbackPaperList = await printerList.fallbackPaperList;
let paper = fallbackPaperList.find(
paper =>
paper.width * INCHES_PER_POINT == 8.5 &&
paper.height * INCHES_PER_POINT == 11
);
ok(paper, "Found a paper");
await SpecialPowers.pushPrefEnv({
set: [
["print.printer_Mozilla_Save_to_PDF.print_paper_id", paper.id.toString()],
["print.printer_Mozilla_Save_to_PDF.print_paper_size_unit", 0],
[
"print.printer_Mozilla_Save_to_PDF.print_paper_width",
(paper.width * INCHES_PER_POINT).toString(),
],
[
"print.printer_Mozilla_Save_to_PDF.print_paper_height",
(paper.height * INCHES_PER_POINT).toString(),
],
],
});
}
add_task(async function testCustomMarginMaxAttrsSet() {
await PrintHelper.withTestPage(async helper => {
let paperList = [
PrintHelper.createMockPaper({
id: "unwriteableMargins",
name: "Unwriteable Margins",
// Numbers here demonstrate our truncating logic doesn't round up
unwriteableMargin: {
top: 18,
bottom: 19,
left: 18,
right: 19,
QueryInterface: ChromeUtils.generateQI([Ci.nsIPaperMargin]),
},
}),
];
let mockPrinterName = "Mock printer";
helper.addMockPrinter({ name: mockPrinterName, paperList });
Services.prefs.setStringPref("print_printer", mockPrinterName);
await helper.startPrint();
await helper.openMoreSettings();
await changeDefaultToCustom(helper);
let marginsSelect = helper.get("margins-select");
is(
marginsSelect._maxHeight.toFixed(2),
"10.49",
"Max height would round up"
);
is(marginsSelect._maxWidth.toFixed(2), "7.99", "Max width would round up");
helper.assertSettingsMatch({
marginTop: 0.5,
marginRight: 0.5,
marginBottom: 0.5,
marginLeft: 0.5,
});
is(
helper.get("custom-margin-left").max,
"7.48",
"Left margin max attr is correct"
);
is(
helper.get("custom-margin-right").max,
"7.48",
"Right margin max attr is correct"
);
is(
helper.get("custom-margin-top").max,
"9.98",
"Top margin max attr is correct"
);
is(
helper.get("custom-margin-bottom").max,
"9.98",
"Bottom margin max attr is correct"
);
await helper.closeDialog();
});
});
add_task(async function testPresetMargins() {
await PrintHelper.withTestPage(async helper => {
await helper.startPrint();
await helper.openMoreSettings();
await helper.assertSettingsChanged(
{ marginTop: 0.5, marginRight: 0.5, marginBottom: 0.5, marginLeft: 0.5 },
{ marginTop: 0.25, marginRight: 1, marginBottom: 2, marginLeft: 0.75 },
async () => {
let marginSelect = helper.get("margins-picker");
let customMargins = helper.get("custom-margins");
ok(customMargins.hidden, "Custom margins are hidden");
is(marginSelect.value, "default", "Default margins set");
helper.assertSettingsMatch({ honorPageRuleMargins: true });
await changeDefaultToCustom(helper);
is(marginSelect.value, "custom", "Custom margins are now set");
ok(!customMargins.hidden, "Custom margins are present");
// Check that values are initialized to correct values
is(
helper.get("custom-margin-top").value,
"0.50",
"Top margin placeholder is correct"
);
is(
helper.get("custom-margin-right").value,
"0.50",
"Right margin placeholder is correct"
);
is(
helper.get("custom-margin-bottom").value,
"0.50",
"Bottom margin placeholder is correct"
);
is(
helper.get("custom-margin-left").value,
"0.50",
"Left margin placeholder is correct"
);
await helper.awaitAnimationFrame();
await helper.text(helper.get("custom-margin-top"), "0.25");
await helper.text(helper.get("custom-margin-right"), "1");
await helper.text(helper.get("custom-margin-bottom"), "2");
await helper.text(helper.get("custom-margin-left"), "0.75");
assertPendingMarginsUpdate(helper);
// Wait for the preview to update, the margin options delay updates by
// INPUT_DELAY_MS, which is 500ms.
await helper.waitForSettingsEvent();
}
);
await helper.closeDialog();
});
});
add_task(async function testHeightError() {
await PrintHelper.withTestPage(async helper => {
await helper.startPrint();
await helper.openMoreSettings();
await changeDefaultToCustom(helper);
await helper.assertSettingsNotChanged(
{ marginTop: 0.5, marginRight: 0.5, marginBottom: 0.5, marginLeft: 0.5 },
async () => {
let marginError = helper.get("error-invalid-margin");
ok(marginError.hidden, "Margin error is hidden");
await helper.text(helper.get("custom-margin-top"), "20");
await BrowserTestUtils.waitForAttributeRemoval("hidden", marginError);
ok(!marginError.hidden, "Margin error is showing");
assertNoPendingMarginsUpdate(helper);
}
);
await helper.closeDialog();
});
});
add_task(async function testWidthError() {
await PrintHelper.withTestPage(async helper => {
await helper.startPrint();
await helper.openMoreSettings();
await changeDefaultToCustom(helper);
await helper.assertSettingsNotChanged(
{ marginTop: 0.5, marginRight: 0.5, marginBottom: 0.5, marginLeft: 0.5 },
async () => {
let marginError = helper.get("error-invalid-margin");
ok(marginError.hidden, "Margin error is hidden");
await helper.text(helper.get("custom-margin-right"), "20");
await BrowserTestUtils.waitForAttributeRemoval("hidden", marginError);
ok(!marginError.hidden, "Margin error is showing");
assertNoPendingMarginsUpdate(helper);
}
);
await helper.closeDialog();
});
});
add_task(async function testInvalidMarginsReset() {
await PrintHelper.withTestPage(async helper => {
await helper.startPrint();
await helper.openMoreSettings();
await changeDefaultToCustom(helper);
let marginError = helper.get("error-invalid-margin");
await helper.assertSettingsNotChanged(
{ marginTop: 0.5, marginRight: 0.5, marginBottom: 0.5, marginLeft: 0.5 },
async () => {
ok(marginError.hidden, "Margin error is hidden");
await helper.awaitAnimationFrame();
await helper.text(helper.get("custom-margin-top"), "20");
await helper.text(helper.get("custom-margin-right"), "20");
assertNoPendingMarginsUpdate(helper);
await BrowserTestUtils.waitForAttributeRemoval("hidden", marginError);
}
);
await changeCustomToDefault(helper);
assertNoPendingMarginsUpdate(helper);
await BrowserTestUtils.waitForCondition(
() => marginError.hidden,
"Wait for margin error to be hidden"
);
await changeDefaultToCustom(helper);
helper.assertSettingsMatch({
marginTop: 0.5,
marginRight: 0.5,
marginBottom: 0.5,
marginLeft: 0.5,
});
is(
helper.get("margins-picker").value,
"custom",
"The custom option is selected"
);
is(
helper.get("custom-margin-top").value,
"0.50",
"Top margin placeholder is correct"
);
is(
helper.get("custom-margin-right").value,
"0.50",
"Right margin placeholder is correct"
);
is(
helper.get("custom-margin-bottom").value,
"0.50",
"Bottom margin placeholder is correct"
);
is(
helper.get("custom-margin-left").value,
"0.50",
"Left margin placeholder is correct"
);
await BrowserTestUtils.waitForCondition(
() => marginError.hidden,
"Wait for margin error to be hidden"
);
await helper.closeDialog();
});
});
add_task(async function testChangeInvalidToValidUpdate() {
await PrintHelper.withTestPage(async helper => {
await setupLetterPaper();
await helper.startPrint();
await helper.openMoreSettings();
await changeDefaultToCustom(helper);
await helper.awaitAnimationFrame();
let marginError = helper.get("error-invalid-margin");
await helper.text(helper.get("custom-margin-bottom"), "11");
assertNoPendingMarginsUpdate(helper);
await BrowserTestUtils.waitForAttributeRemoval("hidden", marginError);
ok(!marginError.hidden, "Margin error is showing");
helper.assertSettingsMatch({
marginTop: 0.5,
marginRight: 0.5,
marginBottom: 0.5,
marginLeft: 0.5,
paperId: "na_letter",
});
await helper.text(helper.get("custom-margin-top"), "1");
assertNoPendingMarginsUpdate(helper);
helper.assertSettingsMatch({
marginTop: 0.5,
marginRight: 0.5,
marginBottom: 0.5,
marginLeft: 0.5,
});
ok(!marginError.hidden, "Margin error is showing");
await helper.assertSettingsChanged(
{ marginTop: 0.5, marginRight: 0.5, marginBottom: 0.5, marginLeft: 0.5 },
{ marginTop: 1, marginRight: 0.5, marginBottom: 1, marginLeft: 0.5 },
async () => {
await helper.text(helper.get("custom-margin-bottom"), "1");
assertPendingMarginsUpdate(helper);
// Wait for the preview to update, the margin options delay updates by
// INPUT_DELAY_MS, which is 500ms.
await helper.waitForSettingsEvent();
ok(marginError.hidden, "Margin error is hidden");
}
);
});
});
add_task(async function testChangeInvalidCanRevalidate() {
await PrintHelper.withTestPage(async helper => {
await setupLetterPaper();
await helper.startPrint();
await helper.openMoreSettings();
await changeDefaultToCustom(helper);
await helper.awaitAnimationFrame();
let marginError = helper.get("error-invalid-margin");
await helper.assertSettingsChanged(
{ marginTop: 0.5, marginRight: 0.5, marginBottom: 0.5, marginLeft: 0.5 },
{ marginTop: 5, marginRight: 0.5, marginBottom: 3, marginLeft: 0.5 },
async () => {
await helper.text(helper.get("custom-margin-top"), "5");
await helper.text(helper.get("custom-margin-bottom"), "3");
assertPendingMarginsUpdate(helper);
// Wait for the preview to update, the margin options delay updates by
// INPUT_DELAY_MS, which is 500ms.
await helper.waitForSettingsEvent();
ok(marginError.hidden, "Margin error is hidden");
}
);
await helper.text(helper.get("custom-margin-top"), "9");
assertNoPendingMarginsUpdate(helper);
await BrowserTestUtils.waitForAttributeRemoval("hidden", marginError);
ok(!marginError.hidden, "Margin error is showing");
helper.assertSettingsMatch({
marginTop: 5,
marginRight: 0.5,
marginBottom: 3,
marginLeft: 0.5,
paperId: "na_letter",
});
await helper.assertSettingsChanged(
{ marginTop: 5, marginRight: 0.5, marginBottom: 3, marginLeft: 0.5 },
{ marginTop: 9, marginRight: 0.5, marginBottom: 2, marginLeft: 0.5 },
async () => {
await helper.text(helper.get("custom-margin-bottom"), "2");
assertPendingMarginsUpdate(helper);
// Wait for the preview to update, the margin options delay updates by
// INPUT_DELAY_MS, which is 500ms.
await helper.waitForSettingsEvent();
ok(marginError.hidden, "Margin error is hidden");
}
);
});
});
add_task(async function testCustomMarginsPersist() {
await PrintHelper.withTestPage(async helper => {
await helper.startPrint();
await helper.openMoreSettings();
await helper.assertSettingsChanged(
{ marginTop: 0.5, marginRight: 0.5, marginBottom: 0.5, marginLeft: 0.5 },
{ marginTop: 0.25, marginRight: 1, marginBottom: 2, marginLeft: 0 },
async () => {
await changeDefaultToCustom(helper);
await helper.awaitAnimationFrame();
await helper.text(helper.get("custom-margin-top"), "0.25");
await helper.text(helper.get("custom-margin-right"), "1");
await helper.text(helper.get("custom-margin-bottom"), "2");
await helper.text(helper.get("custom-margin-left"), "0");
assertPendingMarginsUpdate(helper);
// Wait for the preview to update, the margin options delay updates by
// INPUT_DELAY_MS, which is 500ms.
await helper.waitForSettingsEvent();
}
);
await helper.closeDialog();
await helper.startPrint();
await helper.openMoreSettings();
helper.assertSettingsMatch({
marginTop: 0.25,
marginRight: 1,
marginBottom: 2,
marginLeft: 0,
});
is(
helper.get("margins-picker").value,
"custom",
"The custom option is selected"
);
is(
helper.get("custom-margin-top").value,
"0.25",
"Top margin placeholder is correct"
);
is(
helper.get("custom-margin-right").value,
"1.00",
"Right margin placeholder is correct"
);
is(
helper.get("custom-margin-bottom").value,
"2.00",
"Bottom margin placeholder is correct"
);
is(
helper.get("custom-margin-left").value,
"0.00",
"Left margin placeholder is correct"
);
await helper.assertSettingsChanged(
{ marginTop: 0.25, marginRight: 1, marginBottom: 2, marginLeft: 0 },
{ marginTop: 0.5, marginRight: 0.5, marginBottom: 0.5, marginLeft: 0.5 },
async () => {
await helper.awaitAnimationFrame();
await helper.text(helper.get("custom-margin-top"), "0.50");
await helper.text(helper.get("custom-margin-right"), "0.50");
await helper.text(helper.get("custom-margin-bottom"), "0.50");
await helper.text(helper.get("custom-margin-left"), "0.50");
assertPendingMarginsUpdate(helper);
// Wait for the preview to update, the margin options delay updates by
// INPUT_DELAY_MS, which is 500ms.
await helper.waitForSettingsEvent();
}
);
await helper.closeDialog();
});
});
add_task(async function testChangingBetweenMargins() {
await PrintHelper.withTestPage(async helper => {
await SpecialPowers.pushPrefEnv({
set: [["print.printer_Mozilla_Save_to_PDF.print_margin_left", "1"]],
});
await helper.startPrint();
await helper.openMoreSettings();
let marginsPicker = helper.get("margins-picker");
is(marginsPicker.value, "custom", "First margin is custom");
helper.assertSettingsMatch({
marginTop: 0.5,
marginBottom: 0.5,
marginLeft: 1,
marginRight: 0.5,
});
info("Switch to Default margins");
await helper.assertSettingsChanged(
{ marginLeft: 1 },
{ marginLeft: 0.5 },
async () => {
let settingsChanged = helper.waitForSettingsEvent();
await changeCustomToDefault(helper);
await settingsChanged;
}
);
is(marginsPicker.value, "default", "Default preset selected");
info("Switching back to Custom, should restore old margins");
await helper.assertSettingsChanged(
{ marginLeft: 0.5 },
{ marginLeft: 1 },
async () => {
let settingsChanged = helper.waitForSettingsEvent();
await changeDefaultToCustom(helper);
await settingsChanged;
}
);
is(marginsPicker.value, "custom", "Custom is now selected");
info("Switching back to Default, should restore 0.5");
await helper.assertSettingsChanged(
{ marginLeft: 1 },
{ marginLeft: 0.5 },
async () => {
let settingsChanged = helper.waitForSettingsEvent();
await changeCustomToDefault(helper);
await settingsChanged;
}
);
is(marginsPicker.value, "default", "Default preset is selected again");
});
});
add_task(async function testChangeHonoredInPrint() {
const mockPrinterName = "Fake Printer";
await PrintHelper.withTestPage(async helper => {
helper.addMockPrinter(mockPrinterName);
await helper.startPrint();
await helper.setupMockPrint();
helper.mockFilePicker("changedMargin.pdf");
await helper.openMoreSettings();
helper.assertSettingsMatch({ marginRight: 0.5 });
await changeDefaultToCustom(helper);
await helper.withClosingFn(async () => {
await helper.text(helper.get("custom-margin-right"), "1");
EventUtils.sendKey("return", helper.win);
helper.resolvePrint();
});
helper.assertPrintedWithSettings({ marginRight: 1 });
});
});
add_task(async function testInvalidPrefValueHeight() {
await PrintHelper.withTestPage(async helper => {
// Set some bad prefs
await SpecialPowers.pushPrefEnv({
set: [["print.printer_Mozilla_Save_to_PDF.print_margin_top", "-1"]],
});
await helper.startPrint();
helper.assertSettingsMatch({
marginTop: 0.5,
marginRight: 0.5,
marginBottom: 0.5,
marginLeft: 0.5,
});
await helper.closeDialog();
});
});
add_task(async function testInvalidPrefValueWidth() {
await PrintHelper.withTestPage(async helper => {
// Set some bad prefs
await SpecialPowers.pushPrefEnv({
set: [["print.printer_Mozilla_Save_to_PDF.print_margin_left", "-1"]],
});
await helper.startPrint();
helper.assertSettingsMatch({
marginTop: 0.5,
marginRight: 0.5,
marginBottom: 0.5,
marginLeft: 0.5,
});
await helper.closeDialog();
});
});
add_task(async function testInvalidMarginStartup() {
await PrintHelper.withTestPage(async helper => {
await SpecialPowers.pushPrefEnv({
set: [
["print.printer_Mozilla_Save_to_PDF.print_margin_right", "4"],
["print.printer_Mozilla_Save_to_PDF.print_margin_left", "5"],
],
});
await setupLetterPaper();
await helper.startPrint();
helper.assertSettingsMatch({
paperId: "na_letter",
marginLeft: 0.5,
marginRight: 0.5,
});
helper.closeDialog();
});
});
add_task(async function testRevalidateSwitchToNone() {
await PrintHelper.withTestPage(async helper => {
await setupLetterPaper();
await helper.startPrint();
await helper.openMoreSettings();
await changeDefaultToCustom(helper);
await helper.awaitAnimationFrame();
await helper.text(helper.get("custom-margin-bottom"), "6");
await helper.text(helper.get("custom-margin-top"), "6");
assertNoPendingMarginsUpdate(helper);
helper.assertSettingsMatch({
marginTop: 0.5,
marginRight: 0.5,
marginBottom: 0.5,
marginLeft: 0.5,
paperId: "na_letter",
});
await helper.assertSettingsChanged(
{ marginTop: 0.5, marginRight: 0.5, marginBottom: 0.5, marginLeft: 0.5 },
{ marginTop: 6, marginRight: 0.5, marginBottom: 3, marginLeft: 0.5 },
async () => {
await helper.text(helper.get("custom-margin-bottom"), "3");
assertPendingMarginsUpdate(helper);
// Wait for the preview to update, the margin options delay updates by
// INPUT_DELAY_MS, which is 500ms.
await helper.waitForSettingsEvent();
}
);
await helper.assertSettingsChanged(
{ marginTop: 6, marginRight: 0.5, marginBottom: 3, marginLeft: 0.5 },
{ marginTop: 0, marginRight: 0, marginBottom: 0, marginLeft: 0 },
async () => {
await changeCustomToNone(helper);
is(
helper.get("margins-picker").value,
"none",
"No margins are now set"
);
// Wait for the preview to update, the margin options delay updates by
// INPUT_DELAY_MS, which is 500ms.
await helper.waitForSettingsEvent();
}
);
});
});
add_task(async function testInvalidMarginResetAfterDestinationChange() {
const mockPrinterName = "Fake Printer";
await PrintHelper.withTestPage(async helper => {
helper.addMockPrinter(mockPrinterName);
await SpecialPowers.pushPrefEnv({
set: [
["print.printer_Fake_Printer.print_paper_id", "na_letter"],
["print.printer_Fake_Printer.print_paper_size_unit", 0],
["print.printer_Fake_Printer.print_paper_width", "8.5"],
["print.printer_Fake_Printer.print_paper_height", "11"],
],
});
await helper.startPrint();
let destinationPicker = helper.get("printer-picker");
await helper.openMoreSettings();
await changeDefaultToCustom(helper);
await helper.awaitAnimationFrame();
let marginError = helper.get("error-invalid-margin");
await helper.assertSettingsNotChanged(
{ marginTop: 0.5, marginRight: 0.5, marginBottom: 0.5, marginLeft: 0.5 },
async () => {
ok(marginError.hidden, "Margin error is hidden");
await helper.text(helper.get("custom-margin-top"), "20");
await BrowserTestUtils.waitForAttributeRemoval("hidden", marginError);
ok(!marginError.hidden, "Margin error is showing");
assertNoPendingMarginsUpdate(helper);
}
);
is(destinationPicker.disabled, false, "Destination picker is enabled");
helper.dispatchSettingsChange({ printerName: mockPrinterName });
await BrowserTestUtils.waitForCondition(
() => marginError.hidden,
"Wait for margin error to be hidden"
);
helper.assertSettingsMatch({
marginTop: 0.5,
marginRight: 0.5,
marginBottom: 0.5,
marginLeft: 0.5,
});
await helper.closeDialog();
});
});
add_task(async function testRevalidateCustomMarginsAfterPaperChanges() {
await PrintHelper.withTestPage(async helper => {
await helper.startPrint();
helper.dispatchSettingsChange({ paperId: "iso_a3" });
await helper.openMoreSettings();
await changeDefaultToCustom(helper);
await helper.awaitAnimationFrame();
let marginError = helper.get("error-invalid-margin");
await helper.assertSettingsChanged(
{ marginTop: 0.5, marginRight: 0.5, marginBottom: 0.5, marginLeft: 0.5 },
{ marginTop: 5, marginRight: 5, marginBottom: 5, marginLeft: 5 },
async () => {
await helper.text(helper.get("custom-margin-top"), "5");
await helper.text(helper.get("custom-margin-bottom"), "5");
await helper.text(helper.get("custom-margin-right"), "5");
await helper.text(helper.get("custom-margin-left"), "5");
assertPendingMarginsUpdate(helper);
// Wait for the preview to update, the margin options delay updates by
// INPUT_DELAY_MS, which is 500ms.
await helper.waitForSettingsEvent();
ok(marginError.hidden, "Margin error is hidden");
}
);
await helper.assertSettingsChanged(
{ marginTop: 5, marginRight: 5, marginBottom: 5, marginLeft: 5 },
{ marginTop: 0.5, marginRight: 0.5, marginBottom: 0.5, marginLeft: 0.5 },
async () => {
helper.dispatchSettingsChange({ paperId: "iso_a5" });
// Wait for the preview to update, the margin options delay updates by
// INPUT_DELAY_MS, which is 500ms.
await helper.waitForSettingsEvent();
ok(marginError.hidden, "Margin error is hidden");
}
);
});
});
add_task(async function testRevalidateCustomMarginsAfterOrientationChanges() {
await PrintHelper.withTestPage(async helper => {
await setupLetterPaper();
await helper.startPrint();
await helper.openMoreSettings();
await changeDefaultToCustom(helper);
await helper.awaitAnimationFrame();
let marginError = helper.get("error-invalid-margin");
await helper.assertSettingsChanged(
{ marginTop: 0.5, marginRight: 0.5, marginBottom: 0.5, marginLeft: 0.5 },
{ marginTop: 5, marginRight: 0.5, marginBottom: 5, marginLeft: 0.5 },
async () => {
await helper.text(helper.get("custom-margin-top"), "5");
await helper.text(helper.get("custom-margin-bottom"), "5");
assertPendingMarginsUpdate(helper);
// Wait for the preview to update, the margin options delay updates by
// INPUT_DELAY_MS, which is 500ms.
await helper.waitForSettingsEvent();
ok(marginError.hidden, "Margin error is hidden");
}
);
await helper.assertSettingsChanged(
{ marginTop: 5, marginRight: 0.5, marginBottom: 5, marginLeft: 0.5 },
{ marginTop: 0.5, marginRight: 0.5, marginBottom: 0.5, marginLeft: 0.5 },
async () => {
helper.dispatchSettingsChange({ orientation: 1 });
await helper.waitForSettingsEvent();
ok(marginError.hidden, "Margin error is hidden");
}
);
});
});
add_task(async function testResetMarginPersists() {
await PrintHelper.withTestPage(async helper => {
await setupLetterPaper();
await helper.startPrint();
await helper.openMoreSettings();
await changeDefaultToCustom(helper);
await helper.awaitAnimationFrame();
let marginError = helper.get("error-invalid-margin");
await helper.assertSettingsChanged(
{ marginTop: 0.5, marginRight: 0.5, marginBottom: 0.5, marginLeft: 0.5 },
{ marginTop: 0.5, marginRight: 4, marginBottom: 0.5, marginLeft: 4.5 },
async () => {
await helper.text(helper.get("custom-margin-right"), "4");
await helper.text(helper.get("custom-margin-left"), "4.5");
// Wait for the preview to update, the margin options delay updates by
// INPUT_DELAY_MS, which is 500ms.
await helper.waitForSettingsEvent();
ok(marginError.hidden, "Margin error is hidden");
}
);
await helper.assertSettingsChanged(
{ marginTop: 0.5, marginRight: 4, marginBottom: 0.5, marginLeft: 4.5 },
{ marginTop: 0.5, marginRight: 0.5, marginBottom: 0.5, marginLeft: 0.5 },
async () => {
helper.dispatchSettingsChange({ paperId: "iso_a4" });
// Wait for the preview to update, the margin options delay updates by
// INPUT_DELAY_MS, which is 500ms.
await helper.waitForSettingsEvent();
ok(marginError.hidden, "Margin error is hidden");
}
);
await helper.assertSettingsNotChanged(
{ marginTop: 0.5, marginRight: 0.5, marginBottom: 0.5, marginLeft: 0.5 },
async () => {
helper.dispatchSettingsChange({ paperId: "iso_a5" });
await helper.waitForSettingsEvent();
ok(marginError.hidden, "Margin error is hidden");
}
);
await helper.closeDialog();
});
});
add_task(async function testCustomMarginUnits() {
const mockPrinterName = "MetricPrinter";
await PrintHelper.withTestPage(async helper => {
// Add a metric-unit printer we can test with
helper.addMockPrinter({
name: mockPrinterName,
paperSizeUnit: Ci.nsIPrintSettings.kPaperSizeMillimeters,
paperList: [],
});
// settings are saved in inches
const persistedMargins = {
top: 0.5,
right: 5,
bottom: 0.5,
left: 1,
};
await SpecialPowers.pushPrefEnv({
set: [
[
"print.printer_Mozilla_Save_to_PDF.print_margin_right",
persistedMargins.right.toString(),
],
[
"print.printer_Mozilla_Save_to_PDF.print_margin_left",
persistedMargins.left.toString(),
],
[
"print.printer_Mozilla_Save_to_PDF.print_margin_top",
persistedMargins.top.toString(),
],
[
"print.printer_Mozilla_Save_to_PDF.print_margin_bottom",
persistedMargins.bottom.toString(),
],
],
});
await helper.startPrint();
await helper.openMoreSettings();
helper.assertSettingsMatch({
paperId: "na_letter",
marginTop: persistedMargins.top,
marginRight: persistedMargins.right,
marginBottom: persistedMargins.bottom,
marginLeft: persistedMargins.left,
});
is(
helper.settings.printerName,
DEFAULT_PRINTER_NAME,
"The PDF (inch-unit) printer is current"
);
is(
helper.get("margins-picker").value,
"custom",
"The margins picker has the expected value"
);
is(
helper.get("margins-picker").selectedOptions[0].dataset.l10nId,
"printui-margins-custom-inches",
"The custom margins option has correct unit string id"
);
// the unit value should be correct for inches
for (let edgeName of Object.keys(persistedMargins)) {
is(
helper.get(`custom-margin-${edgeName}`).value,
persistedMargins[edgeName].toFixed(2),
`Has the expected unit-converted ${edgeName}-margin value`
);
}
await helper.assertSettingsChanged(
{ marginTop: persistedMargins.top },
{ marginTop: 1 },
async () => {
// update the top margin to 1"
await helper.text(helper.get("custom-margin-top"), "1");
assertPendingMarginsUpdate(helper);
// Wait for the preview to update, the margin options delay updates by
// INPUT_DELAY_MS, which is 500ms.
await helper.waitForSettingsEvent();
// ensure any round-trip correctly re-converts the setting value back to the displayed mm value
is(
helper.get("custom-margin-top").value,
"1",
"Converted custom margin value is expected value"
);
}
);
// put it back to how it was
await helper.text(
helper.get("custom-margin-top"),
persistedMargins.top.toString()
);
await helper.waitForSettingsEvent();
// Now switch to the metric printer
await helper.dispatchSettingsChange({ printerName: mockPrinterName });
await helper.waitForSettingsEvent();
is(
helper.settings.printerName,
mockPrinterName,
"The metric printer is current"
);
is(
helper.get("margins-picker").value,
"custom",
"The margins picker has the expected value"
);
is(
helper.get("margins-picker").selectedOptions[0].dataset.l10nId,
"printui-margins-custom-mm",
"The custom margins option has correct unit string id"
);
// the unit value should be correct for mm
for (let edgeName of Object.keys(persistedMargins)) {
is(
helper.get(`custom-margin-${edgeName}`).value,
(persistedMargins[edgeName] * 25.4).toFixed(2),
`Has the expected unit-converted ${edgeName}-margin value`
);
}
await helper.assertSettingsChanged(
{ marginTop: persistedMargins.top },
{ marginTop: 1 },
async () => {
let marginError = helper.get("error-invalid-margin");
ok(marginError.hidden, "Margin error is hidden");
// update the top margin to 1" in mm
await helper.text(helper.get("custom-margin-top"), "25.4");
// Check the constraints validation is using the right max
// as 25" top margin would be an error, but 25mm is ok
ok(marginError.hidden, "Margin error is hidden");
assertPendingMarginsUpdate(helper);
// Wait for the preview to update, the margin options delay updates by INPUT_DELAY_MS
await helper.waitForSettingsEvent();
// ensure any round-trip correctly re-converts the setting value back to the displayed mm value
is(
helper.get("custom-margin-top").value,
"25.4",
"Converted custom margin value is expected value"
);
}
);
// check margin validation is actually working with unit-appropriate max
await helper.assertSettingsNotChanged({ marginTop: 1 }, async () => {
let marginError = helper.get("error-invalid-margin");
ok(marginError.hidden, "Margin error is hidden");
await helper.text(helper.get("custom-margin-top"), "300");
await BrowserTestUtils.waitForAttributeRemoval("hidden", marginError);
ok(!marginError.hidden, "Margin error is showing");
assertNoPendingMarginsUpdate(helper);
});
await SpecialPowers.popPrefEnv();
await helper.closeDialog();
});
});
add_task(async function testHonorPageRuleMargins() {
await PrintHelper.withTestPage(async helper => {
await helper.startPrint();
await helper.openMoreSettings();
let marginsPicker = helper.get("margins-picker");
is(marginsPicker.value, "default", "Started with default margins");
helper.assertSettingsMatch({ honorPageRuleMargins: true });
await helper.waitForSettingsEvent(() => changeDefaultToCustom(helper));
is(marginsPicker.value, "custom", "Changed to custom margins");
helper.assertSettingsMatch({ honorPageRuleMargins: false });
await helper.waitForSettingsEvent(() => changeCustomToNone(helper));
is(marginsPicker.value, "none", "Changed to no margins");
helper.assertSettingsMatch({ honorPageRuleMargins: false });
await helper.waitForSettingsEvent(() => changeCustomToDefault(helper));
is(marginsPicker.value, "default", "Back to default margins");
helper.assertSettingsMatch({ honorPageRuleMargins: true });
});
});
add_task(async function testIgnoreUnwriteableMargins() {
await PrintHelper.withTestPage(async helper => {
await helper.startPrint();
await helper.openMoreSettings();
let marginsPicker = helper.get("margins-picker");
is(marginsPicker.value, "default", "Started with default margins");
helper.assertSettingsMatch({ ignoreUnwriteableMargins: false });
await helper.waitForSettingsEvent(() => changeDefaultToCustom(helper));
is(marginsPicker.value, "custom", "Changed to custom margins");
helper.assertSettingsMatch({ ignoreUnwriteableMargins: false });
await helper.waitForSettingsEvent(() => changeCustomToNone(helper));
is(marginsPicker.value, "none", "Changed to no margins");
helper.assertSettingsMatch({ ignoreUnwriteableMargins: true });
await helper.waitForSettingsEvent(() => changeCustomToDefault(helper));
is(marginsPicker.value, "default", "Back to default margins");
helper.assertSettingsMatch({ ignoreUnwriteableMargins: false });
});
});
add_task(async function testCustomMarginZeroRespectsUnwriteableMargins() {
await PrintHelper.withTestPage(async helper => {
await helper.startPrint();
await helper.openMoreSettings();
let marginsPicker = helper.get("margins-picker");
await helper.waitForSettingsEvent(() => changeDefaultToCustom(helper));
is(marginsPicker.value, "custom", "Changed to custom margins");
await helper.text(helper.get("custom-margin-top"), "0");
await helper.text(helper.get("custom-margin-right"), "0");
await helper.text(helper.get("custom-margin-bottom"), "0");
await helper.text(helper.get("custom-margin-left"), "0");
assertPendingMarginsUpdate(helper);
await helper.waitForSettingsEvent();
helper.assertSettingsMatch({ ignoreUnwriteableMargins: false });
});
});
add_task(async function testDefaultMarginsInvalidStartup() {
await PrintHelper.withTestPage(async helper => {
let paperList = [
PrintHelper.createMockPaper({
id: "smallestPaper",
name: "Default Margins Invalid",
width: 50,
height: 50,
unwriteableMargin: {
top: 10,
bottom: 10,
left: 10,
right: 10,
QueryInterface: ChromeUtils.generateQI([Ci.nsIPaperMargin]),
},
}),
];
let mockPrinterName = "Mock printer";
helper.addMockPrinter({ name: mockPrinterName, paperList });
Services.prefs.setStringPref("print_printer", mockPrinterName);
await helper.startPrint();
helper.assertSettingsMatch({
marginTop: 0,
marginRight: 0,
marginBottom: 0,
marginLeft: 0,
});
let marginSelect = helper.get("margins-picker");
is(marginSelect.value, "none", "Margins picker set to 'None'");
let printForm = helper.get("print");
ok(printForm.checkValidity(), "The print form is valid");
await helper.closeDialog();
});
});