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

Unified Diff: chrome/browser/resources/print_preview/print_preview.js

Issue 7647010: Print preview page selection should not require a rerendering of draft pages. (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Fixed comment Created 9 years, 4 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/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"/>

Powered by Google App Engine
This is Rietveld 408576698