forked from mirrors/gecko-dev
		
	 7829e5aab5
			
		
	
	
		7829e5aab5
		
	
	
	
	
		
			
			Right now we rely on the menulist to be injected by hand in all the relevant windows. Instead create it lazily, making the select code more standalone. The DevTools window was missing it, for example. Differential Revision: https://phabricator.services.mozilla.com/D149620
		
			
				
	
	
		
			155 lines
		
	
	
	
		
			4.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			155 lines
		
	
	
	
		
			4.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* Any copyright is dedicated to the Public Domain.
 | |
|    http://creativecommons.org/publicdomain/zero/1.0/ */
 | |
| 
 | |
| "use strict";
 | |
| 
 | |
| let pdfPrinterName = "Mozilla Save to PDF";
 | |
| let fastPrinterName = "Fast";
 | |
| let slowPrinterName = "Slow";
 | |
| 
 | |
| async function setupPrinters(helper) {
 | |
|   helper.addMockPrinter(fastPrinterName);
 | |
| 
 | |
|   let resolvePrinterInfo;
 | |
|   helper.addMockPrinter({
 | |
|     name: slowPrinterName,
 | |
|     printerInfoPromise: new Promise(resolve => {
 | |
|       resolvePrinterInfo = resolve;
 | |
|     }),
 | |
|   });
 | |
| 
 | |
|   await SpecialPowers.pushPrefEnv({
 | |
|     set: [["print.printer_Slow.print_orientation", 1]],
 | |
|   });
 | |
| 
 | |
|   return resolvePrinterInfo;
 | |
| }
 | |
| 
 | |
| async function changeDestination(helper, dir) {
 | |
|   let picker = helper.get("printer-picker");
 | |
|   let changed = BrowserTestUtils.waitForEvent(picker, "change");
 | |
| 
 | |
|   let pickerOpened = BrowserTestUtils.waitForSelectPopupShown(window);
 | |
|   picker.focus();
 | |
|   EventUtils.sendKey("space", helper.win);
 | |
|   await pickerOpened;
 | |
|   EventUtils.sendKey(dir, window);
 | |
|   EventUtils.sendKey("return", window);
 | |
|   await changed;
 | |
| }
 | |
| 
 | |
| function assertFormEnabled(form) {
 | |
|   for (let element of form.elements) {
 | |
|     if (element.hasAttribute("disallowed")) {
 | |
|       ok(element.disabled, `${element.id} is disallowed`);
 | |
|     } else {
 | |
|       ok(!element.disabled, `${element.id} is enabled`);
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| function assertFormDisabled(form) {
 | |
|   for (let element of form.elements) {
 | |
|     if (element.id == "printer-picker" || element.id == "cancel-button") {
 | |
|       ok(!element.disabled, `${element.id} is enabled`);
 | |
|     } else {
 | |
|       ok(element.disabled, `${element.id} is disabled`);
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| add_task(async function testSlowDestinationChange() {
 | |
|   await PrintHelper.withTestPage(async helper => {
 | |
|     let resolvePrinterInfo = await setupPrinters(helper);
 | |
|     await helper.startPrint();
 | |
| 
 | |
|     let destinationPicker = helper.get("printer-picker");
 | |
|     let printForm = helper.get("print");
 | |
| 
 | |
|     info("Changing to fast printer should change settings");
 | |
|     await helper.assertSettingsChanged(
 | |
|       { printerName: pdfPrinterName, orientation: 0 },
 | |
|       { printerName: fastPrinterName, orientation: 0 },
 | |
|       async () => {
 | |
|         await changeDestination(helper, "down");
 | |
|         is(destinationPicker.value, fastPrinterName, "Fast printer selected");
 | |
|         // Wait one frame so the print settings promises resolve.
 | |
|         await helper.awaitAnimationFrame();
 | |
|         assertFormEnabled(printForm);
 | |
|       }
 | |
|     );
 | |
| 
 | |
|     info("Changing to slow printer should not change settings yet");
 | |
|     await helper.assertSettingsNotChanged(
 | |
|       { printerName: fastPrinterName, orientation: 0 },
 | |
|       async () => {
 | |
|         await changeDestination(helper, "down");
 | |
|         is(destinationPicker.value, slowPrinterName, "Slow printer selected");
 | |
|         // Wait one frame, since the settings are blocked on resolvePrinterInfo
 | |
|         // the settings shouldn't change.
 | |
|         await helper.awaitAnimationFrame();
 | |
|         assertFormDisabled(printForm);
 | |
|       }
 | |
|     );
 | |
| 
 | |
|     await helper.assertSettingsChanged(
 | |
|       { printerName: fastPrinterName, orientation: 0 },
 | |
|       { printerName: slowPrinterName, orientation: 1 },
 | |
|       async () => {
 | |
|         resolvePrinterInfo();
 | |
|         await helper.waitForSettingsEvent();
 | |
|         assertFormEnabled(printForm);
 | |
|       }
 | |
|     );
 | |
| 
 | |
|     await helper.closeDialog();
 | |
|   });
 | |
| });
 | |
| 
 | |
| add_task(async function testSwitchAwayFromSlowDestination() {
 | |
|   await PrintHelper.withTestPage(async helper => {
 | |
|     let resolvePrinterInfo = await setupPrinters(helper);
 | |
|     await helper.startPrint();
 | |
| 
 | |
|     let destinationPicker = helper.get("printer-picker");
 | |
|     let printForm = helper.get("print");
 | |
| 
 | |
|     // Load the fast printer.
 | |
|     await helper.waitForSettingsEvent(async () => {
 | |
|       await changeDestination(helper, "down");
 | |
|     });
 | |
|     await helper.awaitAnimationFrame();
 | |
|     assertFormEnabled(printForm);
 | |
| 
 | |
|     // "Load" the slow printer.
 | |
|     await changeDestination(helper, "down");
 | |
|     is(destinationPicker.value, slowPrinterName, "Slow printer selected");
 | |
|     // Wait an animation frame, since there's no settings event.
 | |
|     await helper.awaitAnimationFrame();
 | |
|     assertFormDisabled(printForm);
 | |
| 
 | |
|     // Switch back to the fast printer.
 | |
|     await helper.waitForSettingsEvent(async () => {
 | |
|       await changeDestination(helper, "up");
 | |
|     });
 | |
|     helper.assertSettingsMatch({
 | |
|       printerName: fastPrinterName,
 | |
|       orientation: 0,
 | |
|     });
 | |
| 
 | |
|     await helper.awaitAnimationFrame();
 | |
|     assertFormEnabled(printForm);
 | |
| 
 | |
|     // Let the slow printer settings resolve, the orientation shouldn't change.
 | |
|     resolvePrinterInfo();
 | |
|     // Wait so the settings event can trigger, if this case isn't handled.
 | |
|     await helper.awaitAnimationFrame();
 | |
|     helper.assertSettingsMatch({
 | |
|       printerName: fastPrinterName,
 | |
|       orientation: 0,
 | |
|     });
 | |
|     assertFormEnabled(printForm);
 | |
| 
 | |
|     await helper.closeDialog();
 | |
|   });
 | |
| });
 |