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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/resources/print_preview.js
diff --git a/chrome/browser/resources/print_preview.js b/chrome/browser/resources/print_preview.js
index 1c7e18e9be804841625c54ce45935e0dd9555fa9..96be84d4680bbeca0a23fdbcce6a2b574e4b9f7d 100644
--- a/chrome/browser/resources/print_preview.js
+++ b/chrome/browser/resources/print_preview.js
@@ -33,6 +33,15 @@ var printSettings = new PrintSettings();
// The name of the default or last used printer.
var defaultOrLastUsedPrinterName = '';
+// True when a pending print preview request exists.
+var hasPendingPreviewRequest = false;
+
+// True when a pending print file request exists.
+var hasPendingPrintFileRequest = false;
+
+// True when preview tab has some error.
+var hasError = false;
+
/**
* Window onload handler, sets up the page and starts print preview by getting
* the printer list.
@@ -51,17 +60,59 @@ function onLoad() {
$('mainview').parentElement.removeChild($('dummy-viewer'));
$('printer-list').disabled = true;
- $('print-button').disabled = true;
+ $('print-button').onclick = printFile;
+
+ setDefaultHandlersForPagesAndCopiesControls();
showLoadingAnimation();
chrome.send('getDefaultPrinter');
}
/**
+ * Handles the individual pages input event.
+ */
+function handleIndividualPagesInputEvent() {
+ $('print-pages').checked = true;
+ resetPageRangeFieldTimer();
+}
+
+/**
+ * Handles the individual pages blur event.
+ */
+function onPageRangesFieldBlur() {
+ $('print-pages').checked = true;
+ validatePageRangesField();
+ updatePrintButtonState();
+}
+
+/**
+ * Sets the default event handlers for pages and copies controls.
+ */
+function setDefaultHandlersForPagesAndCopiesControls() {
+ var allPages = $('all-pages');
+ var printPages = $('print-pages');
+ var individualPages = $('individual-pages');
+
+ allPages.onclick = null;
+ printPages.onclick = null;
+ individualPages.oninput = null;
+ individualPages.onfocus = null;
+ individualPages.onblur = null;
+
+ if (!hasError) {
+ allPages.onclick = updatePrintButtonState;
+ printPages.onclick = handleIndividualPagesCheckbox;
+ individualPages.onblur = onPageRangesFieldBlur;
+ }
+
+ $('copies').oninput = copiesFieldChanged;
+ $('increment').onclick = function() { onCopiesButtonsClicked(1); };
+ $('decrement').onclick = function() { onCopiesButtonsClicked(-1); };
+}
+
+/**
* Adds event listeners to the settings controls.
*/
function addEventListeners() {
- $('print-button').onclick = printFile;
-
// Controls that require preview rendering.
$('all-pages').onclick = onPageSelectionMayHaveChanged;
$('print-pages').onclick = handleIndividualPagesCheckbox;
@@ -71,7 +122,7 @@ function addEventListeners() {
onPageSelectionMayHaveChanged();
};
individualPages.onfocus = addTimerToPageRangeField;
- individualPages.oninput = resetPageRangeFieldTimer;
+ individualPages.oninput = handleIndividualPagesInputEvent;
$('landscape').onclick = onLayoutModeToggle;
$('portrait').onclick = onLayoutModeToggle;
$('printer-list').onchange = updateControlsWithSelectedPrinterCapabilities;
@@ -101,26 +152,18 @@ function addEventListeners() {
* Removes event listeners from the settings controls.
*/
function removeEventListeners() {
- // Controls that require preview rendering.
- $('print-button').disabled = true;
- $('all-pages').onclick = null;
- $('print-pages').onclick = null;
- var individualPages = $('individual-pages');
- individualPages.onblur = null;
- individualPages.onfocus = null;
- individualPages.oninput = null;
clearTimeout(timerId);
+ setDefaultHandlersForPagesAndCopiesControls();
+
+ // Controls that require preview rendering
$('landscape').onclick = null;
$('portrait').onclick = null;
$('printer-list').onchange = null;
// Controls that dont require preview rendering.
- $('copies').oninput = copiesFieldChanged;
$('two-sided').onclick = null;
$('color').onclick = null;
$('bw').onclick = null;
- $('increment').onclick = function() { onCopiesButtonsClicked(1); };
- $('decrement').onclick = function() { onCopiesButtonsClicked(-1); };
}
/**
@@ -331,6 +374,14 @@ function getSelectedPrinterName() {
* Asks the browser to print the preview PDF based on current print settings.
*/
function printFile() {
+ hasPendingPrintFileRequest = hasPendingPreviewRequest;
+
+ if (hasPendingPrintFileRequest) {
+ if (getSelectedPrinterName() != PRINT_TO_PDF)
+ chrome.send('hidePreview');
+ return;
+ }
+
if (getSelectedPrinterName() != PRINT_TO_PDF) {
$('print-button').classList.add('loading');
$('cancel-button').classList.add('loading');
@@ -338,14 +389,16 @@ function printFile() {
removeEventListeners();
window.setTimeout(function() { chrome.send('print', [getSettingsJSON()]); },
1000);
- } else
+ } else {
chrome.send('print', [getSettingsJSON()]);
+ }
}
/**
* Asks the browser to generate a preview PDF based on current print settings.
*/
function requestPrintPreview() {
+ hasPendingPreviewRequest = true;
removeEventListeners();
printSettings.save();
showLoadingAnimation();
@@ -441,6 +494,8 @@ function setColor(color) {
* @param {string} errorMessage The error message to be displayed.
*/
function displayErrorMessage(errorMessage) {
+ hasError = true;
+ $('print-button').disabled = true;
$('overlay-layer').classList.remove('invisible');
$('dancing-dots-text').classList.add('hidden');
$('error-text').innerHTML = errorMessage;
@@ -508,6 +563,8 @@ function updatePrintPreview(pageCount, jobTitle, modifiable, previewUid) {
previewModifiable = modifiable;
+ hasPendingPreviewRequest = false;
+
if (totalPageCount == -1)
totalPageCount = pageCount;
@@ -540,6 +597,9 @@ function updatePrintPreview(pageCount, jobTitle, modifiable, previewUid) {
updatePrintSummary();
updatePrintButtonState();
addEventListeners();
+
+ if (hasPendingPrintFileRequest)
+ printFile();
}
/**
@@ -618,13 +678,9 @@ function copiesFieldChanged() {
}
/**
- * Executes whenever a blur event occurs on the 'individual-pages'
- * field or when the timer expires. It takes care of
- * 1) showing/hiding warnings/suggestions
- * 2) updating print button/summary
+ * Validates the page ranges text and updates the hint accordingly.
*/
-function pageRangesFieldChanged() {
- var currentlySelectedPages = getSelectedPagesSet();
+function validatePageRangesField() {
var individualPagesField = $('individual-pages');
var individualPagesHint = $('individual-pages-hint');
@@ -640,6 +696,16 @@ function pageRangesFieldChanged() {
'examplePageRangeText'));
fadeInElement(individualPagesHint);
}
+}
+
+/**
+ * Executes whenever a blur event occurs on the 'individual-pages'
+ * field or when the timer expires. It takes care of
+ * 1) showing/hiding warnings/suggestions
+ * 2) updating print button/summary
+ */
+function pageRangesFieldChanged() {
+ validatePageRangesField();
resetPageRangeFieldTimer();
updatePrintButtonState();
@@ -818,13 +884,17 @@ function isSelectedPagesValid() {
var match = part.match(/^([0-9]+)-([0-9]*)$/);
if (match && isValidNonZeroPositiveInteger(match[1])) {
+ if (!match[2] && totalPageCount == -1) {
+ successfullyParsed += 1;
+ continue;
+ }
var from = parseInt(match[1], 10);
var to = match[2] ? parseInt(match[2], 10) : totalPageCount;
if (!to || from > to)
return false;
- } else if (!isValidNonZeroPositiveInteger(part) ||
- !(parseInt(part, 10) <= totalPageCount)) {
+ } else if (!isValidNonZeroPositiveInteger(part) || (totalPageCount != -1 &&
+ !(parseInt(part, 10) <= totalPageCount))) {
return false;
}
successfullyParsed += 1;
« 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