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 * @extends {testing.Test} | 7 * @extends {testing.Test} |
8 * @constructor | 8 * @constructor |
9 */ | 9 */ |
10 function PrintPreviewWebUITest() {} | 10 function PrintPreviewWebUITest() {} |
11 | 11 |
12 PrintPreviewWebUITest.prototype = { | 12 PrintPreviewWebUITest.prototype = { |
13 __proto__: testing.Test.prototype, | 13 __proto__: testing.Test.prototype, |
14 | 14 |
15 /** | 15 /** |
16 * Browse to the sample page, cause print preview & call preLoad(). | 16 * Browse to the sample page, cause print preview & call preLoad(). |
17 * @type {string} | 17 * @type {string} |
18 * @override | 18 * @override |
19 */ | 19 */ |
20 browsePrintPreload: 'print_preview_hello_world_test.html', | 20 browsePrintPreload: 'print_preview_hello_world_test.html', |
21 | 21 |
22 /** | 22 /** |
23 * Register a mock handler to ensure expectations are met and print preview | 23 * Register a mock handler to ensure expectations are met and print preview |
24 * behaves correctly. | 24 * behaves correctly. |
25 * @type {Function} | 25 * @type {Function} |
| 26 * @this {PrintPreviewWebUITest} |
26 * @override | 27 * @override |
27 */ | 28 */ |
28 preLoad: function() { | 29 preLoad: function() { |
29 this.makeAndRegisterMockHandler(['getInitialSettings', | 30 this.makeAndRegisterMockHandler(['getInitialSettings', |
30 'getPrinters', | 31 'getPrinters', |
31 'getPreview', | 32 'getPreview', |
32 'print', | 33 'print', |
33 'getPrinterCapabilities', | 34 'getPrinterCapabilities', |
34 'showSystemDialog', | 35 'showSystemDialog', |
35 'morePrinters', | 36 'morePrinters', |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
113 | 114 |
114 /** | 115 /** |
115 * Create the PDF plugin or reload the existing one. This function replaces | 116 * Create the PDF plugin or reload the existing one. This function replaces |
116 * createOrReloadPDFPlugin defined in | 117 * createOrReloadPDFPlugin defined in |
117 * chrome/browser/resources/print_preview/preview_area.js when there is no | 118 * chrome/browser/resources/print_preview/preview_area.js when there is no |
118 * official pdf plugin so that the WebUI logic can be tested. It creates and | 119 * official pdf plugin so that the WebUI logic can be tested. It creates and |
119 * attaches an HTMLDivElement to the |mainview| element with attributes and | 120 * attaches an HTMLDivElement to the |mainview| element with attributes and |
120 * empty methods, which are used by testing and that would be provided by the | 121 * empty methods, which are used by testing and that would be provided by the |
121 * HTMLEmbedElement when the PDF plugin exists. | 122 * HTMLEmbedElement when the PDF plugin exists. |
122 * @param {number} srcDataIndex Preview data source index. | 123 * @param {number} srcDataIndex Preview data source index. |
| 124 * @this {PrintPreviewWebUITest} |
123 */ | 125 */ |
124 createOrReloadPDFPlugin: function(srcDataIndex) { | 126 createOrReloadPDFPlugin: function(srcDataIndex) { |
125 var pdfViewer = $('pdf-viewer'); | 127 var pdfViewer = $('pdf-viewer'); |
126 if (pdfViewer) | 128 if (pdfViewer) |
127 return; | 129 return; |
128 | 130 |
129 var previewUid = 1; | 131 var previewUid = 1; |
130 pdfViewer = document.createElement('div'); | 132 pdfViewer = document.createElement('div'); |
131 pdfViewer.setAttribute('id', 'pdf-viewer'); | 133 pdfViewer.setAttribute('id', 'pdf-viewer'); |
132 pdfViewer.setAttribute('type', | 134 pdfViewer.setAttribute('type', |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
186 */ | 188 */ |
187 var fooIndex = 0; | 189 var fooIndex = 0; |
188 | 190 |
189 /** | 191 /** |
190 * The expected index of the "bar" printer returned by the stubbed handler. | 192 * The expected index of the "bar" printer returned by the stubbed handler. |
191 * @type {number} | 193 * @type {number} |
192 * @const | 194 * @const |
193 */ | 195 */ |
194 var barIndex = 1; | 196 var barIndex = 1; |
195 | 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 |
196 // Test some basic assumptions about the print preview WebUI. | 205 // Test some basic assumptions about the print preview WebUI. |
197 TEST_F('PrintPreviewWebUITest', 'TestPrinterList', function() { | 206 TEST_F('PrintPreviewWebUITest', 'TestPrinterList', function() { |
198 var printerList = $('printer-list'); | 207 var printerList = $('printer-list'); |
199 assertNotEquals(null, printerList); | 208 assertNotEquals(null, printerList); |
200 assertGE(printerList.options.length, printerListMinLength); | 209 assertGE(printerList.options.length, printerListMinLength); |
201 expectEquals(fooIndex, printerList.selectedIndex); | 210 expectEquals(fooIndex, printerList.selectedIndex); |
202 expectEquals('FooName', printerList.options[fooIndex].text, | 211 expectEquals('FooName', printerList.options[fooIndex].text, |
203 'fooIndex=' + fooIndex); | 212 'fooIndex=' + fooIndex); |
204 expectEquals('FooDevice', printerList.options[fooIndex].value, | 213 expectEquals('FooDevice', printerList.options[fooIndex].value, |
205 'fooIndex=' + fooIndex); | 214 'fooIndex=' + fooIndex); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
243 * Verify that |section| visibility matches |visible|. | 252 * Verify that |section| visibility matches |visible|. |
244 * @param {HTMLDivElement} section The section to check. | 253 * @param {HTMLDivElement} section The section to check. |
245 * @param {boolean} visible The expected state of visibility. | 254 * @param {boolean} visible The expected state of visibility. |
246 */ | 255 */ |
247 function checkSectionVisible(section, visible) { | 256 function checkSectionVisible(section, visible) { |
248 assertNotEquals(null, section); | 257 assertNotEquals(null, section); |
249 expectEquals(section.classList.contains('visible'), visible, | 258 expectEquals(section.classList.contains('visible'), visible, |
250 'section=' + section); | 259 'section=' + section); |
251 } | 260 } |
252 | 261 |
| 262 /** |
| 263 * Verify that |section| style display matches |value|. |
| 264 * @param {HTMLDivElement} section The section to check. |
| 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 } |
| 271 |
253 // Test that disabled settings hide the disabled sections. | 272 // Test that disabled settings hide the disabled sections. |
254 TEST_F('PrintPreviewWebUITest', 'TestSectionsDisabled', function() { | 273 TEST_F('PrintPreviewWebUITest', 'TestSectionsDisabled', function() { |
255 this.mockHandler.expects(once()).getPrinterCapabilities('FooDevice'). | 274 this.mockHandler.expects(once()).getPrinterCapabilities('FooDevice'). |
256 will(callFunction(function() { | 275 will(callFunction(function() { |
257 updateWithPrinterCapabilities({ | 276 updateWithPrinterCapabilities({ |
258 disableColorOption: true, | 277 disableColorOption: true, |
259 setColorAsDefault: true, | 278 setColorAsDefault: true, |
260 disableCopiesOption: true, | 279 disableCopiesOption: true, |
261 disableLandscapeOption: true, | 280 disableLandscapeOption: true, |
262 printerDefaultDuplexValue: print_preview.CopiesSettings.SIMPLEX, | 281 printerDefaultDuplexValue: print_preview.CopiesSettings.SIMPLEX, |
263 }); | 282 }); |
264 })); | 283 })); |
265 | 284 |
266 updateControlsWithSelectedPrinterCapabilities(); | 285 updateControlsWithSelectedPrinterCapabilities(); |
267 | 286 |
268 checkSectionVisible(layoutSettings.layoutOption_, false); | 287 checkSectionVisible(layoutSettings.layoutOption_, false); |
269 checkSectionVisible(colorSettings.colorOption_, false); | 288 checkSectionVisible(colorSettings.colorOption_, false); |
270 checkSectionVisible(copiesSettings.copiesOption_, false); | 289 checkSectionVisible(copiesSettings.copiesOption_, false); |
271 }); | 290 }); |
272 | 291 |
| 292 // When the source is 'PDF' and 'Save as PDF' option is selected, we hide the |
| 293 // fit to page option. |
| 294 TEST_F('PrintPreviewWebUITest', 'PrintToPDFSelectedHideFitToPageOption', |
| 295 function() { |
| 296 var savedArgs = new SaveMockArguments(); |
| 297 this.mockHandler.expects(once()).getPreview(savedArgs.match(ANYTHING)). |
| 298 will(callFunctionWithSavedArgs(savedArgs, function(args) { |
| 299 updatePrintPreview(2, JSON.parse(args[0]).requestID); |
| 300 })); |
| 301 |
| 302 this.mockGlobals.expects(once()).updateWithPrinterCapabilities( |
| 303 savedArgs.match(ANYTHING)). |
| 304 will(callGlobalWithSavedArgs( |
| 305 savedArgs, 'updateWithPrinterCapabilities')); |
| 306 |
| 307 setInitialSettings({previewModifiable: false}); |
| 308 var printerList = $('printer-list'); |
| 309 assertNotEquals(null, printerList, 'printerList'); |
| 310 assertGE(printerList.options.length, printerListMinLength); |
| 311 for (var i = 0; i < printerList.options.length; i++) { |
| 312 if (printerList.options[i].text == saveAsPDFOptionStr && |
| 313 printerList.options[i].value == saveAsPDFOptionStr) { |
| 314 printerList.selectedIndex = i; |
| 315 break; |
| 316 } |
| 317 } |
| 318 updateControlsWithSelectedPrinterCapabilities(); |
| 319 checkSectionDisplayStyle(fitToPageSettings.fitToPageOption_, 'none'); |
| 320 }); |
| 321 |
| 322 // When the source is 'HTML', we always hide the fit to page option. |
| 323 TEST_F('PrintPreviewWebUITest', 'SourceIsHTMLHideFitToPageOption', function() { |
| 324 var savedArgs = new SaveMockArguments(); |
| 325 this.mockHandler.expects(once()).getPreview(savedArgs.match(ANYTHING)). |
| 326 will(callFunctionWithSavedArgs(savedArgs, function(args) { |
| 327 updatePrintPreview(2, JSON.parse(args[0]).requestID); |
| 328 })); |
| 329 |
| 330 this.mockGlobals.expects(once()).updateWithPrinterCapabilities( |
| 331 savedArgs.match(ANYTHING)). |
| 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 |
273 // Page layout has zero margins. Hide header and footer option. | 406 // Page layout has zero margins. Hide header and footer option. |
274 TEST_F('PrintPreviewWebUITest', 'PageLayoutHasNoMarginsHideHeaderFooter', | 407 TEST_F('PrintPreviewWebUITest', 'PageLayoutHasNoMarginsHideHeaderFooter', |
275 function() { | 408 function() { |
276 setInitialSettings({previewModifiable: true}); | 409 setInitialSettings({previewModifiable: true}); |
277 onDidGetDefaultPageLayout({ | 410 onDidGetDefaultPageLayout({ |
278 contentWidth: 100, contentHeight: 200, marginLeft: 0, marginRight: 0, | 411 contentWidth: 100, contentHeight: 200, marginLeft: 0, marginRight: 0, |
279 marginTop: 0, marginBottom: 0, printableAreaX: 0, printableAreaY: 0, | 412 marginTop: 0, marginBottom: 0, printableAreaX: 0, printableAreaY: 0, |
280 printableAreaWidth: 100, printableAreaHeight: 200}, true); | 413 printableAreaWidth: 100, printableAreaHeight: 200}, true); |
281 checkSectionVisible(headerFooterSettings.headerFooterOption_, false); | 414 checkSectionDisplayStyle(headerFooterSettings.headerFooterOption_, 'none'); |
282 }); | 415 }); |
283 | 416 |
284 // Page layout has non-zero margins. Show header and footer option. | 417 // Page layout has non-zero margins. Show header and footer option. |
285 TEST_F('PrintPreviewWebUITest', 'PageLayoutHasMarginsShowHeaderFooter', | 418 TEST_F('PrintPreviewWebUITest', 'PageLayoutHasMarginsShowHeaderFooter', |
286 function() { | 419 function() { |
287 setInitialSettings({previewModifiable: true}); | 420 setInitialSettings({previewModifiable: true}); |
288 onDidGetDefaultPageLayout({ | 421 onDidGetDefaultPageLayout({ |
289 contentWidth: 100, contentHeight: 200, marginLeft: 3, marginRight: 2, | 422 contentWidth: 100, contentHeight: 200, marginLeft: 3, marginRight: 2, |
290 marginTop: 4, marginBottom: 1, printableAreaX: 1, printableAreaY: 1, | 423 marginTop: 4, marginBottom: 1, printableAreaX: 1, printableAreaY: 1, |
291 printableAreaWidth: 103, printableAreaHeight: 203}, true); | 424 printableAreaWidth: 103, printableAreaHeight: 203}, true); |
292 checkSectionVisible(headerFooterSettings.headerFooterOption_, true); | 425 checkSectionDisplayStyle(headerFooterSettings.headerFooterOption_, 'block'); |
293 }); | 426 }); |
294 | 427 |
295 // Page layout has zero top and bottom margins. Hide header and footer option. | 428 // Page layout has zero top and bottom margins. Hide header and footer option. |
296 TEST_F('PrintPreviewWebUITest', 'ZeroTopAndBottomMarginsHideHeaderFooter', | 429 TEST_F('PrintPreviewWebUITest', 'ZeroTopAndBottomMarginsHideHeaderFooter', |
297 function() { | 430 function() { |
298 setInitialSettings({previewModifiable: true}); | 431 setInitialSettings({previewModifiable: true}); |
299 onDidGetDefaultPageLayout({ | 432 onDidGetDefaultPageLayout({ |
300 contentWidth: 100, contentHeight: 200, marginLeft: 3, marginRight: 2, | 433 contentWidth: 100, contentHeight: 200, marginLeft: 3, marginRight: 2, |
301 marginTop: 0, marginBottom: 0, printableAreaX: 1, printableAreaY: 1, | 434 marginTop: 0, marginBottom: 0, printableAreaX: 1, printableAreaY: 1, |
302 printableAreaWidth: 98, printableAreaHeight: 198}, false); | 435 printableAreaWidth: 98, printableAreaHeight: 198}, false); |
303 checkSectionVisible(headerFooterSettings.headerFooterOption_, false); | 436 checkSectionDisplayStyle(headerFooterSettings.headerFooterOption_, 'none'); |
304 }); | 437 }); |
305 | 438 |
306 // Page layout has zero top and non-zero bottom margin. Show header and footer | 439 // Page layout has zero top and non-zero bottom margin. Show header and footer |
307 // option. | 440 // option. |
308 TEST_F('PrintPreviewWebUITest', 'ZeroTopAndNonZeroBottomMarginShowHeaderFooter', | 441 TEST_F('PrintPreviewWebUITest', 'ZeroTopAndNonZeroBottomMarginShowHeaderFooter', |
309 function() { | 442 function() { |
310 setInitialSettings({previewModifiable: true}); | 443 setInitialSettings({previewModifiable: true}); |
311 onDidGetDefaultPageLayout({ | 444 onDidGetDefaultPageLayout({ |
312 contentWidth: 100, contentHeight: 200, marginLeft: 6, marginRight: 4, | 445 contentWidth: 100, contentHeight: 200, marginLeft: 6, marginRight: 4, |
313 marginTop: 0, marginBottom: 3, printableAreaX: 1, printableAreaY: 1, | 446 marginTop: 0, marginBottom: 3, printableAreaX: 1, printableAreaY: 1, |
314 printableAreaWidth: 103, printableAreaHeight: 208}, false); | 447 printableAreaWidth: 103, printableAreaHeight: 208}, false); |
315 checkSectionVisible(headerFooterSettings.headerFooterOption_, true); | 448 checkSectionDisplayStyle(headerFooterSettings.headerFooterOption_, 'block'); |
316 }); | 449 }); |
317 | 450 |
318 // Test that the color settings are set according to the printer capabilities. | 451 // Test that the color settings are set according to the printer capabilities. |
319 TEST_F('PrintPreviewWebUITest', 'TestColorSettings', function() { | 452 TEST_F('PrintPreviewWebUITest', 'TestColorSettings', function() { |
320 this.mockHandler.expects(once()).getPrinterCapabilities('FooDevice'). | 453 this.mockHandler.expects(once()).getPrinterCapabilities('FooDevice'). |
321 will(callFunction(function() { | 454 will(callFunction(function() { |
322 updateWithPrinterCapabilities({ | 455 updateWithPrinterCapabilities({ |
323 disableColorOption: false, | 456 disableColorOption: false, |
324 setColorAsDefault: true, | 457 setColorAsDefault: true, |
325 disableCopiesOption: false, | 458 disableCopiesOption: false, |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
454 | 587 |
455 // Test that error message is displayed when plugin doesn't exist. | 588 // Test that error message is displayed when plugin doesn't exist. |
456 TEST_F('PrintPreviewNoPDFWebUITest', 'TestErrorMessage', function() { | 589 TEST_F('PrintPreviewNoPDFWebUITest', 'TestErrorMessage', function() { |
457 var errorButton = $('error-button'); | 590 var errorButton = $('error-button'); |
458 assertNotEquals(null, errorButton); | 591 assertNotEquals(null, errorButton); |
459 expectFalse(errorButton.disabled); | 592 expectFalse(errorButton.disabled); |
460 var errorText = $('custom-message'); | 593 var errorText = $('custom-message'); |
461 assertNotEquals(null, errorText); | 594 assertNotEquals(null, errorText); |
462 expectFalse(errorText.hidden); | 595 expectFalse(errorText.hidden); |
463 }); | 596 }); |
OLD | NEW |