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 709922bc42c7161a61e3a825c26788b9dcc31f63..0b77fce551a84883962621bfc2a1ba75bd351dea 100644 |
--- a/chrome/browser/resources/print_preview/print_preview.js |
+++ b/chrome/browser/resources/print_preview/print_preview.js |
@@ -24,6 +24,12 @@ 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(); |
+ |
+// Print ready data index. |
+const PRINT_READY_DATA_INDEX = -1; |
+ |
// The name of the default or last used printer. |
var defaultOrLastUsedPrinterName = ''; |
@@ -39,6 +45,9 @@ var initialPreviewRequestID = -1; |
// True when a pending print file request exists. |
var hasPendingPrintDocumentRequest = false; |
+// True when a pending print ready document request exists. |
+var hasPendingPrintReadyDocumentRequest = false; |
+ |
// True when preview tab is hidden. |
var isTabHidden = false; |
@@ -68,6 +77,11 @@ var showingSystemDialog = false; |
var firstCloudPrintOptionPos = 0; |
var lastCloudPrintOptionPos = firstCloudPrintOptionPos; |
+// Store the current previewUid. |
+var currentPreviewUid = ''; |
+ |
+// True if we need to generate draft preview data. |
+var generateDraftData = true; |
// TODO(abodenha@chromium.org) A lot of cloud print specific logic has |
// made its way into this file. Refactor to create a cleaner boundary |
@@ -336,7 +350,8 @@ function getSettings() { |
'headerFooterEnabled': headerFooterSettings.hasHeaderFooter(), |
'defaultMarginsSelected': marginSettings.isDefaultMarginsSelected(), |
'margins': marginSettings.customMargins, |
- 'requestID': -1}; |
+ 'requestID': -1, |
+ 'generateDraftData': generateDraftData}; |
var printerList = $('printer-list'); |
var selectedPrinter = printerList.selectedIndex; |
@@ -413,7 +428,7 @@ function getSelectedPrinterName() { |
* called once the preview loads. |
*/ |
function requestToPrintDocument() { |
- hasPendingPrintDocumentRequest = hasPendingPreviewRequest; |
+ hasPendingPrintDocumentRequest = hasPendingPrintReadyDocumentRequest; |
var printToPDF = getSelectedPrinterName() == PRINT_TO_PDF; |
if (hasPendingPrintDocumentRequest) { |
@@ -468,15 +483,50 @@ function sendPrintDocumentRequest() { |
} |
/** |
+ * Loads the selected preview pages. |
+ */ |
+function loadSelectedPages() { |
+ hasPendingPreviewRequest = false; |
+ pageSettings.updatePageSelection(); |
+ var pageSet = pageSettings.previouslySelectedPages; |
+ var pageCount = pageSet.length; |
+ if (pageCount == 0 || currentPreviewUid == '') |
+ return; |
+ |
+ cr.dispatchSimpleEvent(document, 'updateSummary'); |
+ for (var i = 0; i < pageCount; i++) |
+ onDidPreviewPage(pageSet[i] - 1, currentPreviewUid, lastPreviewRequestID); |
+} |
+ |
+/** |
* Asks the browser to generate a preview PDF based on current print settings. |
*/ |
function requestPrintPreview() { |
- hasPendingPreviewRequest = true; |
- layoutSettings.updateState(); |
if (!isTabHidden) |
showLoadingAnimation(); |
- chrome.send('getPreview', [JSON.stringify(getSettingsWithRequestID())]); |
+ if (!hasPendingPreviewRequest && previewModifiable && |
+ hasOnlyPageSettingsChanged()) { |
+ loadSelectedPages(); |
+ generateDraftData = false; |
+ } else { |
+ hasPendingPreviewRequest = true; |
+ generateDraftData = true; |
+ pageSettings.updatePageSelection(); |
+ } |
+ |
+ printSettings.save(); |
+ layoutSettings.updateState(); |
+ hasPendingPrintReadyDocumentRequest = true; |
+ |
+ var totalPageCount = pageSettings.totalPageCount; |
+ if (!previewModifiable && totalPageCount > 0) |
+ generateDraftData = false; |
+ |
+ var pageCount = totalPageCount != undefined ? totalPageCount : -1; |
+ chrome.send('getPreview', [JSON.stringify(getSettingsWithRequestID()), |
+ String(pageCount), |
+ previewModifiable]); |
} |
/** |
@@ -890,12 +940,18 @@ function onDidPreviewPage(pageNumber, previewUid, previewResponseId) { |
if (!previewModifiable) |
return; |
- var pageIndex = pageSettings.previouslySelectedPages.indexOf(pageNumber + 1); |
- |
if (pageSettings.requestPrintPreviewIfNeeded()) |
return; |
- if (pageIndex == 0) |
- createPDFPlugin(previewUid); |
+ |
+ var pageIndex = pageSettings.previouslySelectedPages.indexOf(pageNumber + 1); |
+ if (pageIndex == -1) |
+ return; |
+ |
+ currentPreviewUid = previewUid; |
+ if (pageIndex == 0) { |
+ createPDFPlugin(pageNumber); |
+ hasPendingPreviewRequest = false; |
+ } |
$('pdf-viewer').loadPreviewPage( |
getPageSrcURL(previewUid, pageNumber), pageIndex); |
@@ -914,10 +970,12 @@ function updatePrintPreview(previewUid, previewResponseId) { |
if (!isExpectedPreviewResponse(previewResponseId)) |
return; |
hasPendingPreviewRequest = false; |
+ hasPendingPrintReadyDocumentRequest = false; |
if (!previewModifiable) { |
// If the preview is not modifiable the plugin has not been created yet. |
- createPDFPlugin(previewUid); |
+ currentPreviewUid = previewUid; |
+ createPDFPlugin(PRINT_READY_DATA_INDEX); |
} |
cr.dispatchSimpleEvent(document, 'updatePrintButton'); |
@@ -927,28 +985,43 @@ function updatePrintPreview(previewUid, previewResponseId) { |
} |
/** |
+ * Check if only page selection has been changed since the last preview request |
+ * and is valid. |
+ * @return {boolean} true if the new page selection is valid. |
+ */ |
+function hasOnlyPageSettingsChanged() { |
+ var tempPrintSettings = new PrintSettings(); |
+ tempPrintSettings.save(); |
+ |
+ return !!(printSettings.deviceName == tempPrintSettings.deviceName && |
+ printSettings.isLandscape == tempPrintSettings.isLandscape && |
+ printSettings.hasHeaderFooter == |
+ tempPrintSettings.hasHeaderFooter && |
+ pageSettings.hasPageSelectionChangedAndIsValid()); |
+} |
+ |
+/** |
* Create the PDF plugin or reload the existing one. |
- * @param {string} previewUid Preview unique identifier. |
+ * @param {number} srcDataIndex Preview data source index. |
*/ |
-function createPDFPlugin(previewUid) { |
+function createPDFPlugin(srcDataIndex) { |
var pdfViewer = $('pdf-viewer'); |
+ var srcURL = getPageSrcURL(currentPreviewUid, srcDataIndex); |
if (pdfViewer) { |
// Need to call this before the reload(), where the plugin resets its |
// internal page count. |
pdfViewer.goToPage('0'); |
+ pdfViewer.resetPrintPreviewUrl(srcURL); |
pdfViewer.reload(); |
pdfViewer.grayscale(!colorSettings.isColor()); |
return; |
} |
- // Get the complete preview document. |
- var dataIndex = previewModifiable ? '0' : '-1'; |
- |
pdfViewer = document.createElement('embed'); |
pdfViewer.setAttribute('id', 'pdf-viewer'); |
pdfViewer.setAttribute('type', |
'application/x-google-chrome-print-preview-pdf'); |
- pdfViewer.setAttribute('src', getPageSrcURL(previewUid, dataIndex)); |
+ pdfViewer.setAttribute('src', srcURL); |
pdfViewer.setAttribute('aria-live', 'polite'); |
pdfViewer.setAttribute('aria-atomic', 'true'); |
$('mainview').appendChild(pdfViewer); |
@@ -966,7 +1039,8 @@ function checkCompatiblePluginExists() { |
dummyPlugin.goToPage && |
dummyPlugin.removePrintButton && |
dummyPlugin.loadPreviewPage && |
- dummyPlugin.printPreviewPageCount); |
+ dummyPlugin.printPreviewPageCount && |
+ dummyPlugin.resetPrintPreviewUrl); |
} |
window.addEventListener('DOMContentLoaded', onLoad); |
@@ -982,6 +1056,24 @@ function setDefaultValuesAndRegeneratePreview(resetMargins) { |
requestPrintPreview(); |
} |
+/** |
+ * Class that represents the state of the print settings. |
+ */ |
+function PrintSettings() { |
+ this.deviceName = ''; |
+ this.isLandscape = ''; |
+ this.hasHeaderFooter = ''; |
+} |
+ |
+/** |
+ * Takes a snapshot of the print settings. |
+ */ |
+PrintSettings.prototype.save = function() { |
+ this.deviceName = getSelectedPrinterName(); |
+ this.isLandscape = layoutSettings.isLandscape(); |
+ this.hasHeaderFooter = headerFooterSettings.hasHeaderFooter(); |
+} |
+ |
/// Pull in all other scripts in a single shot. |
<include src="print_preview_animations.js"/> |
<include src="print_preview_cloud.js"/> |