| Index: chrome/browser/resources/print_preview/print_preview.js
|
| diff --git a/chrome/browser/resources/print_preview/print_preview.js b/chrome/browser/resources/print_preview/print_preview.js
|
| index 47c455d1bbe3752074401d25d87bb44b1681269b..e6dfa3334bb39e663626421c5fd8ea531248b4aa 100644
|
| --- a/chrome/browser/resources/print_preview/print_preview.js
|
| +++ b/chrome/browser/resources/print_preview/print_preview.js
|
| @@ -24,9 +24,6 @@ const MORE_PRINTERS = 'morePrinters';
|
| const SIGN_IN = 'signIn';
|
| const PRINT_TO_PDF = 'Print to PDF';
|
|
|
| -// State of the print preview settings.
|
| -var printSettings = new PrintSettings();
|
| -
|
| // The name of the default or last used printer.
|
| var defaultOrLastUsedPrinterName = '';
|
|
|
| @@ -36,6 +33,9 @@ var hasPendingPreviewRequest = false;
|
| // The ID of the last preview request.
|
| var lastPreviewRequestID = -1;
|
|
|
| +// The ID of the initial preview request.
|
| +var initialPreviewRequestID = -1;
|
| +
|
| // True when a pending print file request exists.
|
| var hasPendingPrintDocumentRequest = false;
|
|
|
| @@ -74,12 +74,17 @@ var addedCloudPrinters = {};
|
| // The maximum number of cloud printers to allow in the dropdown.
|
| const maxCloudPrinters = 10;
|
|
|
| +const MIN_REQUEST_ID = 0;
|
| +const MAX_REQUEST_ID = 32000;
|
| +
|
| /**
|
| * Window onload handler, sets up the page and starts print preview by getting
|
| * the printer list.
|
| */
|
| function onLoad() {
|
| cr.enablePlatformSpecificCSSRules();
|
| + initialPreviewRequestID = randomInteger(MIN_REQUEST_ID, MAX_REQUEST_ID);
|
| + lastPreviewRequestID = initialPreviewRequestID;
|
|
|
| if (!checkCompatiblePluginExists()) {
|
| disableInputElementsInSidebar();
|
| @@ -105,31 +110,13 @@ function onLoad() {
|
| copiesSettings.addEventListeners();
|
| layoutSettings.addEventListeners();
|
| colorSettings.addEventListeners();
|
| + $('printer-list').onchange = updateControlsWithSelectedPrinterCapabilities;
|
|
|
| showLoadingAnimation();
|
| chrome.send('getDefaultPrinter');
|
| }
|
|
|
| /**
|
| - * Adds event listeners to the settings controls.
|
| - */
|
| -function addEventListeners() {
|
| - // Controls that require preview rendering.
|
| - $('printer-list').onchange = updateControlsWithSelectedPrinterCapabilities;
|
| -}
|
| -
|
| -/**
|
| - * Removes event listeners from the settings controls.
|
| - */
|
| -function removeEventListeners() {
|
| - if (pageSettings)
|
| - clearTimeout(pageSettings.timerId_);
|
| -
|
| - // Controls that require preview rendering
|
| - $('printer-list').onchange = null;
|
| -}
|
| -
|
| -/**
|
| * Disables the input elements in the sidebar.
|
| */
|
| function disableInputElementsInSidebar() {
|
| @@ -304,14 +291,14 @@ function getSettings() {
|
| var settings =
|
| {'deviceName': deviceName,
|
| 'pageRange': pageSettings.selectedPageRanges,
|
| - 'printAll': pageSettings.allPagesRadioButton.checked,
|
| 'duplex': copiesSettings.duplexMode,
|
| 'copies': copiesSettings.numberOfCopies,
|
| 'collate': copiesSettings.isCollated(),
|
| 'landscape': layoutSettings.isLandscape(),
|
| 'color': colorSettings.isColor(),
|
| 'printToPDF': printToPDF,
|
| - 'requestID': 0};
|
| + 'isFirstRequest' : false,
|
| + 'requestID': -1};
|
|
|
| var printerList = $('printer-list');
|
| var selectedPrinter = printerList.selectedIndex;
|
| @@ -323,6 +310,21 @@ function getSettings() {
|
| }
|
|
|
| /**
|
| + * Creates an object based on the values in the printer settings.
|
| + * Note: |lastPreviewRequestID| is being modified every time this function is
|
| + * called. Only call this function when a preview request is actually sent,
|
| + * otherwise (for example when debugging) call getSettings().
|
| + *
|
| + * @return {Object} Object containing print job settings.
|
| + */
|
| +function getSettingsWithRequestID() {
|
| + var settings = getSettings();
|
| + settings.requestID = generatePreviewRequestID();
|
| + settings.isFirstRequest = isFirstPreviewRequest();
|
| + return settings;
|
| +}
|
| +
|
| +/**
|
| * @return {number} The next unused preview request id.
|
| */
|
| function generatePreviewRequestID() {
|
| @@ -333,7 +335,15 @@ function generatePreviewRequestID() {
|
| * @return {boolean} True iff a preview has been requested.
|
| */
|
| function hasRequestedPreview() {
|
| - return lastPreviewRequestID > -1;
|
| + return lastPreviewRequestID != initialPreviewRequestID;
|
| +}
|
| +
|
| +/**
|
| + * @return {boolean} True if |lastPreviewRequestID| corresponds to the initial
|
| + * preview request.
|
| + */
|
| +function isFirstPreviewRequest() {
|
| + return lastPreviewRequestID == initialPreviewRequestID + 1;
|
| }
|
|
|
| /**
|
| @@ -381,7 +391,6 @@ function requestToPrintDocument() {
|
| if (printToPDF) {
|
| sendPrintDocumentRequest();
|
| } else {
|
| - removeEventListeners();
|
| window.setTimeout(function() { sendPrintDocumentRequest(); }, 1000);
|
| }
|
| }
|
| @@ -425,14 +434,11 @@ function sendPrintDocumentRequest() {
|
| */
|
| function requestPrintPreview() {
|
| hasPendingPreviewRequest = true;
|
| - removeEventListeners();
|
| - printSettings.save();
|
| + layoutSettings.updateState();
|
| if (!isTabHidden)
|
| showLoadingAnimation();
|
|
|
| - var settings = getSettings();
|
| - settings.requestID = generatePreviewRequestID();
|
| - chrome.send('getPreview', [JSON.stringify(settings)]);
|
| + chrome.send('getPreview', [JSON.stringify(getSettingsWithRequestID())]);
|
| }
|
|
|
| /**
|
| @@ -731,7 +737,6 @@ function displayErrorMessage(errorMessage) {
|
| $('dancing-dots-text').classList.add('hidden');
|
| $('error-text').innerHTML = errorMessage;
|
| $('error-text').classList.remove('hidden');
|
| - removeEventListeners();
|
| var pdfViewer = $('pdf-viewer');
|
| if (pdfViewer)
|
| $('mainview').removeChild(pdfViewer);
|
| @@ -774,7 +779,6 @@ function printPreviewFailed() {
|
| function onPDFLoad() {
|
| if (previewModifiable) {
|
| setPluginPreviewPageCount();
|
| - cr.dispatchSimpleEvent(document, 'updateSummary');
|
| }
|
| $('pdf-viewer').fitToHeight();
|
| cr.dispatchSimpleEvent(document, 'PDFLoaded');
|
| @@ -792,25 +796,29 @@ function setPluginPreviewPageCount() {
|
| * @param {number} pageCount The number of pages.
|
| * @param {boolean} isModifiable Indicates whether the previewed document can be
|
| * modified.
|
| + * @param {number} previewResponseId The preview request id that resulted in
|
| + * this response.
|
| */
|
| -function onDidGetPreviewPageCount(pageCount, isModifiable) {
|
| +function onDidGetPreviewPageCount(pageCount, isModifiable, previewResponseId) {
|
| + if (!isExpectedPreviewResponse(previewResponseId))
|
| + return;
|
| pageSettings.updateState(pageCount);
|
| previewModifiable = isModifiable;
|
| + cr.dispatchSimpleEvent(document, 'updateSummary');
|
| }
|
|
|
| /**
|
| * Called when no pipelining previewed pages.
|
| + * @param {string} previewUid Preview unique identifier.
|
| + * @param {number} previewResponseId The preview request id that resulted in
|
| + * this response.
|
| */
|
| function reloadPreviewPages(previewUid, previewResponseId) {
|
| if (!isExpectedPreviewResponse(previewResponseId))
|
| return;
|
| hasPendingPreviewRequest = false;
|
|
|
| - if (checkIfSettingsChangedAndRegeneratePreview())
|
| - return;
|
| - cr.dispatchSimpleEvent(document, 'updateSummary');
|
| cr.dispatchSimpleEvent(document, 'updatePrintButton');
|
| - addEventListeners();
|
| hideLoadingAnimation();
|
| var pageSet = pageSettings.previouslySelectedPages;
|
| for (var i = 0; i < pageSet.length; i++)
|
| @@ -823,15 +831,21 @@ function reloadPreviewPages(previewUid, previewResponseId) {
|
| * Check if the settings have changed and request a regeneration if needed.
|
| * Called from PrintPreviewUI::OnDidPreviewPage().
|
| * @param {number} pageNumber The page number, 0-based.
|
| + * @param {string} previewUid Preview unique identifier.
|
| + * @param {number} previewResponseId The preview request id that resulted in
|
| + * this response.
|
| */
|
| -function onDidPreviewPage(pageNumber, previewUid) {
|
| +function onDidPreviewPage(pageNumber, previewUid, previewResponseId) {
|
| + if (!isExpectedPreviewResponse(previewResponseId))
|
| + return;
|
| +
|
| // Refactor
|
| if (!previewModifiable)
|
| return;
|
|
|
| var pageIndex = pageSettings.previouslySelectedPages.indexOf(pageNumber + 1);
|
|
|
| - if (checkIfSettingsChangedAndRegeneratePreview())
|
| + if (pageSettings.requestPrintPreviewIfNeeded())
|
| return;
|
| if (pageIndex == 0)
|
| createPDFPlugin(previewUid);
|
| @@ -857,9 +871,6 @@ function updatePrintPreview(jobTitle,
|
| return;
|
| hasPendingPreviewRequest = false;
|
|
|
| - if (checkIfSettingsChangedAndRegeneratePreview())
|
| - return;
|
| -
|
| document.title = localStrings.getStringF('printPreviewTitleFormat', jobTitle);
|
|
|
| if (!previewModifiable) {
|
| @@ -867,37 +878,13 @@ function updatePrintPreview(jobTitle,
|
| createPDFPlugin(previewUid);
|
| }
|
|
|
| - cr.dispatchSimpleEvent(document, 'updateSummary');
|
| cr.dispatchSimpleEvent(document, 'updatePrintButton');
|
| - addEventListeners();
|
|
|
| if (hasPendingPrintDocumentRequest)
|
| requestToPrintPendingDocument();
|
| }
|
|
|
| /**
|
| - * Check if any print settings changed and regenerate the preview if needed.
|
| - * @return {boolean} true if a new preview is required.
|
| - */
|
| -function checkIfSettingsChangedAndRegeneratePreview() {
|
| - var tempPrintSettings = new PrintSettings();
|
| - tempPrintSettings.save();
|
| -
|
| - if (printSettings.deviceName != tempPrintSettings.deviceName) {
|
| - updateControlsWithSelectedPrinterCapabilities();
|
| - return true;
|
| - }
|
| - if (printSettings.isLandscape != tempPrintSettings.isLandscape) {
|
| - setDefaultValuesAndRegeneratePreview();
|
| - return true;
|
| - }
|
| - if (pageSettings.requestPrintPreviewIfNeeded())
|
| - return true;
|
| -
|
| - return false;
|
| -}
|
| -
|
| -/**
|
| * Create the PDF plugin or reload the existing one.
|
| * @param {string} previewUid Preview unique identifier.
|
| */
|
| @@ -950,22 +937,6 @@ function setDefaultValuesAndRegeneratePreview() {
|
| requestPrintPreview();
|
| }
|
|
|
| -/**
|
| - * Class that represents the state of the print settings.
|
| - */
|
| -function PrintSettings() {
|
| - this.deviceName = '';
|
| - this.isLandscape = '';
|
| -}
|
| -
|
| -/**
|
| - * Takes a snapshot of the print settings.
|
| - */
|
| -PrintSettings.prototype.save = function() {
|
| - this.deviceName = getSelectedPrinterName();
|
| - this.isLandscape = layoutSettings.isLandscape();
|
| -}
|
| -
|
| /// Pull in all other scripts in a single shot.
|
| <include src="print_preview_animations.js"/>
|
| <include src="print_preview_cloud.js"/>
|
|
|