Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 /** | 5 /** |
| 6 * Test fixture for print preview WebUI testing. | 6 * Test fixture for print preview WebUI testing. |
| 7 * @constructor | |
| 7 * @extends {testing.Test} | 8 * @extends {testing.Test} |
| 8 * @constructor | |
| 9 */ | 9 */ |
| 10 function PrintPreviewWebUITest() {} | 10 function PrintPreviewWebUITest() { |
| 11 testing.Test.call(this); | |
| 12 this.nativeLayer_ = null; | |
| 13 this.initialSettings_ = null; | |
| 14 this.localDestinationInfos_ = null; | |
| 15 } | |
| 11 | 16 |
| 12 PrintPreviewWebUITest.prototype = { | 17 PrintPreviewWebUITest.prototype = { |
| 13 __proto__: testing.Test.prototype, | 18 __proto__: testing.Test.prototype, |
| 14 | 19 |
| 15 /** | 20 /** |
| 16 * Browse to the sample page, cause print preview & call preLoad(). | 21 * Browse to the sample page, cause print preview & call preLoad(). |
| 17 * @type {string} | 22 * @type {string} |
| 18 * @override | 23 * @override |
| 19 */ | 24 */ |
| 20 browsePrintPreload: 'print_preview_hello_world_test.html', | 25 browsePrintPreload: 'print_preview_hello_world_test.html', |
| 21 | 26 |
| 22 /** | 27 /** |
| 23 * Register a mock handler to ensure expectations are met and print preview | 28 * Stub out low-level functionality like the NativeLayer and |
| 24 * behaves correctly. | 29 * CloudPrintInterface. |
| 25 * @type {Function} | |
| 26 * @this {PrintPreviewWebUITest} | 30 * @this {PrintPreviewWebUITest} |
| 27 * @override | 31 * @override |
| 28 */ | 32 */ |
| 29 preLoad: function() { | 33 preLoad: function() { |
| 30 this.makeAndRegisterMockHandler(['getInitialSettings', | 34 window.addEventListener('DOMContentLoaded', function() { |
| 31 'getPrinters', | 35 function NativeLayerStub() { |
| 32 'getPreview', | 36 cr.EventTarget.call(this); |
| 33 'print', | 37 } |
| 34 'getPrinterCapabilities', | 38 NativeLayerStub.prototype = { |
| 35 'showSystemDialog', | 39 __proto__: cr.EventTarget.prototype, |
| 36 'morePrinters', | 40 startGetInitialSettings: function() {}, |
| 37 'signIn', | 41 startGetLocalDestinations: function() {}, |
| 38 'addCloudPrinter', | 42 startGetLocalDestinationCapabilities: function(destinationId) {} |
| 39 'manageCloudPrinters', | 43 }; |
| 40 'manageLocalPrinters', | |
| 41 'closePrintPreviewTab', | |
| 42 'hidePreview', | |
| 43 'cancelPendingPrintRequest', | |
| 44 'saveLastPrinter', | |
| 45 ]); | |
| 46 | 44 |
| 47 // Register stubs for methods expected to be called before tests | 45 this.nativeLayer_ = new NativeLayerStub(); |
| 48 // run. Specific expectations can be made in the tests themselves. | 46 printPreview.nativeLayer_ = this.nativeLayer_; |
| 49 this.mockHandler.stubs().getInitialSettings(). | |
| 50 will(callFunction(function() { | |
| 51 setDefaultPrinter('FooDevice'); | |
| 52 })); | |
| 53 this.mockHandler.stubs().getPrinterCapabilities(NOT_NULL). | |
| 54 will(callFunction(function() { | |
| 55 updateWithPrinterCapabilities({ | |
| 56 disableColorOption: true, | |
| 57 setColorAsDefault: true, | |
| 58 disableCopiesOption: true, | |
| 59 printerDefaultDuplexValue: print_preview.CopiesSettings.SIMPLEX, | |
| 60 }); | |
| 61 })); | |
| 62 var savedArgs = new SaveMockArguments(); | |
| 63 this.mockHandler.stubs().getPreview(savedArgs.match(NOT_NULL)). | |
| 64 will(callFunctionWithSavedArgs(savedArgs, function(args) { | |
| 65 updatePrintPreview(1, JSON.parse(args[0]).requestID); | |
| 66 })); | |
| 67 | 47 |
| 68 this.mockHandler.stubs().getPrinters(). | 48 function CloudPrintInterfaceStub() { |
| 69 will(callFunction(function() { | 49 cr.EventTarget.call(this); |
| 70 setPrinters([{ | 50 } |
| 71 printerName: 'FooName', | 51 CloudPrintInterfaceStub.prototype = { |
| 72 deviceName: 'FooDevice', | 52 __proto__: cr.EventTarget.prototype, |
| 73 }, { | 53 search: function(isRecent) {} |
| 74 printerName: 'BarName', | 54 }; |
| 75 deviceName: 'BarDevice', | 55 var oldCpInterfaceEventType = cloudprint.CloudPrintInterface.EventType; |
| 76 }, | 56 cloudprint.CloudPrintInterface = CloudPrintInterfaceStub; |
| 77 ]); | 57 cloudprint.CloudPrintInterface.EventType = oldCpInterfaceEventType; |
| 78 })); | |
| 79 | 58 |
| 80 this.makeAndRegisterMockGlobals(['updateWithPrinterCapabilities']); | 59 print_preview.PreviewArea.prototype.checkPluginCompatibility_ = |
| 81 this.mockGlobals.stubs().updateWithPrinterCapabilities( | 60 function() { |
| 82 savedArgs.match(ANYTHING)). | 61 return false; |
| 83 will(callGlobalWithSavedArgs( | 62 }; |
| 84 savedArgs, 'updateWithPrinterCapabilities')); | 63 }.bind(this)); |
| 85 | |
| 86 // Override checkCompatiblePluginExists to return a value consistent with | |
| 87 // the state being tested and stub out the pdf viewer if it doesn't exist, | |
| 88 // such as on non-official builds. When the plugin exists, use the real | |
| 89 // thing. | |
| 90 var self = this; | |
| 91 window.addEventListener('DOMContentLoaded', function() { | |
| 92 if (!this.checkCompatiblePluginExists()) { | |
| 93 // TODO(scr) remove this after tests pass consistently. | |
| 94 console.info('no PDF Plugin; providing fake methods.'); | |
| 95 | |
| 96 // Initializing |previewArea| object here because we need to replace a | |
| 97 // method. | |
| 98 this.previewArea = print_preview.PreviewArea.getInstance(); | |
| 99 this.previewArea.createOrReloadPDFPlugin = | |
| 100 self.createOrReloadPDFPlugin.bind(previewArea); | |
| 101 } | |
| 102 | |
| 103 this.checkCompatiblePluginExists = | |
| 104 self.checkCompatiblePluginExists; | |
| 105 }); | |
| 106 }, | 64 }, |
| 107 | 65 |
| 108 /** | 66 /** |
| 109 * Generate a real C++ class; don't typedef. | 67 * Generate a real C++ class; don't typedef. |
| 110 * @type {?string} | 68 * @type {?string} |
| 111 * @override | 69 * @override |
| 112 */ | 70 */ |
| 113 typedefCppFixture: null, | 71 typedefCppFixture: null, |
| 114 | 72 |
| 115 /** | 73 /** |
| 116 * Create the PDF plugin or reload the existing one. This function replaces | |
| 117 * createOrReloadPDFPlugin defined in | |
| 118 * chrome/browser/resources/print_preview/preview_area.js when there is no | |
| 119 * official pdf plugin so that the WebUI logic can be tested. It creates and | |
| 120 * attaches an HTMLDivElement to the |mainview| element with attributes and | |
| 121 * empty methods, which are used by testing and that would be provided by the | |
| 122 * HTMLEmbedElement when the PDF plugin exists. | |
| 123 * @param {number} srcDataIndex Preview data source index. | |
| 124 * @this {PrintPreviewWebUITest} | 74 * @this {PrintPreviewWebUITest} |
| 75 * @override | |
| 125 */ | 76 */ |
| 126 createOrReloadPDFPlugin: function(srcDataIndex) { | 77 setUp: function() { |
| 127 var pdfViewer = $('pdf-viewer'); | 78 Mock4JS.clearMocksToVerify(); |
| 128 if (pdfViewer) | |
| 129 return; | |
| 130 | 79 |
| 131 var previewUid = 1; | 80 this.initialSettings_ = new print_preview.NativeInitialSettings( |
| 132 pdfViewer = document.createElement('div'); | 81 false /*isInKioskAutoPrintMode*/, |
| 133 pdfViewer.setAttribute('id', 'pdf-viewer'); | 82 ',' /*thousandsDelimeter*/, |
| 134 pdfViewer.setAttribute('type', | 83 '.' /*decimalDelimeter*/, |
| 135 'application/x-google-chrome-print-preview-pdf'); | 84 1 /*unitType*/, |
| 136 pdfViewer.setAttribute( | 85 true /*isDocumentModifiable*/, |
| 137 'src', | 86 0 /*marginsType*/, |
| 138 'chrome://print/' + previewUid + '/' + srcDataIndex + '/print.pdf'); | 87 null /*customMargins*/, |
| 139 pdfViewer.setAttribute('aria-live', 'polite'); | 88 true /*isDuplexEnabled*/, |
| 140 pdfViewer.setAttribute('aria-atomic', 'true'); | 89 false /*isHeaderFooterEnabled*/, |
| 141 function fakeFunction() {} | 90 'FooDevice' /*initialDestinationId*/); |
| 142 pdfViewer.onload = fakeFunction; | 91 this.localDestinationInfos_ = [ |
| 143 pdfViewer.goToPage = fakeFunction; | 92 { printerName: 'FooName', deviceName: 'FooDevice' }, |
| 144 pdfViewer.removePrintButton = fakeFunction; | 93 { printerName: 'BarName', deviceName: 'BarDevice' } |
| 145 pdfViewer.fitToHeight = fakeFunction; | 94 ]; |
| 146 pdfViewer.grayscale = fakeFunction; | 95 } |
| 147 pdfViewer.getZoomLevel = fakeFunction; | |
| 148 pdfViewer.setZoomLevel = fakeFunction; | |
| 149 pdfViewer.pageXOffset = fakeFunction; | |
| 150 pdfViewer.pageYOffset = fakeFunction; | |
| 151 pdfViewer.setPageNumbers = fakeFunction; | |
| 152 pdfViewer.setPageXOffset = fakeFunction; | |
| 153 pdfViewer.setPageYOffset = fakeFunction; | |
| 154 pdfViewer.getHeight = fakeFunction; | |
| 155 pdfViewer.getWidth = fakeFunction; | |
| 156 pdfViewer.getPageLocationNormalized = fakeFunction; | |
| 157 pdfViewer.onScroll = fakeFunction; | |
| 158 pdfViewer.onPluginSizeChanged = fakeFunction; | |
| 159 pdfViewer.getHorizontalScrollbarThickness = fakeFunction; | |
| 160 pdfViewer.getVerticalScrollbarThickness = fakeFunction; | |
| 161 $('mainview').appendChild(pdfViewer); | |
| 162 this.pdfPlugin_ = pdfViewer; | |
| 163 onPDFLoad(); | |
| 164 }, | |
| 165 | |
| 166 /** | |
| 167 * Always return true so tests run on systems without plugin available. | |
| 168 * @return {boolean} Always true. | |
| 169 */ | |
| 170 checkCompatiblePluginExists: function() { | |
| 171 return true; | |
| 172 }, | |
| 173 }; | 96 }; |
| 174 | 97 |
| 175 GEN('#include "chrome/test/data/webui/print_preview.h"'); | 98 GEN('#include "chrome/test/data/webui/print_preview.h"'); |
| 176 | 99 |
| 177 /** | |
| 178 * The expected length of the |printer-list| element. | |
| 179 * @type {number} | |
| 180 * @const | |
| 181 */ | |
| 182 var printerListMinLength = 2; | |
| 183 | |
| 184 /** | |
| 185 * The expected index of the "foo" printer returned by the stubbed handler. | |
| 186 * @type {number} | |
| 187 * @const | |
| 188 */ | |
| 189 var fooIndex = 0; | |
| 190 | |
| 191 /** | |
| 192 * The expected index of the "bar" printer returned by the stubbed handler. | |
| 193 * @type {number} | |
| 194 * @const | |
| 195 */ | |
| 196 var barIndex = 1; | |
| 197 | |
| 198 /** | |
| 199 * The expected "Save as PDF" option text returned by the stubbed handler. | |
| 200 * @type {string} | |
| 201 * @const | |
| 202 */ | |
| 203 var saveAsPDFOptionStr = 'Save as PDF'; | |
| 204 | |
| 205 // Test some basic assumptions about the print preview WebUI. | 100 // Test some basic assumptions about the print preview WebUI. |
| 206 TEST_F('PrintPreviewWebUITest', 'TestPrinterList', function() { | 101 TEST_F('PrintPreviewWebUITest', 'TestPrinterList', function() { |
| 207 var printerList = $('printer-list'); | 102 var initialSettingsSetEvent = |
| 103 new cr.Event(print_preview.NativeLayer.EventType.INITIAL_SETTINGS_SET); | |
| 104 initialSettingsSetEvent.initialSettings = this.initialSettings_; | |
| 105 this.nativeLayer_.dispatchEvent(initialSettingsSetEvent); | |
| 106 | |
| 107 var localDestsSetEvent = | |
| 108 new cr.Event(print_preview.NativeLayer.EventType.LOCAL_DESTINATIONS_SET); | |
| 109 localDestsSetEvent.destinationInfos = this.localDestinationInfos_; | |
| 110 this.nativeLayer_.dispatchEvent(localDestsSetEvent); | |
| 111 | |
| 112 var printerList = $('destination-settings'). | |
| 113 getElementsByClassName('destination-settings-select')[0]; | |
| 208 assertNotEquals(null, printerList); | 114 assertNotEquals(null, printerList); |
| 209 assertGE(printerList.options.length, printerListMinLength); | 115 assertGE(printerList.options.length, 2); |
| 210 expectEquals(fooIndex, printerList.selectedIndex); | 116 expectEquals(0, printerList.selectedIndex); |
| 211 expectEquals('FooName', printerList.options[fooIndex].text, | 117 expectEquals('FooName', printerList.options[0].text, 'fooIndex=0'); |
| 212 'fooIndex=' + fooIndex); | 118 expectEquals('FooDevice', printerList.options[0].value, 'fooIndex=0'); |
| 213 expectEquals('FooDevice', printerList.options[fooIndex].value, | 119 expectEquals('BarName', printerList.options[1].text, 'barIndex=1'); |
|
kmadhusu
2012/05/18 20:13:46
Is there any specific reason to use numbers rather
| |
| 214 'fooIndex=' + fooIndex); | 120 expectEquals('BarDevice', printerList.options[1].value, 'barIndex=1'); |
| 215 expectEquals('BarName', printerList.options[barIndex].text, | |
| 216 'barIndex=' + barIndex); | |
| 217 expectEquals('BarDevice', printerList.options[barIndex].value, | |
| 218 'barIndex=' + barIndex); | |
| 219 }); | 121 }); |
| 220 | 122 |
| 221 // Test that the printer list is structured correctly after calling | 123 // Test that the printer list is structured correctly after calling |
| 222 // addCloudPrinters with an empty list. | 124 // addCloudPrinters with an empty list. |
| 223 TEST_F('PrintPreviewWebUITest', 'TestPrinterListCloudEmpty', function() { | 125 TEST_F('PrintPreviewWebUITest', 'TestPrinterListCloudEmpty', function() { |
| 224 cloudprint.addCloudPrinters([], addDestinationListOptionAtPosition); | 126 var initialSettingsSetEvent = |
| 225 var printerList = $('printer-list'); | 127 new cr.Event(print_preview.NativeLayer.EventType.INITIAL_SETTINGS_SET); |
| 128 initialSettingsSetEvent.initialSettings = this.initialSettings_; | |
| 129 this.nativeLayer_.dispatchEvent(initialSettingsSetEvent); | |
| 130 | |
| 131 var localDestsSetEvent = | |
| 132 new cr.Event(print_preview.NativeLayer.EventType.LOCAL_DESTINATIONS_SET); | |
| 133 localDestsSetEvent.destinationInfos = this.localDestinationInfos_; | |
| 134 this.nativeLayer_.dispatchEvent(localDestsSetEvent); | |
| 135 | |
| 136 var cloudPrintEnableEvent = | |
| 137 new cr.Event(print_preview.NativeLayer.EventType.CLOUD_PRINT_ENABLE); | |
| 138 cloudPrintEnableEvent.baseCloudPrintUrl = 'cloudprint url'; | |
| 139 this.nativeLayer_.dispatchEvent(cloudPrintEnableEvent); | |
| 140 | |
| 141 var searchDoneEvent = | |
| 142 new cr.Event(cloudprint.CloudPrintInterface.EventType.SEARCH_DONE); | |
| 143 searchDoneEvent.printers = []; | |
| 144 searchDoneEvent.isRecent = true; | |
| 145 searchDoneEvent.email = 'foo@chromium.org'; | |
| 146 printPreview.cloudPrintInterface_.dispatchEvent(searchDoneEvent); | |
| 147 | |
| 148 var printerList = $('destination-settings'). | |
| 149 getElementsByClassName('destination-settings-select')[0]; | |
| 226 assertNotEquals(null, printerList); | 150 assertNotEquals(null, printerList); |
| 227 }); | 151 assertGE(printerList.options.length, 2); |
| 228 | 152 expectEquals(0, printerList.selectedIndex); |
| 229 // Test that the printer list is structured correctly after attempting to add | 153 expectEquals('FooName', printerList.options[0].text, 'fooIndex=0'); |
| 230 // individual cloud printers until no more can be added. | 154 expectEquals('FooDevice', printerList.options[0].value, 'fooIndex=0'); |
| 231 TEST_F('PrintPreviewWebUITest', 'TestPrinterListCloud', function() { | 155 expectEquals('BarName', printerList.options[1].text, 'barIndex=1'); |
| 232 var printerList = $('printer-list'); | 156 expectEquals('BarDevice', printerList.options[1].value, 'barIndex=1'); |
| 233 assertNotEquals(null, printerList); | |
| 234 var printer = new Object; | |
| 235 printer['name'] = 'FooCloud'; | |
| 236 for (var i = 0; i < maxCloudPrinters; i++) { | |
| 237 printer['id'] = String(i); | |
| 238 cloudprint.addCloudPrinters([printer], addDestinationListOptionAtPosition); | |
| 239 expectEquals('FooCloud', printerList.options[i].text); | |
| 240 expectEquals(String(i), printerList.options[i].value); | |
| 241 } | |
| 242 cloudprint.addCloudPrinters([printer], addDestinationListOptionAtPosition); | |
| 243 expectNotEquals('FooCloud', printerList.options[i].text); | |
| 244 expectNotEquals(String(i), printerList.options[i].value); | |
| 245 for (var i = 0; i < maxCloudPrinters; i++) { | |
| 246 expectEquals('FooCloud', printerList.options[i].text); | |
| 247 expectEquals(String(i), printerList.options[i].value); | |
| 248 } | |
| 249 }); | 157 }); |
| 250 | 158 |
| 251 /** | 159 /** |
| 252 * Verify that |section| visibility matches |visible|. | 160 * Verify that |section| visibility matches |visible|. |
| 253 * @param {HTMLDivElement} section The section to check. | 161 * @param {HTMLDivElement} section The section to check. |
| 254 * @param {boolean} visible The expected state of visibility. | 162 * @param {boolean} visible The expected state of visibility. |
| 255 */ | 163 */ |
| 256 function checkSectionVisible(section, visible) { | 164 function checkSectionVisible(section, visible) { |
| 257 assertNotEquals(null, section); | 165 assertNotEquals(null, section); |
| 258 expectEquals(section.classList.contains('visible'), visible, | 166 expectEquals( |
| 259 'section=' + section); | 167 visible, section.classList.contains('visible'), 'section=' + section.id); |
| 260 } | 168 } |
| 261 | 169 |
| 262 /** | 170 function checkElementDisplayed(el, isDisplayed) { |
| 263 * Verify that |section| style display matches |value|. | 171 assertNotEquals(null, el); |
| 264 * @param {HTMLDivElement} section The section to check. | 172 expectEquals(isDisplayed, el.style.display != 'none'); |
| 265 * @param {string} value The expected display style value. | |
| 266 */ | |
| 267 function checkSectionDisplayStyle(section, value) { | |
| 268 assertNotEquals(null, section); | |
| 269 expectEquals(section.style.display, value, 'section=' + section); | |
| 270 } | 173 } |
| 271 | 174 |
| 272 // Test that disabled settings hide the disabled sections. | 175 // Test that disabled settings hide the disabled sections. |
| 273 TEST_F('PrintPreviewWebUITest', 'TestSectionsDisabled', function() { | 176 TEST_F('PrintPreviewWebUITest', 'TestSectionsDisabled', function() { |
| 274 this.mockHandler.expects(once()).getPrinterCapabilities('FooDevice'). | 177 var initialSettingsSetEvent = |
| 275 will(callFunction(function() { | 178 new cr.Event(print_preview.NativeLayer.EventType.INITIAL_SETTINGS_SET); |
| 276 updateWithPrinterCapabilities({ | 179 initialSettingsSetEvent.initialSettings = this.initialSettings_; |
| 277 disableColorOption: true, | 180 this.nativeLayer_.dispatchEvent(initialSettingsSetEvent); |
| 278 setColorAsDefault: true, | 181 |
| 279 disableCopiesOption: true, | 182 var localDestsSetEvent = |
| 280 disableLandscapeOption: true, | 183 new cr.Event(print_preview.NativeLayer.EventType.LOCAL_DESTINATIONS_SET); |
| 281 printerDefaultDuplexValue: print_preview.CopiesSettings.SIMPLEX, | 184 localDestsSetEvent.destinationInfos = this.localDestinationInfos_; |
| 282 }); | 185 this.nativeLayer_.dispatchEvent(localDestsSetEvent); |
| 283 })); | 186 |
| 284 | 187 checkSectionVisible($('layout-settings'), true); |
| 285 updateControlsWithSelectedPrinterCapabilities(); | 188 checkSectionVisible($('color-settings'), true); |
| 286 | 189 checkSectionVisible($('copies-settings'), true); |
| 287 checkSectionVisible(layoutSettings.layoutOption_, false); | 190 |
| 288 checkSectionVisible(colorSettings.colorOption_, false); | 191 var capsSetEvent = |
| 289 checkSectionVisible(copiesSettings.copiesOption_, false); | 192 new cr.Event(print_preview.NativeLayer.EventType.CAPABILITIES_SET); |
| 193 capsSetEvent.settingsInfo = { | |
| 194 'disableColorOption': true, | |
| 195 'setColorAsDefault': true, | |
| 196 'disableCopiesOption': true, | |
| 197 'disableLandscapeOption': true, | |
| 198 'printerDefaultDuplexValue': 0 | |
| 199 }; | |
| 200 this.nativeLayer_.dispatchEvent(capsSetEvent); | |
| 201 | |
| 202 checkSectionVisible($('layout-settings'), false); | |
| 203 checkSectionVisible($('color-settings'), false); | |
| 204 checkSectionVisible($('copies-settings'), false); | |
| 290 }); | 205 }); |
| 291 | 206 |
| 292 // When the source is 'PDF' and 'Save as PDF' option is selected, we hide the | 207 // When the source is 'PDF' and 'Save as PDF' option is selected, we hide the |
| 293 // fit to page option. | 208 // fit to page option. |
| 294 TEST_F('PrintPreviewWebUITest', 'PrintToPDFSelectedHideFitToPageOption', | 209 TEST_F( |
| 295 function() { | 210 'PrintPreviewWebUITest', |
| 296 var savedArgs = new SaveMockArguments(); | 211 'PrintToPDFSelectedHideFitToPageOption', |
| 297 this.mockHandler.expects(once()).getPreview(savedArgs.match(ANYTHING)). | 212 function() { |
| 298 will(callFunctionWithSavedArgs(savedArgs, function(args) { | 213 // Add PDF printer. |
| 299 updatePrintPreview(2, JSON.parse(args[0]).requestID); | 214 this.initialSettings_.isDocumentModifiable_ = false; |
| 300 })); | 215 this.initialSettings_.initialDestinationId_ = 'Save as PDF'; |
| 301 | 216 this.localDestinationInfos_.push( |
| 302 this.mockGlobals.expects(once()).updateWithPrinterCapabilities( | 217 {printerName: 'Save as PDF', deviceName: 'Save as PDF'}); |
| 303 savedArgs.match(ANYTHING)). | 218 |
| 304 will(callGlobalWithSavedArgs( | 219 var initialSettingsSetEvent = |
| 305 savedArgs, 'updateWithPrinterCapabilities')); | 220 new cr.Event(print_preview.NativeLayer.EventType.INITIAL_SETTINGS_SET); |
| 306 | 221 initialSettingsSetEvent.initialSettings = this.initialSettings_; |
| 307 setInitialSettings({previewModifiable: false}); | 222 this.nativeLayer_.dispatchEvent(initialSettingsSetEvent); |
| 308 var printerList = $('printer-list'); | 223 |
| 309 assertNotEquals(null, printerList, 'printerList'); | 224 var localDestsSetEvent = |
| 310 assertGE(printerList.options.length, printerListMinLength); | 225 new cr.Event(print_preview.NativeLayer.EventType.LOCAL_DESTINATIONS_SET); |
| 311 for (var i = 0; i < printerList.options.length; i++) { | 226 localDestsSetEvent.destinationInfos = this.localDestinationInfos_; |
| 312 if (printerList.options[i].text == saveAsPDFOptionStr && | 227 this.nativeLayer_.dispatchEvent(localDestsSetEvent); |
| 313 printerList.options[i].value == saveAsPDFOptionStr) { | 228 |
| 314 printerList.selectedIndex = i; | 229 var capsSetEvent = |
| 230 new cr.Event(print_preview.NativeLayer.EventType.CAPABILITIES_SET); | |
| 231 capsSetEvent.settingsInfo = { | |
| 232 'disableColorOption': false, | |
| 233 'setColorAsDefault': true, | |
| 234 'disableCopiesOption': true, | |
| 235 'disableLandscapeOption': true, | |
| 236 'printerDefaultDuplexValue': 0 | |
| 237 }; | |
| 238 this.nativeLayer_.dispatchEvent(capsSetEvent); | |
| 239 | |
| 240 checkElementDisplayed( | |
| 241 $('other-options-settings'). | |
| 242 querySelector('.other-options-settings-fit-to-page'), | |
| 243 false); | |
| 244 }); | |
| 245 | |
| 246 // When the source is 'HTML', we always hide the fit to page option. | |
| 247 TEST_F('PrintPreviewWebUITest', 'SourceIsHTMLHideFitToPageOption', function() { | |
| 248 var initialSettingsSetEvent = | |
| 249 new cr.Event(print_preview.NativeLayer.EventType.INITIAL_SETTINGS_SET); | |
| 250 initialSettingsSetEvent.initialSettings = this.initialSettings_; | |
| 251 this.nativeLayer_.dispatchEvent(initialSettingsSetEvent); | |
| 252 | |
| 253 var localDestsSetEvent = | |
| 254 new cr.Event(print_preview.NativeLayer.EventType.LOCAL_DESTINATIONS_SET); | |
| 255 localDestsSetEvent.destinationInfos = this.localDestinationInfos_; | |
| 256 this.nativeLayer_.dispatchEvent(localDestsSetEvent); | |
| 257 | |
| 258 var capsSetEvent = | |
| 259 new cr.Event(print_preview.NativeLayer.EventType.CAPABILITIES_SET); | |
| 260 capsSetEvent.settingsInfo = { | |
| 261 'disableColorOption': false, | |
| 262 'setColorAsDefault': true, | |
| 263 'disableCopiesOption': true, | |
| 264 'disableLandscapeOption': true, | |
| 265 'printerDefaultDuplexValue': 0 | |
| 266 }; | |
| 267 this.nativeLayer_.dispatchEvent(capsSetEvent); | |
| 268 | |
| 269 checkElementDisplayed( | |
| 270 $('other-options-settings'). | |
| 271 querySelector('.other-options-settings-fit-to-page'), | |
| 272 false); | |
| 273 }); | |
| 274 | |
| 275 // When the source is "PDF", depending on the selected destination printer, we | |
| 276 // show/hide the fit to page option. | |
| 277 TEST_F('PrintPreviewWebUITest', 'SourceIsPDFShowFitToPageOption', function() { | |
| 278 this.initialSettings_.isDocumentModifiable_ = false; | |
| 279 | |
| 280 var initialSettingsSetEvent = | |
| 281 new cr.Event(print_preview.NativeLayer.EventType.INITIAL_SETTINGS_SET); | |
| 282 initialSettingsSetEvent.initialSettings = this.initialSettings_; | |
| 283 this.nativeLayer_.dispatchEvent(initialSettingsSetEvent); | |
| 284 | |
| 285 var localDestsSetEvent = | |
| 286 new cr.Event(print_preview.NativeLayer.EventType.LOCAL_DESTINATIONS_SET); | |
| 287 localDestsSetEvent.destinationInfos = this.localDestinationInfos_; | |
| 288 this.nativeLayer_.dispatchEvent(localDestsSetEvent); | |
| 289 | |
| 290 var capsSetEvent = | |
| 291 new cr.Event(print_preview.NativeLayer.EventType.CAPABILITIES_SET); | |
| 292 capsSetEvent.settingsInfo = { | |
| 293 'disableColorOption': false, | |
| 294 'setColorAsDefault': true, | |
| 295 'disableCopiesOption': true, | |
| 296 'disableLandscapeOption': true, | |
| 297 'printerDefaultDuplexValue': 0 | |
| 298 }; | |
| 299 this.nativeLayer_.dispatchEvent(capsSetEvent); | |
| 300 | |
| 301 checkElementDisplayed( | |
| 302 $('other-options-settings'). | |
| 303 querySelector('.other-options-settings-fit-to-page'), | |
| 304 true); | |
| 305 expectTrue( | |
| 306 $('other-options-settings').querySelector( | |
| 307 '.other-options-settings-fit-to-page-checkbox').checked); | |
| 308 }); | |
| 309 | |
| 310 // When the print scaling is disabled for the source "PDF", we show the fit | |
| 311 // to page option but the state is unchecked by default. | |
| 312 TEST_F('PrintPreviewWebUITest', 'PrintScalingDisabledForPlugin', function() { | |
| 313 this.initialSettings_.isDocumentModifiable_ = false; | |
| 314 | |
| 315 var initialSettingsSetEvent = | |
| 316 new cr.Event(print_preview.NativeLayer.EventType.INITIAL_SETTINGS_SET); | |
| 317 initialSettingsSetEvent.initialSettings = this.initialSettings_; | |
| 318 this.nativeLayer_.dispatchEvent(initialSettingsSetEvent); | |
| 319 | |
| 320 var localDestsSetEvent = | |
| 321 new cr.Event(print_preview.NativeLayer.EventType.LOCAL_DESTINATIONS_SET); | |
| 322 localDestsSetEvent.destinationInfos = this.localDestinationInfos_; | |
| 323 this.nativeLayer_.dispatchEvent(localDestsSetEvent); | |
| 324 | |
| 325 var capsSetEvent = | |
| 326 new cr.Event(print_preview.NativeLayer.EventType.CAPABILITIES_SET); | |
| 327 capsSetEvent.settingsInfo = { | |
| 328 'disableColorOption': false, | |
| 329 'setColorAsDefault': true, | |
| 330 'disableCopiesOption': true, | |
| 331 'disableLandscapeOption': true, | |
| 332 'printerDefaultDuplexValue': 0 | |
| 333 }; | |
| 334 this.nativeLayer_.dispatchEvent(capsSetEvent); | |
| 335 | |
| 336 // Indicate that the PDF does not support scaling by default. | |
| 337 cr.dispatchSimpleEvent( | |
| 338 this.nativeLayer_, print_preview.NativeLayer.EventType.DISABLE_SCALING); | |
| 339 | |
| 340 checkElementDisplayed( | |
| 341 $('other-options-settings'). | |
| 342 querySelector('.other-options-settings-fit-to-page'), | |
| 343 true); | |
| 344 expectFalse( | |
| 345 $('other-options-settings').querySelector( | |
| 346 '.other-options-settings-fit-to-page-checkbox').checked); | |
| 347 }); | |
| 348 | |
| 349 // Page layout has zero margins. Hide header and footer option. | |
| 350 TEST_F( | |
| 351 'PrintPreviewWebUITest', | |
| 352 'PageLayoutHasNoMarginsHideHeaderFooter', | |
| 353 function() { | |
| 354 var initialSettingsSetEvent = | |
| 355 new cr.Event(print_preview.NativeLayer.EventType.INITIAL_SETTINGS_SET); | |
| 356 initialSettingsSetEvent.initialSettings = this.initialSettings_; | |
| 357 this.nativeLayer_.dispatchEvent(initialSettingsSetEvent); | |
| 358 | |
| 359 var localDestsSetEvent = | |
| 360 new cr.Event(print_preview.NativeLayer.EventType.LOCAL_DESTINATIONS_SET); | |
| 361 localDestsSetEvent.destinationInfos = this.localDestinationInfos_; | |
| 362 this.nativeLayer_.dispatchEvent(localDestsSetEvent); | |
| 363 | |
| 364 var capsSetEvent = | |
| 365 new cr.Event(print_preview.NativeLayer.EventType.CAPABILITIES_SET); | |
| 366 capsSetEvent.settingsInfo = { | |
| 367 'disableColorOption': false, | |
| 368 'setColorAsDefault': true, | |
| 369 'disableCopiesOption': true, | |
| 370 'disableLandscapeOption': true, | |
| 371 'printerDefaultDuplexValue': 0 | |
| 372 }; | |
| 373 this.nativeLayer_.dispatchEvent(capsSetEvent); | |
| 374 | |
| 375 checkElementDisplayed( | |
| 376 $('other-options-settings'). | |
| 377 querySelector('.other-options-settings-header-footer'), | |
| 378 true); | |
| 379 | |
| 380 printPreview.printTicketStore_.updateMarginsType( | |
| 381 print_preview.ticket_items.MarginsType.Value.CUSTOM); | |
| 382 printPreview.printTicketStore_.updateCustomMargins( | |
| 383 new print_preview.Margins(0, 0, 0, 0)); | |
| 384 | |
| 385 checkElementDisplayed( | |
| 386 $('other-options-settings'). | |
| 387 querySelector('.other-options-settings-header-footer'), | |
| 388 false); | |
| 389 }); | |
| 390 | |
| 391 // Page layout has half-inch margins. Show header and footer option. | |
| 392 TEST_F( | |
| 393 'PrintPreviewWebUITest', | |
|
kmadhusu
2012/05/18 20:13:46
nit: This argument can go to line 392.
| |
| 394 'PageLayoutHasMarginsShowHeaderFooter', | |
| 395 function() { | |
| 396 var initialSettingsSetEvent = | |
| 397 new cr.Event(print_preview.NativeLayer.EventType.INITIAL_SETTINGS_SET); | |
| 398 initialSettingsSetEvent.initialSettings = this.initialSettings_; | |
| 399 this.nativeLayer_.dispatchEvent(initialSettingsSetEvent); | |
| 400 | |
| 401 var localDestsSetEvent = | |
| 402 new cr.Event(print_preview.NativeLayer.EventType.LOCAL_DESTINATIONS_SET); | |
| 403 localDestsSetEvent.destinationInfos = this.localDestinationInfos_; | |
| 404 this.nativeLayer_.dispatchEvent(localDestsSetEvent); | |
| 405 | |
| 406 var capsSetEvent = | |
| 407 new cr.Event(print_preview.NativeLayer.EventType.CAPABILITIES_SET); | |
| 408 capsSetEvent.settingsInfo = { | |
| 409 'disableColorOption': false, | |
| 410 'setColorAsDefault': true, | |
| 411 'disableCopiesOption': true, | |
| 412 'disableLandscapeOption': true, | |
| 413 'printerDefaultDuplexValue': 0 | |
| 414 }; | |
| 415 this.nativeLayer_.dispatchEvent(capsSetEvent); | |
| 416 | |
| 417 checkElementDisplayed( | |
| 418 $('other-options-settings'). | |
| 419 querySelector('.other-options-settings-header-footer'), | |
| 420 true); | |
| 421 | |
| 422 printPreview.printTicketStore_.updateMarginsType( | |
| 423 print_preview.ticket_items.MarginsType.Value.CUSTOM); | |
| 424 printPreview.printTicketStore_.updateCustomMargins( | |
| 425 new print_preview.Margins(36, 36, 36, 36)); | |
| 426 | |
| 427 checkElementDisplayed( | |
| 428 $('other-options-settings'). | |
| 429 querySelector('.other-options-settings-header-footer'), | |
| 430 true); | |
| 431 }); | |
| 432 | |
| 433 // Page layout has zero top and bottom margins. Hide header and footer option. | |
| 434 TEST_F( | |
| 435 'PrintPreviewWebUITest', | |
| 436 'ZeroTopAndBottomMarginsHideHeaderFooter', | |
| 437 function() { | |
| 438 var initialSettingsSetEvent = | |
| 439 new cr.Event(print_preview.NativeLayer.EventType.INITIAL_SETTINGS_SET); | |
| 440 initialSettingsSetEvent.initialSettings = this.initialSettings_; | |
| 441 this.nativeLayer_.dispatchEvent(initialSettingsSetEvent); | |
| 442 | |
| 443 var localDestsSetEvent = | |
| 444 new cr.Event(print_preview.NativeLayer.EventType.LOCAL_DESTINATIONS_SET); | |
| 445 localDestsSetEvent.destinationInfos = this.localDestinationInfos_; | |
| 446 this.nativeLayer_.dispatchEvent(localDestsSetEvent); | |
| 447 | |
| 448 var capsSetEvent = | |
| 449 new cr.Event(print_preview.NativeLayer.EventType.CAPABILITIES_SET); | |
| 450 capsSetEvent.settingsInfo = { | |
| 451 'disableColorOption': false, | |
| 452 'setColorAsDefault': true, | |
| 453 'disableCopiesOption': true, | |
| 454 'disableLandscapeOption': true, | |
| 455 'printerDefaultDuplexValue': 0 | |
| 456 }; | |
| 457 this.nativeLayer_.dispatchEvent(capsSetEvent); | |
| 458 | |
| 459 checkElementDisplayed( | |
| 460 $('other-options-settings'). | |
| 461 querySelector('.other-options-settings-header-footer'), | |
| 462 true); | |
| 463 | |
| 464 printPreview.printTicketStore_.updateMarginsType( | |
| 465 print_preview.ticket_items.MarginsType.Value.CUSTOM); | |
| 466 printPreview.printTicketStore_.updateCustomMargins( | |
| 467 new print_preview.Margins(0, 36, 0, 36)); | |
| 468 | |
| 469 checkElementDisplayed( | |
| 470 $('other-options-settings'). | |
| 471 querySelector('.other-options-settings-header-footer'), | |
| 472 false); | |
| 473 }); | |
| 474 | |
| 475 // Page layout has zero top and half-inch bottom margin. Show header and footer | |
| 476 // option. | |
| 477 TEST_F( | |
| 478 'PrintPreviewWebUITest', | |
| 479 'ZeroTopAndNonZeroBottomMarginShowHeaderFooter', | |
| 480 function() { | |
| 481 var initialSettingsSetEvent = | |
| 482 new cr.Event(print_preview.NativeLayer.EventType.INITIAL_SETTINGS_SET); | |
| 483 initialSettingsSetEvent.initialSettings = this.initialSettings_; | |
| 484 this.nativeLayer_.dispatchEvent(initialSettingsSetEvent); | |
| 485 | |
| 486 var localDestsSetEvent = | |
| 487 new cr.Event(print_preview.NativeLayer.EventType.LOCAL_DESTINATIONS_SET); | |
| 488 localDestsSetEvent.destinationInfos = this.localDestinationInfos_; | |
| 489 this.nativeLayer_.dispatchEvent(localDestsSetEvent); | |
| 490 | |
| 491 var capsSetEvent = | |
| 492 new cr.Event(print_preview.NativeLayer.EventType.CAPABILITIES_SET); | |
| 493 capsSetEvent.settingsInfo = { | |
| 494 'disableColorOption': false, | |
| 495 'setColorAsDefault': true, | |
| 496 'disableCopiesOption': true, | |
| 497 'disableLandscapeOption': true, | |
| 498 'printerDefaultDuplexValue': 0 | |
| 499 }; | |
| 500 this.nativeLayer_.dispatchEvent(capsSetEvent); | |
| 501 | |
| 502 checkElementDisplayed( | |
| 503 $('other-options-settings'). | |
| 504 querySelector('.other-options-settings-header-footer'), | |
| 505 true); | |
| 506 | |
| 507 printPreview.printTicketStore_.updateMarginsType( | |
| 508 print_preview.ticket_items.MarginsType.Value.CUSTOM); | |
| 509 printPreview.printTicketStore_.updateCustomMargins( | |
| 510 new print_preview.Margins(0, 36, 36, 36)); | |
| 511 | |
| 512 checkElementDisplayed( | |
| 513 $('other-options-settings'). | |
| 514 querySelector('.other-options-settings-header-footer'), | |
| 515 true); | |
| 516 }); | |
| 517 | |
| 518 // Test that the color settings are set according to the printer capabilities. | |
| 519 TEST_F('PrintPreviewWebUITest', 'TestColorSettings', function() { | |
| 520 var initialSettingsSetEvent = | |
| 521 new cr.Event(print_preview.NativeLayer.EventType.INITIAL_SETTINGS_SET); | |
| 522 initialSettingsSetEvent.initialSettings = this.initialSettings_; | |
| 523 this.nativeLayer_.dispatchEvent(initialSettingsSetEvent); | |
| 524 | |
| 525 var localDestsSetEvent = | |
| 526 new cr.Event(print_preview.NativeLayer.EventType.LOCAL_DESTINATIONS_SET); | |
| 527 localDestsSetEvent.destinationInfos = this.localDestinationInfos_; | |
| 528 this.nativeLayer_.dispatchEvent(localDestsSetEvent); | |
| 529 | |
| 530 checkSectionVisible($('color-settings'), true); | |
| 531 | |
| 532 var capsSetEvent = | |
| 533 new cr.Event(print_preview.NativeLayer.EventType.CAPABILITIES_SET); | |
| 534 capsSetEvent.settingsInfo = { | |
| 535 'disableColorOption': false, | |
| 536 'setColorAsDefault': true, | |
| 537 'disableCopiesOption': true, | |
| 538 'disableLandscapeOption': true, | |
| 539 'printerDefaultDuplexValue': 0 | |
| 540 }; | |
| 541 this.nativeLayer_.dispatchEvent(capsSetEvent); | |
| 542 | |
| 543 checkSectionVisible($('color-settings'), true); | |
| 544 | |
| 545 var colorOption = $('color-settings').getElementsByClassName( | |
| 546 'color-settings-color-option')[0]; | |
| 547 var bwOption = $('color-settings').getElementsByClassName( | |
| 548 'color-settings-bw-option')[0]; | |
| 549 expectTrue(colorOption.checked); | |
| 550 expectFalse(bwOption.checked); | |
| 551 | |
| 552 var capsSetEvent = | |
| 553 new cr.Event(print_preview.NativeLayer.EventType.CAPABILITIES_SET); | |
| 554 capsSetEvent.settingsInfo = { | |
| 555 'disableColorOption': false, | |
| 556 'setColorAsDefault': false, | |
| 557 'disableCopiesOption': false, | |
| 558 'disableLandscapeOption': false, | |
| 559 'printerDefaultDuplexValue': 0 | |
| 560 }; | |
| 561 this.nativeLayer_.dispatchEvent(capsSetEvent); | |
| 562 | |
| 563 checkSectionVisible($('color-settings'), true); | |
| 564 expectFalse(colorOption.checked); | |
| 565 expectTrue(bwOption.checked); | |
| 566 }); | |
| 567 | |
| 568 // Test to verify that duplex settings are set according to the printer | |
| 569 // capabilities. | |
| 570 TEST_F('PrintPreviewWebUITest', 'TestDuplexSettings', function() { | |
| 571 var initialSettingsSetEvent = | |
| 572 new cr.Event(print_preview.NativeLayer.EventType.INITIAL_SETTINGS_SET); | |
| 573 // Need to override test defaults for the initial settings, because initial | |
| 574 // duplex value needs to be unspecified. | |
| 575 initialSettingsSetEvent.initialSettings = | |
| 576 new print_preview.NativeInitialSettings( | |
| 577 false /*isInKioskAutoPrintMode*/, | |
| 578 ',' /*thousandsDelimeter*/, | |
| 579 '.' /*decimalDelimeter*/, | |
| 580 1 /*unitType*/, | |
| 581 true /*isDocumentModifiable*/, | |
| 582 0 /*marginsType*/, | |
| 583 null /*customMargins*/, | |
| 584 null /*isDuplexEnabled*/, | |
| 585 false /*isHeaderFooterEnabled*/, | |
| 586 'FooDevice' /*initialDestinationId*/); | |
| 587 this.nativeLayer_.dispatchEvent(initialSettingsSetEvent); | |
| 588 | |
| 589 var localDestsSetEvent = | |
| 590 new cr.Event(print_preview.NativeLayer.EventType.LOCAL_DESTINATIONS_SET); | |
| 591 localDestsSetEvent.destinationInfos = this.localDestinationInfos_; | |
| 592 this.nativeLayer_.dispatchEvent(localDestsSetEvent); | |
| 593 | |
| 594 var copiesDiv = $('copies-settings'); | |
| 595 var duplexDiv = copiesDiv.getElementsByClassName('copies-settings-duplex')[0]; | |
| 596 var duplexCheckbox = copiesDiv.getElementsByClassName( | |
| 597 'copies-settings-duplex-checkbox')[0]; | |
| 598 | |
| 599 var capsSetEvent = | |
| 600 new cr.Event(print_preview.NativeLayer.EventType.CAPABILITIES_SET); | |
| 601 capsSetEvent.settingsInfo = { | |
| 602 'disableColorOption': false, | |
| 603 'setColorAsDefault': true, | |
| 604 'disableCopiesOption': false, | |
| 605 'disableLandscapeOption': true, | |
| 606 'printerDefaultDuplexValue': 0 | |
| 607 }; | |
| 608 this.nativeLayer_.dispatchEvent(capsSetEvent); | |
| 609 | |
| 610 checkSectionVisible(copiesDiv, true); | |
| 611 expectFalse(duplexDiv.hidden); | |
| 612 expectFalse(duplexCheckbox.checked); | |
| 613 | |
| 614 // If the printer default duplex value is UNKNOWN_DUPLEX_MODE, hide the | |
| 615 // two sided option. | |
| 616 var capsSetEvent = | |
| 617 new cr.Event(print_preview.NativeLayer.EventType.CAPABILITIES_SET); | |
| 618 capsSetEvent.settingsInfo = { | |
| 619 'disableColorOption': false, | |
| 620 'setColorAsDefault': false, | |
| 621 'disableCopiesOption': false, | |
| 622 'disableLandscapeOption': false, | |
| 623 'printerDefaultDuplexValue': -1 | |
| 624 }; | |
| 625 this.nativeLayer_.dispatchEvent(capsSetEvent); | |
| 626 | |
| 627 checkSectionVisible(copiesDiv, true); | |
| 628 expectTrue(duplexDiv.hidden); | |
| 629 | |
| 630 var capsSetEvent = | |
| 631 new cr.Event(print_preview.NativeLayer.EventType.CAPABILITIES_SET); | |
| 632 capsSetEvent.settingsInfo = { | |
| 633 'disableColorOption': false, | |
| 634 'setColorAsDefault': false, | |
| 635 'disableCopiesOption': false, | |
| 636 'disableLandscapeOption': false, | |
| 637 'printerDefaultDuplexValue': 1 | |
| 638 }; | |
| 639 this.nativeLayer_.dispatchEvent(capsSetEvent); | |
| 640 | |
| 641 checkSectionVisible(copiesDiv, true); | |
| 642 expectFalse(duplexDiv.hidden); | |
| 643 expectTrue(duplexCheckbox.checked); | |
| 644 }); | |
| 645 | |
| 646 // Test that changing the selected printer updates the preview. | |
| 647 TEST_F('PrintPreviewWebUITest', 'TestPrinterChangeUpdatesPreview', function() { | |
| 648 | |
| 649 var initialSettingsSetEvent = | |
| 650 new cr.Event(print_preview.NativeLayer.EventType.INITIAL_SETTINGS_SET); | |
| 651 initialSettingsSetEvent.initialSettings = this.initialSettings_; | |
| 652 this.nativeLayer_.dispatchEvent(initialSettingsSetEvent); | |
| 653 | |
| 654 var localDestsSetEvent = | |
| 655 new cr.Event(print_preview.NativeLayer.EventType.LOCAL_DESTINATIONS_SET); | |
| 656 localDestsSetEvent.destinationInfos = this.localDestinationInfos_; | |
| 657 this.nativeLayer_.dispatchEvent(localDestsSetEvent); | |
| 658 | |
| 659 var capsSetEvent = | |
| 660 new cr.Event(print_preview.NativeLayer.EventType.CAPABILITIES_SET); | |
| 661 capsSetEvent.settingsInfo = { | |
| 662 'disableColorOption': false, | |
| 663 'setColorAsDefault': true, | |
| 664 'disableCopiesOption': true, | |
| 665 'disableLandscapeOption': true, | |
| 666 'printerDefaultDuplexValue': 0 | |
| 667 }; | |
| 668 this.nativeLayer_.dispatchEvent(capsSetEvent); | |
| 669 | |
| 670 var previewGenerator = mock(print_preview.PreviewGenerator); | |
| 671 printPreview.previewArea_.previewGenerator_ = previewGenerator.proxy(); | |
| 672 previewGenerator.expects(once()).requestPreview(); | |
| 673 | |
| 674 var barDestination; | |
| 675 var destinations = printPreview.destinationStore_.destinations; | |
| 676 for (var destination, i = 0; destination = destinations[i]; i++) { | |
| 677 if (destination.id == 'BarDevice') { | |
| 678 barDestination = destination; | |
| 315 break; | 679 break; |
| 316 } | 680 } |
| 317 } | 681 } |
| 318 updateControlsWithSelectedPrinterCapabilities(); | 682 |
| 319 checkSectionDisplayStyle(fitToPageSettings.fitToPageOption_, 'none'); | 683 printPreview.destinationStore_.selectDestination(barDestination); |
| 320 }); | 684 |
| 321 | 685 var capsSetEvent = |
| 322 // When the source is 'HTML', we always hide the fit to page option. | 686 new cr.Event(print_preview.NativeLayer.EventType.CAPABILITIES_SET); |
| 323 TEST_F('PrintPreviewWebUITest', 'SourceIsHTMLHideFitToPageOption', function() { | 687 capsSetEvent.settingsInfo = { |
| 324 var savedArgs = new SaveMockArguments(); | 688 'disableColorOption': true, |
| 325 this.mockHandler.expects(once()).getPreview(savedArgs.match(ANYTHING)). | 689 'setColorAsDefault': false, |
| 326 will(callFunctionWithSavedArgs(savedArgs, function(args) { | 690 'disableCopiesOption': true, |
| 327 updatePrintPreview(2, JSON.parse(args[0]).requestID); | 691 'disableLandscapeOption': true, |
| 328 })); | 692 'printerDefaultDuplexValue': 0 |
| 329 | 693 }; |
| 330 this.mockGlobals.expects(once()).updateWithPrinterCapabilities( | 694 this.nativeLayer_.dispatchEvent(capsSetEvent); |
| 331 savedArgs.match(ANYTHING)). | 695 }); |
| 332 will(callGlobalWithSavedArgs( | |
| 333 savedArgs, 'updateWithPrinterCapabilities')); | |
| 334 | |
| 335 setInitialSettings({previewModifiable: true}); | |
| 336 var printerList = $('printer-list'); | |
| 337 assertNotEquals(null, printerList, 'printerList'); | |
| 338 assertGE(printerList.options.length, printerListMinLength); | |
| 339 updateControlsWithSelectedPrinterCapabilities(); | |
| 340 checkSectionDisplayStyle(fitToPageSettings.fitToPageOption_, 'none'); | |
| 341 expectTrue(fitToPageSettings.hasFitToPage()); | |
| 342 }); | |
| 343 | |
| 344 // When the source is "PDF", depending on the selected destination printer, we | |
| 345 // show/hide the fit to page option. | |
| 346 TEST_F('PrintPreviewWebUITest', 'SourceIsPDFShowFitToPageOption', function() { | |
| 347 var savedArgs = new SaveMockArguments(); | |
| 348 this.mockHandler.expects(once()).getPreview(savedArgs.match(ANYTHING)). | |
| 349 will(callFunctionWithSavedArgs(savedArgs, function(args) { | |
| 350 updatePrintPreview(2, JSON.parse(args[0]).requestID); | |
| 351 })); | |
| 352 | |
| 353 this.mockGlobals.expects(once()).updateWithPrinterCapabilities( | |
| 354 savedArgs.match(ANYTHING)). | |
| 355 will(callGlobalWithSavedArgs( | |
| 356 savedArgs, 'updateWithPrinterCapabilities')); | |
| 357 | |
| 358 setInitialSettings({previewModifiable: false}); | |
| 359 var printerList = $('printer-list'); | |
| 360 assertNotEquals(null, printerList, 'printerList'); | |
| 361 assertGE(printerList.options.length, printerListMinLength); | |
| 362 var saveAsPDFOptionSelected = false; | |
| 363 var selectedPrinterOption = printerList.options[printerList.selectedIndex]; | |
| 364 if (selectedPrinterOption.text == saveAsPDFOptionStr && | |
| 365 selectedPrinterOption.value == saveAsPDFOptionStr) { | |
| 366 saveAsPDFOptionSelected = true; | |
| 367 } | |
| 368 updateControlsWithSelectedPrinterCapabilities(); | |
| 369 checkSectionDisplayStyle(fitToPageSettings.fitToPageOption_, | |
| 370 saveAsPDFOptionSelected ? 'none' : 'block'); | |
| 371 expectTrue(fitToPageSettings.hasFitToPage()); | |
| 372 }); | |
| 373 | |
| 374 // When the print scaling is disabled for the source "PDF", we show the fit | |
| 375 // to page option but the state is unchecked by default. | |
| 376 TEST_F('PrintPreviewWebUITest', 'PrintScalingDisabledForPlugin', function() { | |
| 377 var savedArgs = new SaveMockArguments(); | |
| 378 this.mockHandler.expects(once()).getPreview(savedArgs.match(ANYTHING)). | |
| 379 will(callFunctionWithSavedArgs(savedArgs, function(args) { | |
| 380 updatePrintPreview(2, JSON.parse(args[0]).requestID); | |
| 381 })); | |
| 382 | |
| 383 this.mockGlobals.expects(once()).updateWithPrinterCapabilities( | |
| 384 savedArgs.match(ANYTHING)). | |
| 385 will(callGlobalWithSavedArgs( | |
| 386 savedArgs, 'updateWithPrinterCapabilities')); | |
| 387 | |
| 388 setInitialSettings({previewModifiable: false}); | |
| 389 var printerList = $('printer-list'); | |
| 390 assertNotEquals(null, printerList, 'printerList'); | |
| 391 assertGE(printerList.options.length, printerListMinLength); | |
| 392 var saveAsPDFOptionSelected = false; | |
| 393 var selectedPrinterOption = printerList.options[printerList.selectedIndex]; | |
| 394 if (selectedPrinterOption.text == saveAsPDFOptionStr && | |
| 395 selectedPrinterOption.value == saveAsPDFOptionStr) { | |
| 396 saveAsPDFOptionSelected = true; | |
| 397 } | |
| 398 updateControlsWithSelectedPrinterCapabilities(); | |
| 399 printScalingDisabledForSourcePDF(); | |
| 400 checkSectionDisplayStyle(fitToPageSettings.fitToPageOption_, | |
| 401 saveAsPDFOptionSelected ? 'none' : 'block'); | |
| 402 // Make sure the fit to page checkbox is unchecked. | |
| 403 expectFalse(fitToPageSettings.hasFitToPage()); | |
| 404 }); | |
| 405 | |
| 406 // Page layout has zero margins. Hide header and footer option. | |
| 407 TEST_F('PrintPreviewWebUITest', 'PageLayoutHasNoMarginsHideHeaderFooter', | |
| 408 function() { | |
| 409 setInitialSettings({previewModifiable: true}); | |
| 410 onDidGetDefaultPageLayout({ | |
| 411 contentWidth: 100, contentHeight: 200, marginLeft: 0, marginRight: 0, | |
| 412 marginTop: 0, marginBottom: 0, printableAreaX: 0, printableAreaY: 0, | |
| 413 printableAreaWidth: 100, printableAreaHeight: 200}, true); | |
| 414 checkSectionDisplayStyle(headerFooterSettings.headerFooterOption_, 'none'); | |
| 415 }); | |
| 416 | |
| 417 // Page layout has non-zero margins. Show header and footer option. | |
| 418 TEST_F('PrintPreviewWebUITest', 'PageLayoutHasMarginsShowHeaderFooter', | |
| 419 function() { | |
| 420 setInitialSettings({previewModifiable: true}); | |
| 421 onDidGetDefaultPageLayout({ | |
| 422 contentWidth: 100, contentHeight: 200, marginLeft: 3, marginRight: 2, | |
| 423 marginTop: 4, marginBottom: 1, printableAreaX: 1, printableAreaY: 1, | |
| 424 printableAreaWidth: 103, printableAreaHeight: 203}, true); | |
| 425 checkSectionDisplayStyle(headerFooterSettings.headerFooterOption_, 'block'); | |
| 426 }); | |
| 427 | |
| 428 // Page layout has zero top and bottom margins. Hide header and footer option. | |
| 429 TEST_F('PrintPreviewWebUITest', 'ZeroTopAndBottomMarginsHideHeaderFooter', | |
| 430 function() { | |
| 431 setInitialSettings({previewModifiable: true}); | |
| 432 onDidGetDefaultPageLayout({ | |
| 433 contentWidth: 100, contentHeight: 200, marginLeft: 3, marginRight: 2, | |
| 434 marginTop: 0, marginBottom: 0, printableAreaX: 1, printableAreaY: 1, | |
| 435 printableAreaWidth: 98, printableAreaHeight: 198}, false); | |
| 436 checkSectionDisplayStyle(headerFooterSettings.headerFooterOption_, 'none'); | |
| 437 }); | |
| 438 | |
| 439 // Page layout has zero top and non-zero bottom margin. Show header and footer | |
| 440 // option. | |
| 441 TEST_F('PrintPreviewWebUITest', 'ZeroTopAndNonZeroBottomMarginShowHeaderFooter', | |
| 442 function() { | |
| 443 setInitialSettings({previewModifiable: true}); | |
| 444 onDidGetDefaultPageLayout({ | |
| 445 contentWidth: 100, contentHeight: 200, marginLeft: 6, marginRight: 4, | |
| 446 marginTop: 0, marginBottom: 3, printableAreaX: 1, printableAreaY: 1, | |
| 447 printableAreaWidth: 103, printableAreaHeight: 208}, false); | |
| 448 checkSectionDisplayStyle(headerFooterSettings.headerFooterOption_, 'block'); | |
| 449 }); | |
| 450 | |
| 451 // Test that the color settings are set according to the printer capabilities. | |
| 452 TEST_F('PrintPreviewWebUITest', 'TestColorSettings', function() { | |
| 453 this.mockHandler.expects(once()).getPrinterCapabilities('FooDevice'). | |
| 454 will(callFunction(function() { | |
| 455 updateWithPrinterCapabilities({ | |
| 456 disableColorOption: false, | |
| 457 setColorAsDefault: true, | |
| 458 disableCopiesOption: false, | |
| 459 disableLandscapeOption: false, | |
| 460 printerDefaultDuplexValue: print_preview.CopiesSettings.SIMPLEX, | |
| 461 }); | |
| 462 })); | |
| 463 | |
| 464 updateControlsWithSelectedPrinterCapabilities(); | |
| 465 expectTrue(colorSettings.colorRadioButton.checked); | |
| 466 expectFalse(colorSettings.bwRadioButton.checked); | |
| 467 | |
| 468 this.mockHandler.expects(once()).getPrinterCapabilities('FooDevice'). | |
| 469 will(callFunction(function() { | |
| 470 updateWithPrinterCapabilities({ | |
| 471 disableColorOption: false, | |
| 472 setColorAsDefault: false, | |
| 473 disableCopiesOption: false, | |
| 474 disableLandscapeOption: false, | |
| 475 printerDefaultDuplexValue: print_preview.CopiesSettings.SIMPLEX, | |
| 476 }); | |
| 477 })); | |
| 478 | |
| 479 updateControlsWithSelectedPrinterCapabilities(); | |
| 480 expectFalse(colorSettings.colorRadioButton.checked); | |
| 481 expectTrue(colorSettings.bwRadioButton.checked); | |
| 482 }); | |
| 483 | |
| 484 // Test to verify that duplex settings are set according to the printer | |
| 485 // capabilities. | |
| 486 TEST_F('PrintPreviewWebUITest', 'TestDuplexSettings', function() { | |
| 487 this.mockHandler.expects(once()).getPrinterCapabilities('FooDevice'). | |
| 488 will(callFunction(function() { | |
| 489 updateWithPrinterCapabilities({ | |
| 490 disableColorOption: false, | |
| 491 setColorAsDefault: false, | |
| 492 disableCopiesOption: false, | |
| 493 disableLandscapeOption: false, | |
| 494 printerDefaultDuplexValue: print_preview.CopiesSettings.SIMPLEX, | |
| 495 }); | |
| 496 })); | |
| 497 updateControlsWithSelectedPrinterCapabilities(); | |
| 498 expectEquals(copiesSettings.duplexMode, print_preview.CopiesSettings.SIMPLEX); | |
| 499 expectEquals(copiesSettings.twoSidedOption_.hidden, false); | |
| 500 | |
| 501 // If the printer default duplex value is UNKNOWN_DUPLEX_MODE, hide the | |
| 502 // two sided option. | |
| 503 this.mockHandler.expects(once()).getPrinterCapabilities('FooDevice'). | |
| 504 will(callFunction(function() { | |
| 505 updateWithPrinterCapabilities({ | |
| 506 disableColorOption: false, | |
| 507 setColorAsDefault: false, | |
| 508 disableCopiesOption: false, | |
| 509 disableLandscapeOption: false, | |
| 510 printerDefaultDuplexValue: | |
| 511 print_preview.CopiesSettings.UNKNOWN_DUPLEX_MODE, | |
| 512 }); | |
| 513 })); | |
| 514 updateControlsWithSelectedPrinterCapabilities(); | |
| 515 expectEquals(copiesSettings.duplexMode, | |
| 516 print_preview.CopiesSettings.UNKNOWN_DUPLEX_MODE); | |
| 517 expectEquals(copiesSettings.twoSidedOption_.hidden, true); | |
| 518 | |
| 519 this.mockHandler.expects(once()).getPrinterCapabilities('FooDevice'). | |
| 520 will(callFunction(function() { | |
| 521 updateWithPrinterCapabilities({ | |
| 522 disableColorOption: false, | |
| 523 setColorAsDefault: false, | |
| 524 disableCopiesOption: false, | |
| 525 disableLandscapeOption: false, | |
| 526 printerDefaultDuplexValue: print_preview.CopiesSettings.SIMPLEX, | |
| 527 }); | |
| 528 })); | |
| 529 updateControlsWithSelectedPrinterCapabilities(); | |
| 530 expectEquals(copiesSettings.twoSidedOption_.hidden, false); | |
| 531 expectEquals(copiesSettings.duplexMode, print_preview.CopiesSettings.SIMPLEX); | |
| 532 copiesSettings.twoSidedCheckbox.checked = true; | |
| 533 expectEquals( | |
| 534 copiesSettings.duplexMode, print_preview.CopiesSettings.LONG_EDGE); | |
| 535 }); | |
| 536 | |
| 537 // Test that changing the selected printer updates the preview. | |
| 538 TEST_F('PrintPreviewWebUITest', 'TestPrinterChangeUpdatesPreview', function() { | |
| 539 var savedArgs = new SaveMockArguments(); | |
| 540 this.mockHandler.expects(once()).getPreview(savedArgs.match(ANYTHING)). | |
| 541 will(callFunctionWithSavedArgs(savedArgs, function(args) { | |
| 542 updatePrintPreview(2, JSON.parse(args[0]).requestID); | |
| 543 })); | |
| 544 | |
| 545 this.mockGlobals.expects(once()).updateWithPrinterCapabilities( | |
| 546 savedArgs.match(ANYTHING)). | |
| 547 will(callGlobalWithSavedArgs( | |
| 548 savedArgs, 'updateWithPrinterCapabilities')); | |
| 549 | |
| 550 var printerList = $('printer-list'); | |
| 551 assertNotEquals(null, printerList, 'printerList'); | |
| 552 assertGE(printerList.options.length, printerListMinLength); | |
| 553 expectEquals(fooIndex, printerList.selectedIndex, | |
| 554 'fooIndex=' + fooIndex); | |
| 555 var oldLastPreviewRequestID = lastPreviewRequestID; | |
| 556 ++printerList.selectedIndex; | |
| 557 updateControlsWithSelectedPrinterCapabilities(); | |
| 558 expectNotEquals(oldLastPreviewRequestID, lastPreviewRequestID); | |
| 559 }); | |
| 560 | |
| 561 /** | |
| 562 * Test fixture to test case when no PDF plugin exists. | |
| 563 * @extends {PrintPreviewWebUITest} | |
| 564 * @constructor | |
| 565 */ | |
| 566 function PrintPreviewNoPDFWebUITest() {} | |
| 567 | |
| 568 PrintPreviewNoPDFWebUITest.prototype = { | |
| 569 __proto__: PrintPreviewWebUITest.prototype, | |
| 570 | |
| 571 /** | |
| 572 * Provide a typedef for C++ to correspond to JS subclass. | |
| 573 * @type {?string} | |
| 574 * @override | |
| 575 */ | |
| 576 typedefCppFixture: 'PrintPreviewWebUITest', | |
| 577 | |
| 578 /** | |
| 579 * Always return false to simulate failure and check expected error condition. | |
| 580 * @return {boolean} Always false. | |
| 581 * @override | |
| 582 */ | |
| 583 checkCompatiblePluginExists: function() { | |
| 584 return false; | |
| 585 }, | |
| 586 }; | |
| 587 | 696 |
| 588 // Test that error message is displayed when plugin doesn't exist. | 697 // Test that error message is displayed when plugin doesn't exist. |
| 589 TEST_F('PrintPreviewNoPDFWebUITest', 'TestErrorMessage', function() { | 698 TEST_F('PrintPreviewWebUITest', 'TestNoPDFPluginErrorMessage', function() { |
| 590 var errorButton = $('error-button'); | 699 var previewAreaEl = $('preview-area'); |
| 591 assertNotEquals(null, errorButton); | 700 |
| 592 expectFalse(errorButton.disabled); | 701 var loadingMessageEl = |
| 593 var errorText = $('custom-message'); | 702 previewAreaEl.getElementsByClassName('preview-area-loading-message')[0]; |
| 594 assertNotEquals(null, errorText); | 703 expectEquals('none', loadingMessageEl.style.display); |
| 595 expectFalse(errorText.hidden); | 704 |
| 596 }); | 705 var previewFailedMessageEl = previewAreaEl.getElementsByClassName( |
| 706 'preview-area-preview-failed-message')[0]; | |
| 707 expectEquals('none', previewFailedMessageEl.style.display); | |
| 708 | |
| 709 var printFailedMessageEl = | |
| 710 previewAreaEl.getElementsByClassName('preview-area-print-failed')[0]; | |
| 711 expectEquals('none', printFailedMessageEl.style.display); | |
| 712 | |
| 713 var customMessageEl = | |
| 714 previewAreaEl.getElementsByClassName('preview-area-custom-message')[0]; | |
| 715 expectEquals('', customMessageEl.style.display); | |
| 716 }); | |
| OLD | NEW |