Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(37)

Side by Side Diff: chrome/browser/resources/print_preview.js

Issue 7056070: PrintPreview: Preview generation should not block print button. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: '' Created 9 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 var localStrings = new LocalStrings(); 5 var localStrings = new LocalStrings();
6 6
7 // The total page count of the previewed document regardless of which pages the 7 // The total page count of the previewed document regardless of which pages the
8 // user has selected. 8 // user has selected.
9 var totalPageCount = -1; 9 var totalPageCount = -1;
10 10
(...skipping 15 matching lines...) Expand all
26 // Destination list special value constants. 26 // Destination list special value constants.
27 const PRINT_TO_PDF = 'Print To PDF'; 27 const PRINT_TO_PDF = 'Print To PDF';
28 const MANAGE_PRINTERS = 'Manage Printers'; 28 const MANAGE_PRINTERS = 'Manage Printers';
29 29
30 // State of the print preview settings. 30 // State of the print preview settings.
31 var printSettings = new PrintSettings(); 31 var printSettings = new PrintSettings();
32 32
33 // The name of the default or last used printer. 33 // The name of the default or last used printer.
34 var defaultOrLastUsedPrinterName = ''; 34 var defaultOrLastUsedPrinterName = '';
35 35
36 // True when a pending print preview request exists.
37 var hasPendingPreviewRequest = false;
38
39 // True when a pending print file request exists.
40 var hasPendingPrintFileRequest = false;
41
42 // True when preview tab has some error.
43 var hasError = false;
44
36 /** 45 /**
37 * Window onload handler, sets up the page and starts print preview by getting 46 * Window onload handler, sets up the page and starts print preview by getting
38 * the printer list. 47 * the printer list.
39 */ 48 */
40 function onLoad() { 49 function onLoad() {
41 $('system-dialog-link').addEventListener('click', showSystemDialog); 50 $('system-dialog-link').addEventListener('click', showSystemDialog);
42 $('cancel-button').addEventListener('click', handleCancelButtonClick); 51 $('cancel-button').addEventListener('click', handleCancelButtonClick);
43 52
44 if (!checkCompatiblePluginExists()) { 53 if (!checkCompatiblePluginExists()) {
45 displayErrorMessageWithButton(localStrings.getString('noPlugin'), 54 displayErrorMessageWithButton(localStrings.getString('noPlugin'),
46 localStrings.getString('launchNativeDialog'), 55 localStrings.getString('launchNativeDialog'),
47 showSystemDialog); 56 showSystemDialog);
48 $('mainview').parentElement.removeChild($('dummy-viewer')); 57 $('mainview').parentElement.removeChild($('dummy-viewer'));
49 return; 58 return;
50 } 59 }
51 $('mainview').parentElement.removeChild($('dummy-viewer')); 60 $('mainview').parentElement.removeChild($('dummy-viewer'));
52 61
53 $('printer-list').disabled = true; 62 $('printer-list').disabled = true;
54 $('print-button').disabled = true; 63 $('print-button').onclick = printFile;
64
65 setDefaultHandlersForPagesAndCopiesControls();
55 showLoadingAnimation(); 66 showLoadingAnimation();
56 chrome.send('getDefaultPrinter'); 67 chrome.send('getDefaultPrinter');
57 } 68 }
58 69
59 /** 70 /**
71 * Handles the individual pages input event.
72 */
73 function handleIndividualPagesInputEvent() {
74 $('print-pages').checked = true;
75 resetPageRangeFieldTimer();
76 }
77
78 /**
79 * Handles the individual pages blur event.
80 */
81 function onPageRangesFieldBlur() {
82 $('print-pages').checked = true;
83 validatePageRangesField();
84 updatePrintButtonState();
85 }
86
87 /**
88 * Sets the default event handlers for pages and copies controls.
89 */
90 function setDefaultHandlersForPagesAndCopiesControls() {
91 var allPages = $('all-pages');
92 var printPages = $('print-pages');
93 var individualPages = $('individual-pages');
94
95 allPages.onclick = null;
96 printPages.onclick = null;
97 individualPages.oninput = null;
98 individualPages.onfocus = null;
99 individualPages.onblur = null;
100
101 if (!hasError) {
102 allPages.onclick = updatePrintButtonState;
103 printPages.onclick = handleIndividualPagesCheckbox;
104 individualPages.onblur = onPageRangesFieldBlur;
105 }
106
107 $('copies').oninput = copiesFieldChanged;
108 $('increment').onclick = function() { onCopiesButtonsClicked(1); };
109 $('decrement').onclick = function() { onCopiesButtonsClicked(-1); };
110 }
111
112 /**
60 * Adds event listeners to the settings controls. 113 * Adds event listeners to the settings controls.
61 */ 114 */
62 function addEventListeners() { 115 function addEventListeners() {
63 $('print-button').onclick = printFile;
64
65 // Controls that require preview rendering. 116 // Controls that require preview rendering.
66 $('all-pages').onclick = onPageSelectionMayHaveChanged; 117 $('all-pages').onclick = onPageSelectionMayHaveChanged;
67 $('print-pages').onclick = handleIndividualPagesCheckbox; 118 $('print-pages').onclick = handleIndividualPagesCheckbox;
68 var individualPages = $('individual-pages'); 119 var individualPages = $('individual-pages');
69 individualPages.onblur = function() { 120 individualPages.onblur = function() {
70 clearTimeout(timerId); 121 clearTimeout(timerId);
71 onPageSelectionMayHaveChanged(); 122 onPageSelectionMayHaveChanged();
72 }; 123 };
73 individualPages.onfocus = addTimerToPageRangeField; 124 individualPages.onfocus = addTimerToPageRangeField;
74 individualPages.oninput = resetPageRangeFieldTimer; 125 individualPages.oninput = handleIndividualPagesInputEvent;
75 $('landscape').onclick = onLayoutModeToggle; 126 $('landscape').onclick = onLayoutModeToggle;
76 $('portrait').onclick = onLayoutModeToggle; 127 $('portrait').onclick = onLayoutModeToggle;
77 $('printer-list').onchange = updateControlsWithSelectedPrinterCapabilities; 128 $('printer-list').onchange = updateControlsWithSelectedPrinterCapabilities;
78 129
79 // Controls that dont require preview rendering. 130 // Controls that dont require preview rendering.
80 $('copies').oninput = function() { 131 $('copies').oninput = function() {
81 copiesFieldChanged(); 132 copiesFieldChanged();
82 updatePrintButtonState(); 133 updatePrintButtonState();
83 updatePrintSummary(); 134 updatePrintSummary();
84 }; 135 };
85 $('two-sided').onclick = handleTwoSidedClick; 136 $('two-sided').onclick = handleTwoSidedClick;
86 $('color').onclick = function() { setColor(true); }; 137 $('color').onclick = function() { setColor(true); };
87 $('bw').onclick = function() { setColor(false); }; 138 $('bw').onclick = function() { setColor(false); };
88 $('increment').onclick = function() { 139 $('increment').onclick = function() {
89 onCopiesButtonsClicked(1); 140 onCopiesButtonsClicked(1);
90 updatePrintButtonState(); 141 updatePrintButtonState();
91 updatePrintSummary(); 142 updatePrintSummary();
92 }; 143 };
93 $('decrement').onclick = function() { 144 $('decrement').onclick = function() {
94 onCopiesButtonsClicked(-1); 145 onCopiesButtonsClicked(-1);
95 updatePrintButtonState(); 146 updatePrintButtonState();
96 updatePrintSummary(); 147 updatePrintSummary();
97 }; 148 };
98 } 149 }
99 150
100 /** 151 /**
101 * Removes event listeners from the settings controls. 152 * Removes event listeners from the settings controls.
102 */ 153 */
103 function removeEventListeners() { 154 function removeEventListeners() {
104 // Controls that require preview rendering.
105 $('print-button').disabled = true;
106 $('all-pages').onclick = null;
107 $('print-pages').onclick = null;
108 var individualPages = $('individual-pages');
109 individualPages.onblur = null;
110 individualPages.onfocus = null;
111 individualPages.oninput = null;
112 clearTimeout(timerId); 155 clearTimeout(timerId);
156 setDefaultHandlersForPagesAndCopiesControls();
157
158 // Controls that require preview rendering
113 $('landscape').onclick = null; 159 $('landscape').onclick = null;
114 $('portrait').onclick = null; 160 $('portrait').onclick = null;
115 $('printer-list').onchange = null; 161 $('printer-list').onchange = null;
116 162
117 // Controls that dont require preview rendering. 163 // Controls that dont require preview rendering.
118 $('copies').oninput = copiesFieldChanged;
119 $('two-sided').onclick = null; 164 $('two-sided').onclick = null;
120 $('color').onclick = null; 165 $('color').onclick = null;
121 $('bw').onclick = null; 166 $('bw').onclick = null;
122 $('increment').onclick = function() { onCopiesButtonsClicked(1); };
123 $('decrement').onclick = function() { onCopiesButtonsClicked(-1); };
124 } 167 }
125 168
126 /** 169 /**
127 * Asks the browser to close the preview tab. 170 * Asks the browser to close the preview tab.
128 */ 171 */
129 function handleCancelButtonClick() { 172 function handleCancelButtonClick() {
130 chrome.send('closePrintPreviewTab'); 173 chrome.send('closePrintPreviewTab');
131 } 174 }
132 175
133 /** 176 /**
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
324 var deviceName = ''; 367 var deviceName = '';
325 if (selectedPrinter >= 0) 368 if (selectedPrinter >= 0)
326 deviceName = printerList.options[selectedPrinter].value; 369 deviceName = printerList.options[selectedPrinter].value;
327 return deviceName; 370 return deviceName;
328 } 371 }
329 372
330 /** 373 /**
331 * Asks the browser to print the preview PDF based on current print settings. 374 * Asks the browser to print the preview PDF based on current print settings.
332 */ 375 */
333 function printFile() { 376 function printFile() {
377 hasPendingPrintFileRequest = hasPendingPreviewRequest;
378
379 if (hasPendingPrintFileRequest) {
380 if (getSelectedPrinterName() != PRINT_TO_PDF)
381 chrome.send('hidePreview');
382 return;
383 }
384
334 if (getSelectedPrinterName() != PRINT_TO_PDF) { 385 if (getSelectedPrinterName() != PRINT_TO_PDF) {
335 $('print-button').classList.add('loading'); 386 $('print-button').classList.add('loading');
336 $('cancel-button').classList.add('loading'); 387 $('cancel-button').classList.add('loading');
337 $('print-summary').innerHTML = localStrings.getString('printing'); 388 $('print-summary').innerHTML = localStrings.getString('printing');
338 removeEventListeners(); 389 removeEventListeners();
339 window.setTimeout(function() { chrome.send('print', [getSettingsJSON()]); }, 390 window.setTimeout(function() { chrome.send('print', [getSettingsJSON()]); },
340 1000); 391 1000);
341 } else 392 } else {
342 chrome.send('print', [getSettingsJSON()]); 393 chrome.send('print', [getSettingsJSON()]);
394 }
343 } 395 }
344 396
345 /** 397 /**
346 * Asks the browser to generate a preview PDF based on current print settings. 398 * Asks the browser to generate a preview PDF based on current print settings.
347 */ 399 */
348 function requestPrintPreview() { 400 function requestPrintPreview() {
401 hasPendingPreviewRequest = true;
349 removeEventListeners(); 402 removeEventListeners();
350 printSettings.save(); 403 printSettings.save();
351 showLoadingAnimation(); 404 showLoadingAnimation();
352 chrome.send('getPreview', [getSettingsJSON()]); 405 chrome.send('getPreview', [getSettingsJSON()]);
353 } 406 }
354 407
355 /** 408 /**
356 * Set the default printer. If there is one, generate a print preview. 409 * Set the default printer. If there is one, generate a print preview.
357 * @param {string} printer Name of the default printer. Empty if none. 410 * @param {string} printer Name of the default printer. Empty if none.
358 */ 411 */
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
434 return; 487 return;
435 } 488 }
436 pdfViewer.grayscale(!color); 489 pdfViewer.grayscale(!color);
437 } 490 }
438 491
439 /** 492 /**
440 * Display an error message in the center of the preview area. 493 * Display an error message in the center of the preview area.
441 * @param {string} errorMessage The error message to be displayed. 494 * @param {string} errorMessage The error message to be displayed.
442 */ 495 */
443 function displayErrorMessage(errorMessage) { 496 function displayErrorMessage(errorMessage) {
497 hasError = true;
498 $('print-button').disabled = true;
444 $('overlay-layer').classList.remove('invisible'); 499 $('overlay-layer').classList.remove('invisible');
445 $('dancing-dots-text').classList.add('hidden'); 500 $('dancing-dots-text').classList.add('hidden');
446 $('error-text').innerHTML = errorMessage; 501 $('error-text').innerHTML = errorMessage;
447 $('error-text').classList.remove('hidden'); 502 $('error-text').classList.remove('hidden');
448 removeEventListeners(); 503 removeEventListeners();
449 var pdfViewer = $('pdf-viewer'); 504 var pdfViewer = $('pdf-viewer');
450 if (pdfViewer) 505 if (pdfViewer)
451 $('mainview').removeChild(pdfViewer); 506 $('mainview').removeChild(pdfViewer);
452 } 507 }
453 508
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
501 * @param {string} jobTitle The print job title. 556 * @param {string} jobTitle The print job title.
502 * @param {boolean} modifiable If the preview is modifiable. 557 * @param {boolean} modifiable If the preview is modifiable.
503 * @param {string} previewUid Preview unique identifier. 558 * @param {string} previewUid Preview unique identifier.
504 */ 559 */
505 function updatePrintPreview(pageCount, jobTitle, modifiable, previewUid) { 560 function updatePrintPreview(pageCount, jobTitle, modifiable, previewUid) {
506 var tempPrintSettings = new PrintSettings(); 561 var tempPrintSettings = new PrintSettings();
507 tempPrintSettings.save(); 562 tempPrintSettings.save();
508 563
509 previewModifiable = modifiable; 564 previewModifiable = modifiable;
510 565
566 hasPendingPreviewRequest = false;
567
511 if (totalPageCount == -1) 568 if (totalPageCount == -1)
512 totalPageCount = pageCount; 569 totalPageCount = pageCount;
513 570
514 if (previouslySelectedPages.length == 0) 571 if (previouslySelectedPages.length == 0)
515 for (var i = 0; i < totalPageCount; i++) 572 for (var i = 0; i < totalPageCount; i++)
516 previouslySelectedPages.push(i+1); 573 previouslySelectedPages.push(i+1);
517 574
518 if (printSettings.deviceName != tempPrintSettings.deviceName) { 575 if (printSettings.deviceName != tempPrintSettings.deviceName) {
519 updateControlsWithSelectedPrinterCapabilities(); 576 updateControlsWithSelectedPrinterCapabilities();
520 return; 577 return;
(...skipping 12 matching lines...) Expand all
533 if (!isSelectedPagesValid()) 590 if (!isSelectedPagesValid())
534 pageRangesFieldChanged(); 591 pageRangesFieldChanged();
535 592
536 // Update the current tab title. 593 // Update the current tab title.
537 document.title = localStrings.getStringF('printPreviewTitleFormat', jobTitle); 594 document.title = localStrings.getStringF('printPreviewTitleFormat', jobTitle);
538 595
539 createPDFPlugin(previewUid); 596 createPDFPlugin(previewUid);
540 updatePrintSummary(); 597 updatePrintSummary();
541 updatePrintButtonState(); 598 updatePrintButtonState();
542 addEventListeners(); 599 addEventListeners();
600
601 if (hasPendingPrintFileRequest)
602 printFile();
543 } 603 }
544 604
545 /** 605 /**
546 * Create the PDF plugin or reload the existing one. 606 * Create the PDF plugin or reload the existing one.
547 * @param {string} previewUid Preview unique identifier. 607 * @param {string} previewUid Preview unique identifier.
548 */ 608 */
549 function createPDFPlugin(previewUid) { 609 function createPDFPlugin(previewUid) {
550 // Enable the print button. 610 // Enable the print button.
551 if (!$('printer-list').disabled) { 611 if (!$('printer-list').disabled) {
552 $('print-button').disabled = false; 612 $('print-button').disabled = false;
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
611 /** 671 /**
612 * Listener function that executes whenever a change occurs in the 'copies' 672 * Listener function that executes whenever a change occurs in the 'copies'
613 * field. 673 * field.
614 */ 674 */
615 function copiesFieldChanged() { 675 function copiesFieldChanged() {
616 updateCopiesButtonsState(); 676 updateCopiesButtonsState();
617 $('collate-option').hidden = getCopies() <= 1; 677 $('collate-option').hidden = getCopies() <= 1;
618 } 678 }
619 679
620 /** 680 /**
621 * Executes whenever a blur event occurs on the 'individual-pages' 681 * Validates the page ranges text and updates the hint accordingly.
622 * field or when the timer expires. It takes care of
623 * 1) showing/hiding warnings/suggestions
624 * 2) updating print button/summary
625 */ 682 */
626 function pageRangesFieldChanged() { 683 function validatePageRangesField() {
627 var currentlySelectedPages = getSelectedPagesSet();
628 var individualPagesField = $('individual-pages'); 684 var individualPagesField = $('individual-pages');
629 var individualPagesHint = $('individual-pages-hint'); 685 var individualPagesHint = $('individual-pages-hint');
630 686
631 if (isSelectedPagesValid()) { 687 if (isSelectedPagesValid()) {
632 individualPagesField.classList.remove('invalid'); 688 individualPagesField.classList.remove('invalid');
633 fadeOutElement(individualPagesHint); 689 fadeOutElement(individualPagesHint);
634 } else { 690 } else {
635 individualPagesField.classList.add('invalid'); 691 individualPagesField.classList.add('invalid');
636 individualPagesHint.classList.remove('suggestion'); 692 individualPagesHint.classList.remove('suggestion');
637 individualPagesHint.innerHTML = 693 individualPagesHint.innerHTML =
638 localStrings.getStringF('pageRangeInstruction', 694 localStrings.getStringF('pageRangeInstruction',
639 localStrings.getString( 695 localStrings.getString(
640 'examplePageRangeText')); 696 'examplePageRangeText'));
641 fadeInElement(individualPagesHint); 697 fadeInElement(individualPagesHint);
642 } 698 }
699 }
700
701 /**
702 * Executes whenever a blur event occurs on the 'individual-pages'
703 * field or when the timer expires. It takes care of
704 * 1) showing/hiding warnings/suggestions
705 * 2) updating print button/summary
706 */
707 function pageRangesFieldChanged() {
708 validatePageRangesField();
643 709
644 resetPageRangeFieldTimer(); 710 resetPageRangeFieldTimer();
645 updatePrintButtonState(); 711 updatePrintButtonState();
646 updatePrintSummary(); 712 updatePrintSummary();
647 } 713 }
648 714
649 /** 715 /**
650 * Updates the state of the increment/decrement buttons based on the current 716 * Updates the state of the increment/decrement buttons based on the current
651 * 'copies' value. 717 * 'copies' value.
652 */ 718 */
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
811 var successfullyParsed = 0; 877 var successfullyParsed = 0;
812 var parts = pageText.split(/,/); 878 var parts = pageText.split(/,/);
813 879
814 for (var i = 0; i < parts.length; ++i) { 880 for (var i = 0; i < parts.length; ++i) {
815 var part = parts[i].replace(/\s*/g, ''); 881 var part = parts[i].replace(/\s*/g, '');
816 if (part.length == 0) 882 if (part.length == 0)
817 continue; 883 continue;
818 884
819 var match = part.match(/^([0-9]+)-([0-9]*)$/); 885 var match = part.match(/^([0-9]+)-([0-9]*)$/);
820 if (match && isValidNonZeroPositiveInteger(match[1])) { 886 if (match && isValidNonZeroPositiveInteger(match[1])) {
887 if (!match[2] && totalPageCount == -1) {
888 successfullyParsed += 1;
889 continue;
890 }
821 var from = parseInt(match[1], 10); 891 var from = parseInt(match[1], 10);
822 var to = match[2] ? parseInt(match[2], 10) : totalPageCount; 892 var to = match[2] ? parseInt(match[2], 10) : totalPageCount;
823 893
824 if (!to || from > to) 894 if (!to || from > to)
825 return false; 895 return false;
826 } else if (!isValidNonZeroPositiveInteger(part) || 896 } else if (!isValidNonZeroPositiveInteger(part) || (totalPageCount != -1 &&
827 !(parseInt(part, 10) <= totalPageCount)) { 897 !(parseInt(part, 10) <= totalPageCount))) {
828 return false; 898 return false;
829 } 899 }
830 successfullyParsed += 1; 900 successfullyParsed += 1;
831 } 901 }
832 return successfullyParsed > 0 902 return successfullyParsed > 0
833 } 903 }
834 904
835 /** 905 /**
836 * Returns true if |value| is a valid non zero positive integer. 906 * Returns true if |value| is a valid non zero positive integer.
837 * @param {string} value The string to be tested. 907 * @param {string} value The string to be tested.
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
967 this.isLandscape = ''; 1037 this.isLandscape = '';
968 } 1038 }
969 1039
970 /** 1040 /**
971 * Takes a snapshot of the print settings. 1041 * Takes a snapshot of the print settings.
972 */ 1042 */
973 PrintSettings.prototype.save = function() { 1043 PrintSettings.prototype.save = function() {
974 this.deviceName = getSelectedPrinterName(); 1044 this.deviceName = getSelectedPrinterName();
975 this.isLandscape = isLandscape(); 1045 this.isLandscape = isLandscape();
976 } 1046 }
OLDNEW
« no previous file with comments | « chrome/browser/printing/print_preview_tab_controller_unittest.cc ('k') | chrome/browser/ui/webui/print_preview_handler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698