1162 lines
37 KiB
JavaScript
1162 lines
37 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
"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();
|
|
});
|
|
});
|