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

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: Addressed review comments 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 7118615fcf1abd994fc2ab2ca60befd4356448ce..10a62640e618d636b02df56ece6a8b0cd69496a3 100644
--- a/chrome/browser/resources/print_preview.js
+++ b/chrome/browser/resources/print_preview.js
@@ -30,6 +30,18 @@ const MANAGE_PRINTERS = 'Manage Printers';
// State of the print preview settings.
var printSettings = new PrintSettings();
+// True when a pending print preview request exists.
+var hasPendingPreviewRequest = false;
+
+// True when a pending print file request exists.
+var hasPendingPrintFileRequest = false;
+
+// True when a compatible plugin exists.
+var hasCompatiblePlugin = true;
+
+// True when initiator tab is closed.
+var isInitiatorTabClosed = false;
+
/**
* Window onload handler, sets up the page and starts print preview by getting
* the printer list.
@@ -39,6 +51,7 @@ function onLoad() {
$('cancel-button').addEventListener('click', handleCancelButtonClick);
if (!checkCompatiblePluginExists()) {
+ hasCompatiblePlugin = false;
displayErrorMessage(localStrings.getString('noPlugin'), false);
$('mainview').parentElement.removeChild($('dummy-viewer'));
return;
@@ -46,17 +59,72 @@ function onLoad() {
$('mainview').parentElement.removeChild($('dummy-viewer'));
$('printer-list').disabled = true;
- $('print-button').disabled = true;
+ $('print-button').onclick = printFile;
+
+ setDefaultHandlersForCopiesControls();
+ setDefaultHandlersForPagesControls();
showLoadingAnimation();
chrome.send('getDefaultPrinter');
}
/**
+ * Handles all pages checkbox click event.
+ */
+function handleAllPagesCheckbox() {
+ updatePrintButtonState();
+}
+
+/**
+ * Validates the individual pages text format.
+ */
+function validateIndividualPagesText() {
+ $('print-pages').checked = true;
+ validatePageRangesField();
+ updatePrintButtonState();
+}
+
+/**
+ * Handles the individual pages input event.
+ */
+function handleIndividualPagesInputEvent() {
+ $('print-pages').checked = true;
+ resetPageRangeFieldTimer();
+}
+
+/**
+ * Sets the default event handlers for pages controls.
+ */
+function setDefaultHandlersForPagesControls() {
+ 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 (hasCompatiblePlugin && !isInitiatorTabClosed) {
+ allPages.onclick = handleAllPagesCheckbox;
+ printPages.onclick = handleIndividualPagesCheckbox;
+ individualPages.onblur = validateIndividualPagesText;
+ }
+}
+
+/**
+ * Sets the default event handlers for copies controls.
+ */
+function setDefaultHandlersForCopiesControls() {
+ $('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;
@@ -66,7 +134,7 @@ function addEventListeners() {
onPageSelectionMayHaveChanged();
};
individualPages.onfocus = addTimerToPageRangeField;
- individualPages.oninput = resetPageRangeFieldTimer;
+ individualPages.oninput = handleIndividualPagesInputEvent;
$('landscape').onclick = onLayoutModeToggle;
$('portrait').onclick = onLayoutModeToggle;
$('printer-list').onchange = updateControlsWithSelectedPrinterCapabilities;
@@ -96,26 +164,19 @@ 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);
+
+ // Controls that require preview rendering
+ setDefaultHandlersForPagesControls();
$('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); };
+ setDefaultHandlersForCopiesControls();
}
/**
@@ -138,6 +199,7 @@ function showSystemDialog() {
* @param {string} initiatorTabURL The URL of the initiator tab.
*/
function onInitiatorTabClosed(initiatorTabURL) {
+ isInitiatorTabClosed = true;
$('reopen-page').addEventListener('click', function() {
window.location = initiatorTabURL;
});
@@ -326,6 +388,14 @@ function getSelectedPrinterName() {
* Asks the browser to print the preview PDF based on current print settings.
*/
function printFile() {
+ hasPendingPrintFileRequest = hasPendingPreviewRequest ? true : false;
+
+ 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');
@@ -333,14 +403,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();
@@ -442,6 +514,7 @@ function setColor(color) {
* should be displayed.
*/
function displayErrorMessage(errorMessage, showButton) {
+ $('print-button').disabled = true;
$('overlay-layer').classList.remove('invisible');
$('dancing-dots-text').classList.add('hidden');
$('error-text').innerHTML = errorMessage;
@@ -497,6 +570,8 @@ function updatePrintPreview(pageCount, jobTitle, modifiable, previewUid) {
previewModifiable = modifiable;
+ hasPendingPreviewRequest = false;
+
if (totalPageCount == -1)
totalPageCount = pageCount;
@@ -526,6 +601,12 @@ function updatePrintPreview(pageCount, jobTitle, modifiable, previewUid) {
document.title = localStrings.getStringF('printPreviewTitleFormat', jobTitle);
createPDFPlugin(previewUid);
+
+ if (hasPendingPrintFileRequest) {
+ printFile();
+ return;
+ }
+
updatePrintSummary();
updatePrintButtonState();
addEventListeners();
@@ -607,13 +688,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');
var validityLevel = getSelectedPagesValidityLevel();
@@ -630,6 +707,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();
@@ -810,21 +897,44 @@ function getSelectedPagesValidityLevel() {
continue;
var match = part.match(/^([0-9]+)-([0-9]*)$/);
- if (match && match[1]) {
- var from = parseInt(match[1], 10);
- var to = match[2] ? parseInt(match[2], 10) : totalPageCount;
-
- if (from && to && from <= to)
+ if (totalPageCount != -1) {
+ if (match && match[1]) {
+ var from = parseInt(match[1], 10);
+ var to = match[2] ? parseInt(match[2], 10) : totalPageCount;
+
+ if (from && to && from <= to)
+ successfullyParsed += 1;
+ else
+ failedToParse += 1;
+ } else if (isValidNonZeroPositiveInteger(part) &&
+ parseInt(part, 10) <= totalPageCount) {
successfullyParsed += 1;
- else
+ } else {
failedToParse += 1;
-
- } else if (isInteger(part) && parseInt(part, 10) <= totalPageCount &&
- parseInt(part, 10) > 0)
- successfullyParsed += 1;
- else
- failedToParse += 1;
+ }
+ } else {
+ // totalPageCount is -1. Just validate the page range format.
+ if (match && isValidNonZeroPositiveInteger(match[1])) {
+ if (match[2]) {
+ if (isValidNonZeroPositiveInteger(match[2])) {
+ if (parseInt(match[1], 10) <= parseInt(match[2], 10))
+ successfullyParsed += 1;
+ else
+ failedToParse += 1;
+ } else {
+ failedToParse += 1;
+ }
+ } else {
+ successfullyParsed += 1;
+ }
+ } else if (isValidNonZeroPositiveInteger(part)) {
+ successfullyParsed += 1;
+ } else {
+ failedToParse += 1;
+ }
+ }
}
+
if (successfullyParsed > 0 && failedToParse == 0)
return 1;
else if (successfullyParsed > 0 && failedToParse > 0)
@@ -833,6 +943,14 @@ function getSelectedPagesValidityLevel() {
return -1;
}
+/**
+ * Returns true if |value| is a valid non zero positive integer.
+ * @param {string} value The string to be tested.
+ */
+function isValidNonZeroPositiveInteger(value) {
+ return isInteger(value) && parseInt(value, 10) > 0;
+}
+
function isSelectedPagesFieldValid() {
return (getSelectedPages().length != 0)
}
« no previous file with comments | « chrome/browser/printing/print_preview_tab_controller.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