| 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 f47cb296fa36e2e052bef3ad30f90d40f3c2fe08..ed78cfc9b83628a43443d1bac002b275655996cc 100644
|
| --- a/chrome/browser/resources/print_preview/print_preview.js
|
| +++ b/chrome/browser/resources/print_preview/print_preview.js
|
| @@ -2,1267 +2,916 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -// require: cr/ui/print_preview_cloud.js
|
| +// TODO(rltoscano): Might be a problem where might be in fetching destinations
|
| +// state, then to file selection state, then cancel, which results in the
|
| +// fetching destinations state being lost.
|
|
|
| -var localStrings = new LocalStrings();
|
| -
|
| -// If useCloudPrint is true we attempt to connect to cloud print
|
| -// and populate the list of printers with cloud print printers.
|
| -var useCloudPrint = false;
|
| -
|
| -// Store the last selected printer index.
|
| -var lastSelectedPrinterIndex = 0;
|
| -
|
| -// Used to disable some printing options when the preview is not modifiable.
|
| -var previewModifiable = false;
|
| -
|
| -// Used to identify whether the printing frame has specific page size style.
|
| -var hasPageSizeStyle = false;
|
| -
|
| -// Destination list special value constants.
|
| -
|
| -/** @const */ var MANAGE_CLOUD_PRINTERS = 'manageCloudPrinters';
|
| -/** @const */ var MANAGE_LOCAL_PRINTERS = 'manageLocalPrinters';
|
| -/** @const */ var SIGN_IN = 'signIn';
|
| -/** @const */ var PRINT_TO_PDF = 'Save as PDF';
|
| -/** @const */ var PRINT_WITH_CLOUD_PRINT = 'printWithCloudPrint';
|
| -
|
| -// State of the print preview settings.
|
| -var printSettings = new PrintSettings();
|
| -
|
| -// Print ready data index.
|
| -/** @const */ var PRINT_READY_DATA_INDEX = -1;
|
| -
|
| -// The name of the default or last used printer.
|
| -var defaultOrLastUsedPrinterName = '';
|
| -
|
| -// True when a pending print preview request exists.
|
| -var hasPendingPreviewRequest = false;
|
| -
|
| -// True when the first page is loaded in the plugin.
|
| -var isFirstPageLoaded = 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;
|
| +// TODO(rltoscano): Move data/* into print_preview.data namespace
|
|
|
| -// True when the complete metafile for the previewed doc is ready.
|
| -var isPrintReadyMetafileReady = false;
|
| +// TODO(rltoscano): Handle case where cloud print is initial destination, but
|
| +// cloud print is not enabled.
|
|
|
| -// True when preview tab is hidden.
|
| -var isTabHidden = false;
|
| -
|
| -// True in kiosk mode where print preview can print automatically without
|
| -// user intervention. See http://crbug.com/31395.
|
| -var printAutomaticallyInKioskMode = false;
|
| -
|
| -// @type {print_preview.PrintHeader} Holds the print and cancel buttons.
|
| -var printHeader;
|
| -
|
| -// @type {print_preview.PageSettings} Holds all the pages related settings.
|
| -var pageSettings;
|
| +var localStrings = new LocalStrings();
|
|
|
| -// @type {print_preview.CopiesSettings} Holds all the copies related settings.
|
| -var copiesSettings;
|
| -
|
| -// @type {print_preview.LayoutSettings} Holds all the layout related settings.
|
| -var layoutSettings;
|
| -
|
| -// @type {print_preview.MarginSettings} Holds all the margin related settings.
|
| -var marginSettings;
|
| -
|
| -// @type {print_preview.HeaderFooterSettings} Holds all the header footer
|
| -// related settings.
|
| -var headerFooterSettings;
|
| -
|
| -// @type {print_preview.FitToPageSettings} Holds all the fit to page related
|
| -// settings.
|
| -var fitToPageSettings;
|
| -
|
| -// @type {print_preview.MoreOptions} Holds the more options implementation.
|
| -var moreOptions;
|
| -
|
| -// @type {print_preview.ColorSettings} Holds all the color related settings.
|
| -var colorSettings;
|
| -
|
| -// @type {print_preview.PreviewArea} Holds information related to the preview
|
| -// area (on the right).
|
| -var previewArea;
|
| -
|
| -// True if the user has click 'Advanced...' in order to open the system print
|
| -// dialog.
|
| -var showingSystemDialog = false;
|
| -
|
| -// True if the user has clicked 'Open PDF in Preview' option.
|
| -var previewAppRequested = false;
|
| -
|
| -// The range of options in the printer dropdown controlled by cloud print.
|
| -var firstCloudPrintOptionPos = 0;
|
| -var lastCloudPrintOptionPos = firstCloudPrintOptionPos;
|
| -
|
| -// Store the current previewUid.
|
| -var currentPreviewUid = '';
|
| -
|
| -// True if we need to generate draft preview data.
|
| -var generateDraftData = true;
|
| -
|
| -// The last element clicked with the mouse.
|
| -var lastClickedElement = null;
|
| -
|
| -// A dictionary of cloud printers that have been added to the printer
|
| -// dropdown.
|
| -var addedCloudPrinters = {};
|
| -
|
| -// The maximum number of cloud printers to allow in the dropdown.
|
| -/** @const */ var maxCloudPrinters = 10;
|
| -
|
| -/** @const */ var MIN_REQUEST_ID = 0;
|
| -/** @const */ var MAX_REQUEST_ID = 32000;
|
| -
|
| -// Names of all the custom events used.
|
| -var customEvents = {
|
| - // Fired when the header footer option visibility changed.
|
| - HEADER_FOOTER_VISIBILITY_CHANGED: 'headerFooterVisibilityChanged',
|
| - // Fired when the mouse moves while a margin line is being dragged.
|
| - MARGIN_LINE_DRAG: 'marginLineDrag',
|
| - // Fired when a mousedown event occurs on a margin line.
|
| - MARGIN_LINE_MOUSE_DOWN: 'marginLineMouseDown',
|
| - // Fired when a margin textbox gains focus.
|
| - MARGIN_TEXTBOX_FOCUSED: 'marginTextboxFocused',
|
| - // Fired when a new preview might be needed because of margin changes.
|
| - MARGINS_MAY_HAVE_CHANGED: 'marginsMayHaveChanged',
|
| - // Fired when a pdf generation related error occurs.
|
| - PDF_GENERATION_ERROR: 'PDFGenerationError',
|
| - // Fired once the first page of the pdf document is loaded in the plugin.
|
| - PDF_LOADED: 'PDFLoaded',
|
| - // Fired when the selected printer capabilities change.
|
| - PRINTER_CAPABILITIES_UPDATED: 'printerCapabilitiesUpdated',
|
| - // Fired when the destination printer is changed.
|
| - PRINTER_SELECTION_CHANGED: 'printerSelectionChanged',
|
| - // Fired when the print button needs to be updated.
|
| - UPDATE_PRINT_BUTTON: 'updatePrintButton',
|
| - // Fired when the print summary needs to be updated.
|
| - UPDATE_SUMMARY: 'updateSummary'
|
| -};
|
| -
|
| -/**
|
| - * Window onload handler, sets up the page and starts print preview by getting
|
| - * the printer list.
|
| - */
|
| -function onLoad() {
|
| - initialPreviewRequestID = randomInteger(MIN_REQUEST_ID, MAX_REQUEST_ID);
|
| - lastPreviewRequestID = initialPreviewRequestID;
|
| -
|
| - previewArea = print_preview.PreviewArea.getInstance();
|
| - printHeader = print_preview.PrintHeader.getInstance();
|
| - document.addEventListener(customEvents.PDF_GENERATION_ERROR,
|
| - cancelPendingPrintRequest);
|
| - document.addEventListener('click', setLastClickedElement);
|
| -
|
| - if (!checkCompatiblePluginExists()) {
|
| - disableInputElementsInSidebar();
|
| - $('cancel-button').focus();
|
| - previewArea.displayErrorMessageWithButtonAndNotify(
|
| - localStrings.getString('noPlugin'),
|
| - localStrings.getString('launchNativeDialog'),
|
| - launchNativePrintDialog);
|
| - $('mainview').parentElement.removeChild($('dummy-viewer'));
|
| - return;
|
| - }
|
| -
|
| - $('system-dialog-link').addEventListener('click', onSystemDialogLinkClicked);
|
| - if (cr.isMac) {
|
| - $('open-pdf-in-preview-link').addEventListener(
|
| - 'click', onOpenPdfInPreviewLinkClicked);
|
| - }
|
| - $('mainview').parentElement.removeChild($('dummy-viewer'));
|
| -
|
| - $('printer-list').disabled = true;
|
| -
|
| - pageSettings = print_preview.PageSettings.getInstance();
|
| - copiesSettings = print_preview.CopiesSettings.getInstance();
|
| - layoutSettings = print_preview.LayoutSettings.getInstance();
|
| - marginSettings = print_preview.MarginSettings.getInstance();
|
| - headerFooterSettings = print_preview.HeaderFooterSettings.getInstance();
|
| - fitToPageSettings = print_preview.FitToPageSettings.getInstance();
|
| - moreOptions = print_preview.MoreOptions.getInstance();
|
| - colorSettings = print_preview.ColorSettings.getInstance();
|
| - $('printer-list').onchange = updateControlsWithSelectedPrinterCapabilities;
|
| -
|
| - previewArea.showLoadingAnimation();
|
| - chrome.send('getInitialSettings');
|
| -}
|
| -
|
| -/**
|
| - * @param {object} initialSettings An object containing all the initial
|
| - * settings.
|
| - */
|
| -function setInitialSettings(initialSettings) {
|
| - setInitiatorTabTitle(initialSettings['initiatorTabTitle']);
|
| - previewModifiable = initialSettings['previewModifiable'];
|
| - if (previewModifiable) {
|
| - print_preview.MarginSettings.setNumberFormatAndMeasurementSystem(
|
| - initialSettings['numberFormat'],
|
| - initialSettings['measurementSystem']);
|
| - marginSettings.setLastUsedMargins(initialSettings);
|
| - }
|
| - printAutomaticallyInKioskMode =
|
| - initialSettings['printAutomaticallyInKioskMode'];
|
| - headerFooterSettings.setChecked(initialSettings['headerFooterEnabled']);
|
| - copiesSettings.previousDuplexMode = initialSettings['duplex'];
|
| - setDefaultPrinter(initialSettings['printerName'],
|
| - initialSettings['cloudPrintData']);
|
| -}
|
| -
|
| -/**
|
| - * Disables the input elements in the sidebar.
|
| - */
|
| -function disableInputElementsInSidebar() {
|
| - var els = $('navbar-container').querySelectorAll('input, button, select');
|
| - for (var i = 0; i < els.length; i++) {
|
| - if (els[i] == printHeader.cancelButton)
|
| - continue;
|
| - els[i].disabled = true;
|
| - }
|
| -}
|
| -
|
| -/**
|
| - * Enables the input elements in the sidebar.
|
| - */
|
| -function enableInputElementsInSidebar() {
|
| - var els = $('navbar-container').querySelectorAll('input, button, select');
|
| - for (var i = 0; i < els.length; i++)
|
| - els[i].disabled = false;
|
| -}
|
| -
|
| -/**
|
| - * Keep track of the last element to receive a click.
|
| - * @param {Event} e The click event.
|
| - */
|
| -function setLastClickedElement(e) {
|
| - lastClickedElement = e.target;
|
| -}
|
| -
|
| -/**
|
| - * Disables the controls in the sidebar, shows the throbber and instructs the
|
| - * backend to open the native print dialog.
|
| - */
|
| -function onSystemDialogLinkClicked() {
|
| - if (showingSystemDialog)
|
| - return;
|
| - showingSystemDialog = true;
|
| - disableInputElementsInSidebar();
|
| - printHeader.disableCancelButton();
|
| - $('system-dialog-throbber').hidden = false;
|
| - chrome.send('showSystemDialog');
|
| -}
|
| -
|
| -/**
|
| - * Disables the controls in the sidebar, shows the throbber and instructs the
|
| - * backend to open the pdf in native preview app. This is only for Mac.
|
| - */
|
| -function onOpenPdfInPreviewLinkClicked() {
|
| - if (previewAppRequested)
|
| - return;
|
| - previewAppRequested = true;
|
| - disableInputElementsInSidebar();
|
| - $('open-preview-app-throbber').hidden = false;
|
| - printHeader.disableCancelButton();
|
| - requestToPrintDocument();
|
| -}
|
| -
|
| -/**
|
| - * Similar to onSystemDialogLinkClicked(), but specific to the
|
| - * 'Launch native print dialog' UI.
|
| - */
|
| -function launchNativePrintDialog() {
|
| - if (showingSystemDialog)
|
| - return;
|
| - showingSystemDialog = true;
|
| - previewArea.errorButton.disabled = true;
|
| - printHeader.disableCancelButton();
|
| - $('native-print-dialog-throbber').hidden = false;
|
| - chrome.send('showSystemDialog');
|
| -}
|
| -
|
| -/**
|
| - * Notifies listeners of |customEvents.PRINTER_SELECTION_CHANGED| event about
|
| - * the current selected printer.
|
| - */
|
| -function dispatchPrinterSelectionChangedEvent() {
|
| - var customEvent = cr.Event(customEvents.PRINTER_SELECTION_CHANGED);
|
| - customEvent.selectedPrinter = getSelectedPrinterName();
|
| - document.dispatchEvent(customEvent);
|
| -}
|
| -
|
| -/**
|
| - * Gets the selected printer capabilities and updates the controls accordingly.
|
| - */
|
| -function updateControlsWithSelectedPrinterCapabilities() {
|
| - var printerList = $('printer-list');
|
| - var selectedIndex = printerList.selectedIndex;
|
| - if (selectedIndex < 0)
|
| - return;
|
| - if (cr.isMac)
|
| - $('open-pdf-in-preview-link').disabled = false;
|
| -
|
| - var skip_refresh = false;
|
| - var selectedPrinterChanged = true;
|
| - var selectedValue = printerList.options[selectedIndex].value;
|
| - if (cloudprint.isCloudPrint(printerList.options[selectedIndex])) {
|
| - cloudprint.updatePrinterCaps(printerList.options[selectedIndex],
|
| - doUpdateCloudPrinterCapabilities);
|
| - skip_refresh = true;
|
| - } else if (selectedValue == SIGN_IN ||
|
| - selectedValue == MANAGE_CLOUD_PRINTERS ||
|
| - selectedValue == MANAGE_LOCAL_PRINTERS) {
|
| - printerList.selectedIndex = lastSelectedPrinterIndex;
|
| - chrome.send(selectedValue);
|
| - skip_refresh = true;
|
| - selectedPrinterChanged = false;
|
| - } else if (selectedValue == PRINT_TO_PDF ||
|
| - selectedValue == PRINT_WITH_CLOUD_PRINT) {
|
| - updateWithPrinterCapabilities({
|
| - 'disableColorOption': true,
|
| - 'setColorAsDefault': true,
|
| - 'setDuplexAsDefault': false,
|
| - 'printerColorModelForColor': print_preview.ColorSettings.COLOR,
|
| - 'printerDefaultDuplexValue': copiesSettings.UNKNOWN_DUPLEX_MODE,
|
| - 'disableCopiesOption': true});
|
| - if (cr.isChromeOS && selectedValue == PRINT_WITH_CLOUD_PRINT)
|
| - requestToPrintDocument();
|
| - } else {
|
| - // This message will call back to 'updateWithPrinterCapabilities'
|
| - // function.
|
| - chrome.send('getPrinterCapabilities', [selectedValue]);
|
| - }
|
| - if (selectedPrinterChanged)
|
| - dispatchPrinterSelectionChangedEvent();
|
| -
|
| - if (!skip_refresh) {
|
| - lastSelectedPrinterIndex = selectedIndex;
|
| -
|
| - // Regenerate the preview data based on selected printer settings.
|
| - // Do not reset the margins if no preview request has been made.
|
| - var resetMargins = lastPreviewRequestID != initialPreviewRequestID;
|
| - setDefaultValuesAndRegeneratePreview(resetMargins);
|
| - }
|
| -}
|
| -
|
| -/**
|
| - * Helper function to do the actual work of updating cloud printer
|
| - * capabilities.
|
| - * @param {Object} printer The printer object to set capabilities for.
|
| - */
|
| -function doUpdateCloudPrinterCapabilities(printer) {
|
| - var settings = {'disableColorOption': !cloudprint.supportsColor(printer),
|
| - 'setColorAsDefault': cloudprint.colorIsDefault(printer),
|
| - 'disableCopiesOption': true,
|
| - 'disableLandscapeOption': true};
|
| - updateWithPrinterCapabilities(settings);
|
| - var printerList = $('printer-list');
|
| - var selectedIndex = printerList.selectedIndex;
|
| - lastSelectedPrinterIndex = selectedIndex;
|
| -
|
| - // Regenerate the preview data based on selected printer settings.
|
| - // Do not reset the margins if no preview request has been made.
|
| - var resetMargins = lastPreviewRequestID != initialPreviewRequestID;
|
| - setDefaultValuesAndRegeneratePreview(resetMargins);
|
| -}
|
| -
|
| -/**
|
| - * Notifies listeners of |customEvents.PRINTER_CAPABILITIES_UPDATED| about the
|
| - * capabilities of the currently selected printer. It is called from C++ too.
|
| - * @param {Object} settingInfo printer setting information.
|
| - */
|
| -function updateWithPrinterCapabilities(settingInfo) {
|
| - var customEvent = new cr.Event(customEvents.PRINTER_CAPABILITIES_UPDATED);
|
| - customEvent.printerCapabilities = settingInfo;
|
| - document.dispatchEvent(customEvent);
|
| -}
|
| -
|
| -/**
|
| - * Reloads the printer list.
|
| - */
|
| -function reloadPrintersList() {
|
| - $('printer-list').length = 0;
|
| - firstCloudPrintOptionPos = 0;
|
| - lastCloudPrintOptionPos = 0;
|
| - chrome.send('getPrinters');
|
| -}
|
| -
|
| -/**
|
| - * Turn on the integration of Cloud Print.
|
| - * @param {string} cloudPrintURL The URL to use for cloud print servers.
|
| - */
|
| -function setUseCloudPrint(cloudPrintURL) {
|
| - useCloudPrint = true;
|
| - cloudprint.setBaseURL(cloudPrintURL);
|
| -}
|
| -
|
| -/**
|
| - * Take the PDF data handed to us and submit it to the cloud, closing the print
|
| - * preview tab once the upload is successful.
|
| - * @param {string} data Data to send as the print job.
|
| - */
|
| -function printToCloud(data) {
|
| - cloudprint.printToCloud(data, finishedCloudPrinting);
|
| -}
|
| -
|
| -/**
|
| - * Cloud print upload of the PDF file is finished, time to close the dialog.
|
| - */
|
| -function finishedCloudPrinting() {
|
| - closePrintPreviewTab();
|
| -}
|
| -
|
| -/**
|
| - * Updates the fit to page option state based on the print scaling option of
|
| - * source pdf. PDF's have an option to enable/disable print scaling. When we
|
| - * find out that the print scaling option is disabled for the source pdf, we
|
| - * uncheck the fit to page checkbox. This function is called from C++ code.
|
| - */
|
| -function printScalingDisabledForSourcePDF() {
|
| - fitToPageSettings.onPrintScalingDisabled();
|
| -}
|
| -
|
| -/**
|
| - * Checks whether the specified settings are valid.
|
| - *
|
| - * @return {boolean} true if settings are valid, false if not.
|
| - */
|
| -function areSettingsValid() {
|
| - var selectedPrinter = getSelectedPrinterName();
|
| - return pageSettings.isPageSelectionValid() &&
|
| - marginSettings.areMarginSettingsValid() &&
|
| - (copiesSettings.isValid() || selectedPrinter == PRINT_TO_PDF ||
|
| - selectedPrinter == PRINT_WITH_CLOUD_PRINT);
|
| -}
|
| -
|
| -/**
|
| - * Creates an object based on the values in the printer settings.
|
| - *
|
| - * @return {Object} Object containing print job settings.
|
| - */
|
| -function getSettings() {
|
| - var deviceName = getSelectedPrinterName();
|
| - var printToPDF = deviceName == PRINT_TO_PDF;
|
| - var printWithCloudPrint = deviceName == PRINT_WITH_CLOUD_PRINT;
|
| -
|
| - var settings =
|
| - {'deviceName': deviceName,
|
| - 'pageRange': pageSettings.selectedPageRanges,
|
| - 'duplex': copiesSettings.duplexMode,
|
| - 'copies': copiesSettings.numberOfCopies,
|
| - 'collate': copiesSettings.isCollated(),
|
| - 'landscape': layoutSettings.isLandscape(),
|
| - 'color': colorSettings.colorMode,
|
| - 'printToPDF': printToPDF,
|
| - 'printWithCloudPrint': printWithCloudPrint,
|
| - 'isFirstRequest' : false,
|
| - 'headerFooterEnabled': headerFooterSettings.hasHeaderFooter(),
|
| - 'marginsType': marginSettings.selectedMarginsValue,
|
| - 'requestID': -1,
|
| - 'generateDraftData': generateDraftData,
|
| - 'fitToPageEnabled': fitToPageSettings.hasFitToPage(),
|
| - 'previewModifiable': previewModifiable};
|
| -
|
| - if (marginSettings.isCustomMarginsSelected())
|
| - settings['marginsCustom'] = marginSettings.customMargins;
|
| -
|
| - var printerList = $('printer-list');
|
| - var selectedPrinter = printerList.selectedIndex;
|
| - if (cloudprint.isCloudPrint(printerList.options[selectedPrinter])) {
|
| - settings['cloudPrintID'] =
|
| - printerList.options[selectedPrinter].value;
|
| - }
|
| - return settings;
|
| -}
|
| -
|
| -/**
|
| - * 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() {
|
| - return ++lastPreviewRequestID;
|
| -}
|
| -
|
| -/**
|
| - * @return {boolean} True iff a preview has been requested.
|
| - */
|
| -function hasRequestedPreview() {
|
| - return lastPreviewRequestID != initialPreviewRequestID;
|
| -}
|
| -
|
| -/**
|
| - * @return {boolean} True if |lastPreviewRequestID| corresponds to the initial
|
| - * preview request.
|
| - */
|
| -function isFirstPreviewRequest() {
|
| - return lastPreviewRequestID == initialPreviewRequestID + 1;
|
| -}
|
| -
|
| -/**
|
| - * Checks if |previewResponseId| matches |lastPreviewRequestId|. Used to ignore
|
| - * obsolete preview data responses.
|
| - * @param {number} previewResponseId The id to check.
|
| - * @return {boolean} True if previewResponseId reffers to the expected response.
|
| - */
|
| -function isExpectedPreviewResponse(previewResponseId) {
|
| - return lastPreviewRequestID == previewResponseId;
|
| -}
|
| -
|
| -/**
|
| - * Returns the name of the selected printer or the empty string if no
|
| - * printer is selected.
|
| - * @return {string} The name of the currently selected printer.
|
| - */
|
| -function getSelectedPrinterName() {
|
| - var printerList = $('printer-list');
|
| - var selectedPrinter = printerList.selectedIndex;
|
| - if (selectedPrinter < 0)
|
| - return '';
|
| - return printerList.options[selectedPrinter].value;
|
| -}
|
| -
|
| -/**
|
| - * Asks the browser to print the preview PDF based on current print
|
| - * settings. If the preview is still loading, printPendingFile() will get
|
| - * called once the preview loads.
|
| - */
|
| -function requestToPrintDocument() {
|
| - hasPendingPrintDocumentRequest = !isPrintReadyMetafileReady;
|
| - var selectedPrinterName = getSelectedPrinterName();
|
| - var printToPDF = selectedPrinterName == PRINT_TO_PDF;
|
| - var printWithCloudPrint = selectedPrinterName == PRINT_WITH_CLOUD_PRINT;
|
| - if (hasPendingPrintDocumentRequest) {
|
| - if (previewAppRequested) {
|
| - previewArea.showCustomMessage(
|
| +<include src="component.js"/>
|
| +
|
| +cr.define('print_preview', function() {
|
| + 'use strict';
|
| +
|
| + /**
|
| + * Container class for Chromium's print preview.
|
| + * @constructor
|
| + * @extends {print_preview.Component}
|
| + */
|
| + function PrintPreview() {
|
| + print_preview.Component.call(this);
|
| +
|
| + /**
|
| + * Used to communicate with Chromium's print system.
|
| + * @type {!print_preview.NativeLayer}
|
| + * @private
|
| + */
|
| + this.nativeLayer_ = new print_preview.NativeLayer();
|
| +
|
| + /**
|
| + * Data store which holds print destinations.
|
| + * @type {!print_preview.DestinationStore}
|
| + * @private
|
| + */
|
| + this.destinationStore_ = new print_preview.DestinationStore();
|
| +
|
| + /**
|
| + * Storage of the print ticket used to create the print job.
|
| + * @type {!print_preview.PrintTicketStore}
|
| + * @private
|
| + */
|
| + this.printTicketStore_ = new print_preview.PrintTicketStore(
|
| + this.destinationStore_);
|
| +
|
| + /**
|
| + * Holds the print and cancel buttons and renders some document statistics.
|
| + * @type {!print_preview.PrintHeader}
|
| + * @private
|
| + */
|
| + this.printHeader_ = new print_preview.PrintHeader(
|
| + this.printTicketStore_, this.destinationStore_);
|
| + this.addChild(this.printHeader_);
|
| +
|
| + /**
|
| + * Component that renders the print destination.
|
| + * @type {!print_preview.DestinationSettings}
|
| + * @private
|
| + */
|
| + this.destinationSettings_ = new print_preview.DestinationSettings(
|
| + this.destinationStore_);
|
| + this.addChild(this.destinationSettings_);
|
| +
|
| + /**
|
| + * Component that renders UI for entering in page range.
|
| + * @type {!print_preview.PageSettings}
|
| + * @private
|
| + */
|
| + this.pageSettings_ = new print_preview.PageSettings(this.printTicketStore_);
|
| + this.addChild(this.pageSettings_);
|
| +
|
| + /**
|
| + * Component that renders the copies settings.
|
| + * @type {!print_preview.CopiesSettings}
|
| + * @private
|
| + */
|
| + this.copiesSettings_ = new print_preview.CopiesSettings(
|
| + this.printTicketStore_);
|
| + this.addChild(this.copiesSettings_);
|
| +
|
| + /**
|
| + * Component that renders the layout settings.
|
| + * @type {!print_preview.LayoutSettings}
|
| + * @private
|
| + */
|
| + this.layoutSettings_ = new print_preview.LayoutSettings(
|
| + this.printTicketStore_);
|
| + this.addChild(this.layoutSettings_);
|
| +
|
| + /**
|
| + * Component that renders the color options.
|
| + * @type {!print_preview.ColorSettings}
|
| + * @private
|
| + */
|
| + this.colorSettings_ = new print_preview.ColorSettings(
|
| + this.printTicketStore_);
|
| + this.addChild(this.colorSettings_);
|
| +
|
| + /**
|
| + * Component that renders a select box for choosing margin settings.
|
| + * @type {!print_preview.MarginSettings}
|
| + * @private
|
| + */
|
| + this.marginSettings_ = new print_preview.MarginSettings(
|
| + this.printTicketStore_);
|
| + this.addChild(this.marginSettings_);
|
| +
|
| + /**
|
| + * Component that renders miscellaneous print options.
|
| + * @type {!print_preview.OtherOptionsSettings}
|
| + * @private
|
| + */
|
| + this.otherOptionsSettings_ = new print_preview.OtherOptionsSettings(
|
| + this.printTicketStore_);
|
| + this.addChild(this.otherOptionsSettings_);
|
| +
|
| + /**
|
| + * Area of the UI that holds the print preview.
|
| + * @type {!print_preview.PreviewArea}
|
| + * @private
|
| + */
|
| + this.previewArea_ = new print_preview.PreviewArea(
|
| + this.destinationStore_, this.printTicketStore_, this.nativeLayer_);
|
| + this.addChild(this.previewArea_);
|
| +
|
| + /**
|
| + * Interface to the Google Cloud Print API. Null if Google Cloud Print
|
| + * integration is disabled.
|
| + * @type {cloudprint.CloudPrintInterface}
|
| + * @private
|
| + */
|
| + this.cloudPrintInterface_ = null;
|
| +
|
| + /**
|
| + * Whether in kiosk mode where print preview can print automatically without
|
| + * user intervention. See http://crbug.com/31395. Print will start when
|
| + * both the print ticket has been initialized, and an initial printer has
|
| + * been selected.
|
| + * @type {boolean}
|
| + * @private
|
| + */
|
| + this.isInKioskAutoPrintMode_ = false;
|
| +
|
| + /**
|
| + * State of the print preview UI.
|
| + * @type {print_preview.PrintPreview.UiState_}
|
| + * @private
|
| + */
|
| + this.uiState_ = PrintPreview.UiState_.INITIALIZING;
|
| +
|
| + /**
|
| + * Current state of fetching destinations.
|
| + * @type {print_preview.PrintPreview.FetchState_}
|
| + * @private
|
| + */
|
| + this.fetchState_ = PrintPreview.FetchState_.READY;
|
| +
|
| + /**
|
| + * Whether document preview generation is in progress.
|
| + * @type {boolean}
|
| + * @private
|
| + */
|
| + this.isPreviewGenerationInProgress_ = true;
|
| +
|
| + this.tracker.add(window, 'DOMContentLoaded', this.onWindowLoad_.bind(this));
|
| + };
|
| +
|
| + /**
|
| + * States of the print preview.
|
| + * @enum {string}
|
| + * @private
|
| + */
|
| + PrintPreview.UiState_ = {
|
| + INITIALIZING: 'initializing',
|
| + READY: 'ready',
|
| + OPENING_PDF_PREVIEW: 'opening-pdf-preview',
|
| + OPENING_NATIVE_PRINT_DIALOG: 'opening-native-print-dialog',
|
| + PRINTING: 'printing',
|
| + FILE_SELECTION: 'file-selection',
|
| + CLOSING: 'closing',
|
| + ERROR: 'error'
|
| + };
|
| +
|
| + /**
|
| + * Bitfield of the states of fetching destinations.
|
| + * @enum {number}
|
| + * @private
|
| + */
|
| + PrintPreview.FetchState_ = {
|
| + READY: 1,
|
| + LOCAL_DESTINATIONS: 2,
|
| + RECENT_CLOUD_DESTINATIONS: 4,
|
| + ALL_CLOUD_DESTINATIONS: 8
|
| + };
|
| +
|
| + PrintPreview.prototype = {
|
| + __proto__: print_preview.Component.prototype,
|
| +
|
| + /** @override */
|
| + decorateInternal: function() {
|
| + this.printHeader_.decorate($('print-header'));
|
| + this.destinationSettings_.decorate($('destination-settings'));
|
| + this.pageSettings_.decorate($('page-settings'));
|
| + this.copiesSettings_.decorate($('copies-settings'));
|
| + this.layoutSettings_.decorate($('layout-settings'));
|
| + this.colorSettings_.decorate($('color-settings'));
|
| + this.marginSettings_.decorate($('margin-settings'));
|
| + this.otherOptionsSettings_.decorate($('other-options-settings'));
|
| + this.previewArea_.decorate($('preview-area'));
|
| +
|
| + setIsVisible($('cloud-print-dialog-link'), cr.isChromeOS);
|
| + setIsVisible($('system-dialog-link'), !cr.isChromeOS);
|
| + setIsVisible($('open-pdf-in-preview-link'), cr.isMac);
|
| + },
|
| +
|
| + /** @override */
|
| + enterDocument: function() {
|
| + // Native layer events.
|
| + this.tracker.add(
|
| + this.nativeLayer_,
|
| + print_preview.NativeLayer.EventType.INITIAL_SETTINGS_SET,
|
| + this.onInitialSettingsSet_.bind(this));
|
| + this.tracker.add(
|
| + this.nativeLayer_,
|
| + print_preview.NativeLayer.EventType.CLOUD_PRINT_ENABLE,
|
| + this.onCloudPrintEnable_.bind(this));
|
| + this.tracker.add(
|
| + this.nativeLayer_,
|
| + print_preview.NativeLayer.EventType.LOCAL_DESTINATIONS_SET,
|
| + this.onLocalDestinationsSet_.bind(this));
|
| + this.tracker.add(
|
| + this.nativeLayer_,
|
| + print_preview.NativeLayer.EventType.CAPABILITIES_SET,
|
| + this.onLocalDestinationCapabilitiesSet_.bind(this));
|
| + this.tracker.add(
|
| + this.nativeLayer_,
|
| + print_preview.NativeLayer.EventType.DESTINATIONS_RELOAD,
|
| + this.onDestinationsReload_.bind(this));
|
| + this.tracker.add(
|
| + this.nativeLayer_,
|
| + print_preview.NativeLayer.EventType.PRINT_TO_CLOUD,
|
| + this.onPrintToCloud_.bind(this));
|
| + this.tracker.add(
|
| + this.nativeLayer_,
|
| + print_preview.NativeLayer.EventType.FILE_SELECTION_CANCEL,
|
| + this.onFileSelectionCancel_.bind(this));
|
| + this.tracker.add(
|
| + this.nativeLayer_,
|
| + print_preview.NativeLayer.EventType.FILE_SELECTION_COMPLETE,
|
| + this.onFileSelectionComplete_.bind(this));
|
| + this.tracker.add(
|
| + this.nativeLayer_,
|
| + print_preview.NativeLayer.EventType.SETTINGS_INVALID,
|
| + this.onSettingsInvalid_.bind(this));
|
| + this.tracker.add(
|
| + this.nativeLayer_,
|
| + print_preview.NativeLayer.EventType.DISABLE_SCALING,
|
| + this.onDisableScaling_.bind(this));
|
| +
|
| + this.tracker.add(
|
| + $('system-dialog-link'),
|
| + 'click',
|
| + this.openSystemPrintDialog_.bind(this));
|
| + this.tracker.add(
|
| + $('cloud-print-dialog-link'),
|
| + 'click',
|
| + this.openSystemPrintDialog_.bind(this));
|
| + this.tracker.add(
|
| + $('open-pdf-in-preview-link'),
|
| + 'click',
|
| + this.onOpenPdfInPreviewLinkClick_.bind(this));
|
| +
|
| + this.tracker.add(
|
| + this.previewArea_,
|
| + print_preview.PreviewArea.EventType.PREVIEW_GENERATION_IN_PROGRESS,
|
| + this.onPreviewGenerationInProgress_.bind(this));
|
| + this.tracker.add(
|
| + this.previewArea_,
|
| + print_preview.PreviewArea.EventType.PREVIEW_GENERATION_DONE,
|
| + this.onPreviewGenerationDone_.bind(this));
|
| + this.tracker.add(
|
| + this.previewArea_,
|
| + print_preview.PreviewArea.EventType.PREVIEW_GENERATION_FAIL,
|
| + this.onPreviewGenerationFail_.bind(this));
|
| + this.tracker.add(
|
| + this.previewArea_,
|
| + print_preview.PreviewArea.EventType.OPEN_SYSTEM_DIALOG_CLICK,
|
| + this.openSystemPrintDialog_.bind(this));
|
| +
|
| + this.tracker.add(
|
| + this.destinationStore_,
|
| + print_preview.DestinationStore.EventType.DESTINATION_SELECT,
|
| + this.onDestinationSelect_.bind(this));
|
| +
|
| + this.tracker.add(
|
| + this.printHeader_,
|
| + print_preview.PrintHeader.EventType.PRINT_BUTTON_CLICK,
|
| + this.onPrintButtonClick_.bind(this));
|
| + this.tracker.add(
|
| + this.printHeader_,
|
| + print_preview.PrintHeader.EventType.CANCEL_BUTTON_CLICK,
|
| + this.onCancelButtonClick_.bind(this));
|
| +
|
| + this.tracker.add(
|
| + this.destinationSettings_,
|
| + print_preview.DestinationSettings.EventType.MANAGE_PRINTERS_SELECT,
|
| + this.onManagePrinters_.bind(this));
|
| +
|
| + this.tracker.add(window, 'keydown', this.onKeyDown_.bind(this));
|
| + },
|
| +
|
| + /**
|
| + * Sets whether the controls in the print preview are enabled.
|
| + * @param {boolean} isEnabled Whether the controls in the print preview are
|
| + * enabled.
|
| + * @private
|
| + */
|
| + setIsEnabled_: function(isEnabled) {
|
| + $('system-dialog-link').disabled = !isEnabled;
|
| + $('cloud-print-dialog-link').disabled = !isEnabled;
|
| + $('open-pdf-in-preview-link').disabled = !isEnabled;
|
| + this.printHeader_.isEnabled = isEnabled;
|
| + this.destinationSettings_.isEnabled = isEnabled;
|
| + this.pageSettings_.isEnabled = isEnabled;
|
| + this.copiesSettings_.isEnabled = isEnabled;
|
| + this.layoutSettings_.isEnabled = isEnabled;
|
| + this.colorSettings_.isEnabled = isEnabled;
|
| + this.marginSettings_.isEnabled = isEnabled;
|
| + this.otherOptionsSettings_.isEnabled = isEnabled;
|
| + },
|
| +
|
| + /**
|
| + * Creates a local PDF print destination.
|
| + * @return {!print_preview.Destination} Created print destination.
|
| + * @private
|
| + */
|
| + createLocalPdfPrintDestination_: function() {
|
| + var dest = new print_preview.Destination(
|
| + print_preview.Destination.GooglePromotedId.SAVE_AS_PDF,
|
| + localStrings.getString('printToPDF'),
|
| + false /*isRecent*/,
|
| + true /*isLocal*/);
|
| + dest.capabilities = new print_preview.ChromiumCapabilities(
|
| + false /*hasCopiesCapability*/,
|
| + '1' /*defaultCopiesStr*/,
|
| + false /*hasCollateCapability*/,
|
| + false /*defaultIsCollateEnabled*/,
|
| + false /*hasDuplexCapability*/,
|
| + false /*defaultIsDuplexEnabled*/,
|
| + true /*hasOrientationCapability*/,
|
| + false /*defaultIsLandscapeEnabled*/,
|
| + true /*hasColorCapability*/,
|
| + true /*defaultIsColorEnabled*/);
|
| + return dest;
|
| + },
|
| +
|
| + /**
|
| + * Creates a new "Print with Cloud Print" print destination. NOTE: this
|
| + * destination will appear as "Search for additional printers..." on
|
| + * Chrome OS.
|
| + * @return {!print_preview.Destination} Created print destination.
|
| + * @private
|
| + */
|
| + createPrintWithCloudPrintDestination_: function() {
|
| + var dest = new print_preview.Destination(
|
| + print_preview.Destination.GooglePromotedId.PRINT_WITH_CLOUD_PRINT,
|
| + localStrings.getString('printWithCloudPrint'),
|
| + false /*isRecent*/,
|
| + false /*isLocal*/);
|
| + dest.capabilities = new print_preview.ChromiumCapabilities(
|
| + false /*hasCopiesCapability*/,
|
| + '1' /*defaultCopiesStr*/,
|
| + false /*hasCollateCapability*/,
|
| + false /*defaultIsCollateEnabled*/,
|
| + false /*hasDuplexCapability*/,
|
| + false /*defaultIsDuplexEnabled*/,
|
| + true /*hasOrientationCapability*/,
|
| + false /*defaultIsLandscapeEnabled*/,
|
| + true /*hasColorCapability*/,
|
| + true /*defaultIsColorEnabled*/);
|
| + return dest;
|
| + },
|
| +
|
| + /**
|
| + * Prints the document or launches a pdf preview on the local system.
|
| + * @param {boolean} isPdfPreview Whether to launch the pdf preview.
|
| + * @private
|
| + */
|
| + printDocumentOrOpenPdfPreview_: function(isPdfPreview) {
|
| + assert(this.uiState_ == PrintPreview.UiState_.READY,
|
| + 'Print document request received when not in ready state: ' +
|
| + this.uiState_);
|
| + if (isPdfPreview) {
|
| + this.uiState_ = PrintPreview.UiState_.OPENING_PDF_PREVIEW;
|
| + } else if (this.destinationStore_.selectedDestination.id ==
|
| + print_preview.Destination.GooglePromotedId.SAVE_AS_PDF) {
|
| + this.uiState_ = PrintPreview.UiState_.FILE_SELECTION;
|
| + } else {
|
| + this.uiState_ = PrintPreview.UiState_.PRINTING;
|
| + }
|
| + this.setIsEnabled_(false);
|
| + if (this.printIfReady_() &&
|
| + ((this.destinationStore_.selectedDestination.isLocal &&
|
| + this.destinationStore_.selectedDestination.id !=
|
| + print_preview.Destination.GooglePromotedId.SAVE_AS_PDF) ||
|
| + this.uiState_ == PrintPreview.UiState_.OPENING_PDF_PREVIEW)) {
|
| + // Hide the dialog for now. The actual print command will be issued when
|
| + // the preview generation is done.
|
| + this.nativeLayer_.startHideDialog();
|
| + }
|
| + },
|
| +
|
| + /**
|
| + * Attempts to print if needed and if ready.
|
| + * @return {boolean} Whether a print request was issued.
|
| + * @private
|
| + */
|
| + printIfReady_: function() {
|
| + if ((this.uiState_ == PrintPreview.UiState_.PRINTING ||
|
| + this.uiState_ == PrintPreview.UiState_.OPENING_PDF_PREVIEW ||
|
| + this.uiState_ == PrintPreview.UiState_.FILE_SELECTION ||
|
| + this.isInKioskAutoPrintMode_) &&
|
| + !this.isPreviewGenerationInProgress_ &&
|
| + this.destinationStore_.selectedDestination &&
|
| + this.destinationStore_.selectedDestination.capabilities) {
|
| + assert(this.printTicketStore_.isTicketValid(),
|
| + 'Trying to print with invalid ticket');
|
| + this.nativeLayer_.startSaveDestinationAndTicket(
|
| + this.destinationStore_.selectedDestination,
|
| + this.printTicketStore_);
|
| + this.nativeLayer_.startPrint(
|
| + this.destinationStore_.selectedDestination,
|
| + this.printTicketStore_,
|
| + this.cloudPrintInterface_,
|
| + this.uiState_ == PrintPreview.UiState_.OPENING_PDF_PREVIEW);
|
| + return true;
|
| + } else {
|
| + return false;
|
| + }
|
| + },
|
| +
|
| + /**
|
| + * Closes the print preview.
|
| + * @private
|
| + */
|
| + close_: function() {
|
| + this.exitDocument();
|
| + this.uiState_ = PrintPreview.UiState_.CLOSING;
|
| + this.nativeLayer_.startCloseDialog();
|
| + },
|
| +
|
| + /**
|
| + * Opens the native system print dialog after disabling all controls.
|
| + * @private
|
| + */
|
| + openSystemPrintDialog_: function() {
|
| + assert(this.uiState_ == PrintPreview.UiState_.READY,
|
| + 'Opening system dialog when not in ready state: ' + this.uiState_);
|
| + setIsVisible($('dialog-throbber'), true);
|
| + this.setIsEnabled_(false);
|
| + this.uiState_ = PrintPreview.UiState_.OPENING_NATIVE_PRINT_DIALOG;
|
| + this.nativeLayer_.startShowSystemDialog();
|
| + },
|
| +
|
| + /**
|
| + * Window onload handler, sets up the page and starts print preview by
|
| + * getting the printer list.
|
| + * @private
|
| + */
|
| + onWindowLoad_: function() {
|
| + this.decorate($('print-preview'));
|
| + i18nTemplate.process(document, templateData);
|
| + if (!this.previewArea_.hasCompatiblePlugin) {
|
| + this.setIsEnabled_(false);
|
| + }
|
| + this.nativeLayer_.startGetInitialSettings();
|
| + this.nativeLayer_.startGetLocalDestinations();
|
| + },
|
| +
|
| + /**
|
| + * Called when the native layer has initial settings to set. Sets the
|
| + * initial settings of the print preview and begins fetching print
|
| + * destinations.
|
| + * @param {cr.Event} event Contains the initial print preview settings
|
| + * persisted through the session.
|
| + * @private
|
| + */
|
| + onInitialSettingsSet_: function(event) {
|
| + assert(this.uiState_ == PrintPreview.UiState_.INITIALIZING,
|
| + 'Updating initial settings when not in initializing state: ' +
|
| + this.uiState_);
|
| + this.uiState_ = PrintPreview.UiState_.READY;
|
| +
|
| + this.isInKioskAutoPrintMode_ =
|
| + event.initialSettings.isInKioskAutoPrintMode;
|
| + this.destinationStore_.setInitialDestinationId(
|
| + event.initialSettings.initialDestinationId);
|
| + this.printTicketStore_.initialize(
|
| + event.initialSettings.isDocumentModifiable,
|
| + event.initialSettings.isDuplexEnabled,
|
| + event.initialSettings.isHeaderFooterEnabled,
|
| + event.initialSettings.marginsType,
|
| + event.initialSettings.customMargins,
|
| + event.initialSettings.thousandsDelimeter,
|
| + event.initialSettings.decimalDelimeter,
|
| + event.initialSettings.unitType);
|
| + },
|
| +
|
| + /**
|
| + * Calls when the native layer enables Google Cloud Print integration.
|
| + * Fetches the user's cloud printers.
|
| + * @param {cr.Event} event Contains the base URL of the Google Cloud Print
|
| + * service.
|
| + * @private
|
| + */
|
| + onCloudPrintEnable_: function(event) {
|
| + this.cloudPrintInterface_ = new cloudprint.CloudPrintInterface(
|
| + event.baseCloudPrintUrl);
|
| + this.tracker.add(
|
| + this.cloudPrintInterface_,
|
| + cloudprint.CloudPrintInterface.EventType.SEARCH_DONE,
|
| + this.onCloudPrintSearchDone_.bind(this));
|
| + this.tracker.add(
|
| + this.cloudPrintInterface_,
|
| + cloudprint.CloudPrintInterface.EventType.PRINTER_DONE,
|
| + this.onCloudPrintPrinterDone_.bind(this));
|
| + this.tracker.add(
|
| + this.cloudPrintInterface_,
|
| + cloudprint.CloudPrintInterface.EventType.SUBMIT_DONE,
|
| + this.onCloudPrintSubmitDone_.bind(this));
|
| + this.tracker.add(
|
| + this.cloudPrintInterface_,
|
| + cloudprint.CloudPrintInterface.EventType.ERROR,
|
| + this.onCloudPrintError_.bind(this));
|
| +
|
| + var printWithCloudPrintDest =
|
| + this.createPrintWithCloudPrintDestination_();
|
| + this.destinationStore_.insertDestination(printWithCloudPrintDest);
|
| +
|
| + if (cr.isChromeOS) {
|
| + this.cloudPrintInterface_.search(true /*isRecent*/);
|
| + this.fetchState_ |= PrintPreview.FetchState_.RECENT_CLOUD_DESTINATIONS;
|
| + }
|
| + },
|
| +
|
| + /**
|
| + * Called when the native layer gets local destinations. Adds local
|
| + * destination objects received from the operating system to the destination
|
| + * store. Also adds a save-as-pdf printer.
|
| + * @param {cr.Event} Contains the local destinations to set.
|
| + * @private
|
| + */
|
| + onLocalDestinationsSet_: function(event) {
|
| + var localDestinations = [];
|
| + for (var destInfo, i = 0; destInfo = event.destinationInfos[i]; i++) {
|
| + localDestinations.push(
|
| + print_preview.LocalDestinationParser.parse(destInfo));
|
| + }
|
| + localDestinations.push(this.createLocalPdfPrintDestination_());
|
| + this.destinationStore_.insertDestinations(localDestinations);
|
| + this.fetchState_ &= ~PrintPreview.FetchState_.LOCAL_DESTINATIONS;
|
| + },
|
| +
|
| + /**
|
| + * Called when the native layer retrieves the capabilities for the selected
|
| + * local destination.
|
| + * @param {cr.Event} event Contains the capabilities of the local print
|
| + * destination.
|
| + * @private
|
| + */
|
| + onLocalDestinationCapabilitiesSet_: function(event) {
|
| + // TODO(rltoscano): There may be a race condition here. This method is
|
| + // assumed to return capabilities for the currently selected printer. But
|
| + // between the time the local printer was selected and the capabilities
|
| + // were retrieved, the selected printer can change. One way to address
|
| + // this is to include the destination ID in the settingsInfo parameter.
|
| + var selectedDestination = this.destinationStore_.selectedDestination;
|
| + if (selectedDestination.isLocal) {
|
| + var capabilities = print_preview.LocalCapabilitiesParser.parse(
|
| + event.settingsInfo);
|
| + selectedDestination.capabilities = capabilities;
|
| + this.printTicketStore_.updateDestinationCapabilities(capabilities);
|
| + this.printIfReady_();
|
| + }
|
| + },
|
| +
|
| + /**
|
| + * Called from native layer after the user was requested to sign in, and did
|
| + * so successfully.
|
| + * @private
|
| + */
|
| + onDestinationsReload_: function() {
|
| + this.destinationStore_.clear();
|
| + this.nativeLayer_.startGetLocalDestinations();
|
| + if (this.cloudPrintInterface_) {
|
| + // Fetch recent printers.
|
| + this.cloudPrintInterface_.search(true /*isRecent*/);
|
| + // Fetch the full printer list.
|
| + this.cloudPrintInterface_.search(false /*isRecent*/);
|
| + }
|
| + this.fetchState_ =
|
| + PrintPreview.FetchState_.LOCAL_DESTINATIONS |
|
| + PrintPreview.FetchState_.ALL_CLOUD_DESTINATIONS |
|
| + PrintPreview.FetchState_.RECENT_CLOUD_DESTINATIONS;
|
| + },
|
| +
|
| + /**
|
| + * Called from the native layer when ready to print to Google Cloud Print.
|
| + * @param {cr.Event} event Contains the body to send in the HTTP request.
|
| + * @private
|
| + */
|
| + onPrintToCloud_: function(event) {
|
| + assert(this.uiState_ == PrintPreview.UiState_.PRINTING,
|
| + 'Document ready to be sent to the cloud when not in printing ' +
|
| + 'state: ' + this.uiState_);
|
| + assert(this.cloudPrintInterface_ != null,
|
| + 'Google Cloud Print is not enabled');
|
| + this.cloudPrintInterface_.submit(event.data);
|
| + },
|
| +
|
| + /**
|
| + * Called from the native layer when the user cancels the save-to-pdf file
|
| + * selection dialog.
|
| + * @private
|
| + */
|
| + onFileSelectionCancel_: function() {
|
| + assert(this.uiState_ == PrintPreview.UiState_.FILE_SELECTION,
|
| + 'File selection cancelled when not in file-selection state: ' +
|
| + this.uiState_);
|
| + this.setIsEnabled_(true);
|
| + this.uiState_ = PrintPreview.UiState_.READY;
|
| + },
|
| +
|
| + /**
|
| + * Called from the native layer when save-to-pdf file selection is complete.
|
| + * @private
|
| + */
|
| + onFileSelectionComplete_: function() {
|
| + assert(this.uiState_ == PrintPreview.UiState_.FILE_SELECTION,
|
| + 'File selection completed when not in file-selection state: ' +
|
| + this.uiState_);
|
| + this.previewArea_.showCustomMessage(
|
| + localStrings.getString('printingToPDFInProgress'));
|
| + this.uiState_ = PrintPreview.UiState_.PRINTING;
|
| + },
|
| +
|
| + /**
|
| + * Called when the Google Cloud Print search API call completes. Adds
|
| + * destinations to the printer store and selects one if it matches the
|
| + * initial destination.
|
| + * @param {cr.Event} event Contains the new cloud destinations.
|
| + * @private
|
| + */
|
| + onCloudPrintSearchDone_: function(event) {
|
| + this.destinationStore_.insertDestinations(event.printers);
|
| + if (event.isRecent) {
|
| + this.fetchState_ &= ~PrintPreview.FetchState_.RECENT_CLOUD_DESTINATIONS;
|
| + } else {
|
| + this.fetchState_ &= ~PrintPreview.FetchState_.ALL_CLOUD_DESTINATIONS;
|
| + }
|
| + },
|
| +
|
| + /**
|
| + * Called when the Google Cloud Print printer API call completes. Updates
|
| + * the UI with the newly received capabilities.
|
| + * @param {cr.Event} event Contains the destination returned in the printer
|
| + * API call.
|
| + */
|
| + onCloudPrintPrinterDone_: function(event) {
|
| + var dest = this.destinationStore_.updateDestination(event.printer);
|
| + if (this.destinationStore_.selectedDestination == dest) {
|
| + this.printTicketStore_.updateDestinationCapabilities(dest.capabilities);
|
| + this.printIfReady_();
|
| + }
|
| + },
|
| +
|
| + /**
|
| + * Called after successfully submitting a job to Google Cloud Print.
|
| + * @private
|
| + */
|
| + onCloudPrintSubmitDone_: function() {
|
| + assert(this.uiState_ == PrintPreview.UiState_.PRINTING,
|
| + 'Submited job to Google Cloud Print but not in printing state ' +
|
| + this.uiState_);
|
| + this.close_();
|
| + },
|
| +
|
| + /**
|
| + * Called when there was an error communicating with Google Cloud print.
|
| + * Displays an error message in the print header.
|
| + * @param {cr.Event} event Contains the error message.
|
| + * @private
|
| + */
|
| + onCloudPrintError_: function(event) {
|
| + if (cr.isChromeOS && event.message == '403') {
|
| + this.nativeLayer_.startCloudPrintSignIn();
|
| + } else {
|
| + this.printHeader_.setErrorMessage(event.message);
|
| + }
|
| + this.fetchState_ &=
|
| + ~PrintPreview.FetchState_.RECENT_CLOUD_DESTINATIONS &
|
| + ~PrintPreview.FetchState_.ALL_CLOUD_DESTINATIONS;
|
| + },
|
| +
|
| + /**
|
| + * Called when a new destination has been selected. Fetches the
|
| + * destination's capability list.
|
| + * @private
|
| + */
|
| + onDestinationSelect_: function() {
|
| + var destination = this.destinationStore_.selectedDestination;
|
| +
|
| + // Fetch destination capabilities if necessary.
|
| + if (!destination.capabilities) {
|
| + if (destination.isLocal) {
|
| + this.nativeLayer_.startGetLocalDestinationCapabilities(
|
| + destination.id);
|
| + } else {
|
| + assert(this.cloudPrintInterface_ != null,
|
| + 'Selected destination is a cloud destination, but Google ' +
|
| + 'Cloud Print is not enabled');
|
| + this.cloudPrintInterface_.printer(destination.id);
|
| + }
|
| + } else {
|
| + this.printTicketStore_.updateDestinationCapabilities(
|
| + destination.capabilities);
|
| + }
|
| +
|
| + this.printIfReady_();
|
| + },
|
| +
|
| + /**
|
| + * Called when the preview area's preview generation is in progress.
|
| + * @private
|
| + */
|
| + onPreviewGenerationInProgress_: function() {
|
| + this.isPreviewGenerationInProgress_ = true;
|
| + },
|
| +
|
| + /**
|
| + * Called when the preview area's preview generation is complete.
|
| + * @private
|
| + */
|
| + onPreviewGenerationDone_: function() {
|
| + this.isPreviewGenerationInProgress_ = false;
|
| + this.printIfReady_();
|
| + },
|
| +
|
| + /**
|
| + * Called when the preview area's preview failed to load.
|
| + * @private
|
| + */
|
| + onPreviewGenerationFail_: function() {
|
| + this.isPreviewGenerationInProgress_ = false;
|
| + if (this.uiState_ == PrintPreview.UiState_.PRINTING) {
|
| + this.nativeLayer_.startCancelPendingPrint();
|
| + }
|
| + },
|
| +
|
| + /**
|
| + * Called when the 'Open pdf in preview' link is clicked. Launches the pdf
|
| + * preview app.
|
| + * @private
|
| + */
|
| + onOpenPdfInPreviewLinkClick_: function() {
|
| + assert(this.uiState_ == PrintPreview.UiState_.READY,
|
| + 'Trying to open pdf in preview when not in ready state: ' +
|
| + this.uiState_);
|
| + setIsVisible($('open-preview-app-throbber'), true);
|
| + this.previewArea_.showCustomMessage(
|
| localStrings.getString('openingPDFInPreview'));
|
| - } else if (printToPDF) {
|
| - sendPrintDocumentRequest();
|
| - } else if (printWithCloudPrint) {
|
| - previewArea.showCustomMessage(
|
| - localStrings.getString('printWithCloudPrintWait'));
|
| - disableInputElementsInSidebar();
|
| - } else {
|
| - isTabHidden = true;
|
| - chrome.send('hidePreview');
|
| - }
|
| - return;
|
| - }
|
| -
|
| - if (printToPDF || previewAppRequested) {
|
| - sendPrintDocumentRequest();
|
| - } else {
|
| - window.setTimeout(function() { sendPrintDocumentRequest(); }, 1000);
|
| - }
|
| -}
|
| -
|
| -/**
|
| - * Sends a message to cancel the pending print request.
|
| - */
|
| -function cancelPendingPrintRequest() {
|
| - if (isTabHidden)
|
| - chrome.send('cancelPendingPrintRequest');
|
| -}
|
| -
|
| -/**
|
| - * Sends a message to initiate print workflow.
|
| - */
|
| -function sendPrintDocumentRequest() {
|
| - var printerList = $('printer-list');
|
| - var printer = printerList[printerList.selectedIndex];
|
| - chrome.send('saveLastPrinter', [printer.value, cloudprint.getData(printer)]);
|
| -
|
| - var settings = getSettings();
|
| - if (cr.isMac && previewAppRequested)
|
| - settings.OpenPDFInPreview = true;
|
| -
|
| - chrome.send('print', [JSON.stringify(settings),
|
| - cloudprint.getPrintTicketJSON(printer)]);
|
| -}
|
| -
|
| -/**
|
| - * Loads the selected preview pages.
|
| - */
|
| -function loadSelectedPages() {
|
| - pageSettings.updatePageSelection();
|
| - var pageSet = pageSettings.previouslySelectedPages;
|
| - var pageCount = pageSet.length;
|
| - if (pageCount == 0 || currentPreviewUid == '')
|
| - return;
|
| -
|
| - cr.dispatchSimpleEvent(document, customEvents.UPDATE_SUMMARY);
|
| - for (var i = 0; i < pageCount; i++)
|
| - onDidPreviewPage(pageSet[i] - 1, currentPreviewUid, lastPreviewRequestID);
|
| -}
|
| -
|
| -/**
|
| - * Updates the variables states for preview.
|
| - */
|
| -function updateStateForPreview() {
|
| - if (!isTabHidden)
|
| - previewArea.showLoadingAnimation();
|
| -
|
| - if (!hasPendingPreviewRequest && previewModifiable &&
|
| - hasOnlyPageSettingsChanged()) {
|
| - loadSelectedPages();
|
| - generateDraftData = false;
|
| - } else {
|
| - hasPendingPreviewRequest = true;
|
| - generateDraftData = true;
|
| - pageSettings.updatePageSelection();
|
| - }
|
| -
|
| - printSettings.save();
|
| - layoutSettings.updateState();
|
| - previewArea.resetState();
|
| - isPrintReadyMetafileReady = false;
|
| - isFirstPageLoaded = false;
|
| -
|
| - var totalPageCount = pageSettings.totalPageCount;
|
| - if (!previewModifiable && totalPageCount > 0)
|
| - generateDraftData = false;
|
| -}
|
| -
|
| -/**
|
| - * Asks the browser to generate a preview PDF based on current print settings.
|
| - */
|
| -function requestPrintPreview() {
|
| - updateStateForPreview();
|
| - var totalPageCount = pageSettings.totalPageCount;
|
| - var pageCount = totalPageCount || -1;
|
| - chrome.send('getPreview', [JSON.stringify(getSettingsWithRequestID()),
|
| - pageCount,
|
| - previewModifiable]);
|
| -}
|
| -
|
| -/**
|
| - * Called from PrintPreviewUI::OnFileSelectionCancelled to notify the print
|
| - * preview tab regarding the file selection cancel event.
|
| - */
|
| -function fileSelectionCancelled() {
|
| - printHeader.enableCancelButton();
|
| -}
|
| -
|
| -/**
|
| - * Called from PrintPreviewUI::OnFileSelectionCompleted to notify the print
|
| - * preview tab regarding the file selection completed event.
|
| - */
|
| -function fileSelectionCompleted() {
|
| - // If the file selection is completed and the tab is not already closed it
|
| - // means that a pending print to pdf request exists.
|
| - disableInputElementsInSidebar();
|
| - previewArea.showCustomMessage(
|
| - localStrings.getString('printingToPDFInProgress'));
|
| -}
|
| -
|
| -/**
|
| - * Set the default printer. If there is one, generate a print preview.
|
| - * @param {string} printerName Name of the default printer. Empty if none.
|
| - * @param {string} cloudPrintData Cloud print related data to restore if
|
| - * the default printer is a cloud printer.
|
| - */
|
| -function setDefaultPrinter(printerName, cloudPrintData) {
|
| - // Add a placeholder value so the printer list looks valid.
|
| - addDestinationListOption('', '', true, true, true);
|
| - if (printerName) {
|
| - defaultOrLastUsedPrinterName = printerName;
|
| - if (cloudPrintData) {
|
| - cloudprint.setDefaultPrinter(printerName,
|
| - cloudPrintData,
|
| - addDestinationListOptionAtPosition,
|
| - doUpdateCloudPrinterCapabilities);
|
| - } else {
|
| - $('printer-list')[0].value = defaultOrLastUsedPrinterName;
|
| - updateControlsWithSelectedPrinterCapabilities();
|
| - }
|
| - }
|
| - chrome.send('getPrinters');
|
| -}
|
| -
|
| -/**
|
| - * Fill the printer list drop down.
|
| - * Called from PrintPreviewHandler::SetupPrinterList().
|
| - * @param {Array} printers Array of printer info objects.
|
| - */
|
| -function setPrinters(printers) {
|
| - var printerList = $('printer-list');
|
| - // Remove empty entry added by setDefaultPrinter.
|
| - if (printerList[0] && printerList[0].textContent == '')
|
| - printerList.remove(0);
|
| - for (var i = 0; i < printers.length; ++i) {
|
| - var isDefault = (printers[i].deviceName == defaultOrLastUsedPrinterName);
|
| - addDestinationListOption(printers[i].printerName, printers[i].deviceName,
|
| - isDefault, false, false);
|
| - }
|
| -
|
| - if (printers.length != 0)
|
| - addDestinationListOption('', '', false, true, true);
|
| -
|
| - // Adding option for saving PDF to disk.
|
| - addDestinationListOption(localStrings.getString('printToPDF'),
|
| - PRINT_TO_PDF,
|
| - defaultOrLastUsedPrinterName == PRINT_TO_PDF,
|
| - false,
|
| - false);
|
| - addDestinationListOption('', '', false, true, true);
|
| - if (useCloudPrint) {
|
| - addDestinationListOption(localStrings.getString('printWithCloudPrint'),
|
| - PRINT_WITH_CLOUD_PRINT,
|
| - false,
|
| - false,
|
| - false);
|
| - addDestinationListOption('', '', false, true, true);
|
| - }
|
| - // Add options to manage printers.
|
| - if (!cr.isChromeOS) {
|
| - addDestinationListOption(localStrings.getString('managePrinters'),
|
| - MANAGE_LOCAL_PRINTERS, false, false, false);
|
| - } else if (useCloudPrint) {
|
| - // Fetch recent printers.
|
| - cloudprint.fetchPrinters(addDestinationListOptionAtPosition, false);
|
| - // Fetch the full printer list.
|
| - cloudprint.fetchPrinters(addDestinationListOptionAtPosition, true);
|
| - addDestinationListOption(localStrings.getString('managePrinters'),
|
| - MANAGE_CLOUD_PRINTERS, false, false, false);
|
| - }
|
| -
|
| - printerList.disabled = false;
|
| -
|
| - if (!hasRequestedPreview())
|
| - updateControlsWithSelectedPrinterCapabilities();
|
| -}
|
| -
|
| -/**
|
| - * Creates an option that can be added to the printer destination list.
|
| - * @param {string} optionText specifies the option text content.
|
| - * @param {string} optionValue specifies the option value.
|
| - * @param {boolean} isDefault is true if the option needs to be selected.
|
| - * @param {boolean} isDisabled is true if the option needs to be disabled.
|
| - * @param {boolean} isSeparator is true if the option is a visual separator and
|
| - * needs to be disabled.
|
| - * @return {Object} The created option.
|
| - */
|
| -function createDestinationListOption(optionText, optionValue, isDefault,
|
| - isDisabled, isSeparator) {
|
| - var option = document.createElement('option');
|
| - option.textContent = optionText;
|
| - option.value = optionValue;
|
| - option.selected = isDefault;
|
| - option.disabled = isSeparator || isDisabled;
|
| - // Adding attribute for improved accessibility.
|
| - if (isSeparator)
|
| - option.setAttribute('role', 'separator');
|
| - return option;
|
| -}
|
| -
|
| -/**
|
| - * Adds an option to the printer destination list.
|
| - * @param {string} optionText specifies the option text content.
|
| - * @param {string} optionValue specifies the option value.
|
| - * @param {boolean} isDefault is true if the option needs to be selected.
|
| - * @param {boolean} isDisabled is true if the option needs to be disabled.
|
| - * @param {boolean} isSeparator is true if the option serves just as a
|
| - * separator.
|
| - * @return {Object} The created option.
|
| - */
|
| -function addDestinationListOption(optionText, optionValue, isDefault,
|
| - isDisabled, isSeparator) {
|
| - var option = createDestinationListOption(optionText,
|
| - optionValue,
|
| - isDefault,
|
| - isDisabled,
|
| - isSeparator);
|
| - $('printer-list').add(option);
|
| - return option;
|
| -}
|
| -
|
| -/**
|
| - * Adds an option to the printer destination list at a specified position.
|
| - * @param {number} position The index in the printer-list wher the option
|
| - should be created.
|
| - * @param {string} optionText specifies the option text content.
|
| - * @param {string} optionValue specifies the option value.
|
| - * @param {boolean} isDefault is true if the option needs to be selected.
|
| - * @param {boolean} isDisabled is true if the option needs to be disabled.
|
| - * @param {boolean} isSeparator is true if the option is a visual separator and
|
| - * needs to be disabled.
|
| - * @return {Object} The created option.
|
| - */
|
| -function addDestinationListOptionAtPosition(position,
|
| - optionText,
|
| - optionValue,
|
| - isDefault,
|
| - isDisabled,
|
| - isSeparator) {
|
| - var option = createDestinationListOption(optionText,
|
| - optionValue,
|
| - isDefault,
|
| - isDisabled,
|
| - isSeparator);
|
| - var printerList = $('printer-list');
|
| - var before = printerList[position];
|
| - printerList.add(option, before);
|
| - return option;
|
| -}
|
| -/**
|
| - * Sets the color mode for the PDF plugin.
|
| - * Called from PrintPreviewHandler::ProcessColorSetting().
|
| - * @param {boolean} color is true if the PDF plugin should display in color.
|
| - */
|
| -function setColor(color) {
|
| - if (!previewArea.pdfPlugin)
|
| - return;
|
| -
|
| - previewArea.pdfPlugin.grayscale(!color);
|
| - var printerList = $('printer-list');
|
| - cloudprint.setColor(printerList[printerList.selectedIndex], color);
|
| -}
|
| -
|
| -/**
|
| - * Display an error message when print preview fails.
|
| - * Called from PrintPreviewMessageHandler::OnPrintPreviewFailed().
|
| - */
|
| -function printPreviewFailed() {
|
| - previewArea.displayErrorMessageAndNotify(
|
| - localStrings.getString('previewFailed'));
|
| -}
|
| -
|
| -/**
|
| - * Display an error message when encountered invalid printer settings.
|
| - * Called from PrintPreviewMessageHandler::OnInvalidPrinterSettings().
|
| - */
|
| -function invalidPrinterSettings() {
|
| - if (cr.isMac) {
|
| - if (previewAppRequested) {
|
| - $('open-preview-app-throbber').hidden = true;
|
| - previewArea.clearCustomMessageWithDots();
|
| - previewAppRequested = false;
|
| - hasPendingPrintDocumentRequest = false;
|
| - enableInputElementsInSidebar();
|
| - }
|
| - $('open-pdf-in-preview-link').disabled = true;
|
| - }
|
| - previewArea.displayErrorMessageAndNotify(
|
| - localStrings.getString('invalidPrinterSettings'));
|
| -}
|
| -
|
| -/**
|
| - * Called when the PDF plugin loads its document.
|
| - */
|
| -function onPDFLoad() {
|
| - if (previewModifiable) {
|
| - setPluginPreviewPageCount();
|
| - } else {
|
| - // If the source is pdf, print ready metafile is available only after
|
| - // loading the pdf in the plugin.
|
| - isPrintReadyMetafileReady = true;
|
| - }
|
| - // Instruct the plugin which page numbers to display in the page number
|
| - // indicator.
|
| - previewArea.pdfPlugin.setPageNumbers(
|
| - JSON.stringify(pageSettings.selectedPagesSet));
|
| - cr.dispatchSimpleEvent(document, customEvents.PDF_LOADED);
|
| - isFirstPageLoaded = true;
|
| - checkAndHideOverlayLayerIfValid();
|
| - sendPrintDocumentRequestIfNeeded();
|
| - if (printAutomaticallyInKioskMode)
|
| - printHeader.printButton.click();
|
| -}
|
| -
|
| -function setPluginPreviewPageCount() {
|
| - previewArea.pdfPlugin.printPreviewPageCount(
|
| - pageSettings.previouslySelectedPages.length);
|
| -}
|
| -
|
| -/**
|
| - * Update the page count and check the page range.
|
| - * Called from PrintPreviewUI::OnDidGetPreviewPageCount().
|
| - * @param {number} pageCount The number of pages.
|
| - * @param {number} previewResponseId The preview request id that resulted in
|
| - * this response.
|
| - */
|
| -function onDidGetPreviewPageCount(pageCount, previewResponseId) {
|
| - if (!isExpectedPreviewResponse(previewResponseId))
|
| - return;
|
| - pageSettings.updateState(pageCount);
|
| - if (!previewModifiable && pageSettings.requestPrintPreviewIfNeeded())
|
| - return;
|
| -
|
| - cr.dispatchSimpleEvent(document, customEvents.UPDATE_SUMMARY);
|
| -}
|
| -
|
| -/**
|
| - * @param {{contentWidth: number, contentHeight: number, marginLeft: number,
|
| - * marginRight: number, marginTop: number, marginBottom: number,
|
| - * printableAreaX: number, printableAreaY: number,
|
| - * printableAreaWidth: number, printableAreaHeight: number}} pageLayout
|
| - * Specifies default page layout details in points.
|
| - * @param {boolean} hasCustomPageSizeStyle Indicates whether the previewed
|
| - * document has a custom page size style.
|
| - */
|
| -function onDidGetDefaultPageLayout(pageLayout, hasCustomPageSizeStyle) {
|
| - hasPageSizeStyle = hasCustomPageSizeStyle;
|
| - marginSettings.currentDefaultPageLayout = new print_preview.PageLayout(
|
| - pageLayout.contentWidth,
|
| - pageLayout.contentHeight,
|
| - pageLayout.marginLeft,
|
| - pageLayout.marginTop,
|
| - pageLayout.marginRight,
|
| - pageLayout.marginBottom);
|
| - headerFooterSettings.checkAndHideHeaderFooterOption(
|
| - pageLayout, marginSettings.selectedMarginsValue);
|
| -}
|
| -
|
| -/**
|
| - * This function sends a request to hide the overlay layer only if there is no
|
| - * pending print document request and we are not waiting for the print ready
|
| - * metafile.
|
| - */
|
| -function checkAndHideOverlayLayerIfValid() {
|
| - var selectedPrinter = getSelectedPrinterName();
|
| - var printToDialog = selectedPrinter == PRINT_TO_PDF ||
|
| - selectedPrinter == PRINT_WITH_CLOUD_PRINT;
|
| - if ((printToDialog || !previewModifiable) &&
|
| - !isPrintReadyMetafileReady && hasPendingPrintDocumentRequest) {
|
| - return;
|
| - }
|
| - previewArea.hideOverlayLayer();
|
| -}
|
| -
|
| -/**
|
| - * 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;
|
| -
|
| - if (!previewModifiable)
|
| - previewArea.createOrReloadPDFPlugin(PRINT_READY_DATA_INDEX);
|
| - cr.dispatchSimpleEvent(document, customEvents.UPDATE_PRINT_BUTTON);
|
| - checkAndHideOverlayLayerIfValid();
|
| - var pageSet = pageSettings.previouslySelectedPages;
|
| - for (var i = 0; i < pageSet.length; i++) {
|
| - previewArea.pdfPlugin.loadPreviewPage(
|
| - getPageSrcURL(previewUid, pageSet[i] - 1), i);
|
| - }
|
| -
|
| - hasPendingPreviewRequest = false;
|
| - isPrintReadyMetafileReady = true;
|
| - previewArea.pdfLoaded = true;
|
| - sendPrintDocumentRequestIfNeeded();
|
| -}
|
| -
|
| -/**
|
| - * Notification that a print preview page has been rendered.
|
| - * 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, previewResponseId) {
|
| - if (!isExpectedPreviewResponse(previewResponseId))
|
| - return;
|
| -
|
| - // Refactor
|
| - if (!previewModifiable)
|
| - return;
|
| -
|
| - if (pageSettings.requestPrintPreviewIfNeeded())
|
| - return;
|
| -
|
| - var pageIndex = pageSettings.previouslySelectedPages.indexOf(pageNumber + 1);
|
| - if (pageIndex == -1)
|
| - return;
|
| -
|
| - currentPreviewUid = previewUid;
|
| - if (pageIndex == 0)
|
| - previewArea.createOrReloadPDFPlugin(pageNumber);
|
| -
|
| - previewArea.pdfPlugin.loadPreviewPage(
|
| - getPageSrcURL(previewUid, pageNumber), pageIndex);
|
| -
|
| - if (pageIndex + 1 == pageSettings.previouslySelectedPages.length) {
|
| - hasPendingPreviewRequest = false;
|
| - if (pageIndex != 0)
|
| - sendPrintDocumentRequestIfNeeded();
|
| - }
|
| -}
|
| -
|
| -/**
|
| - * Update the print preview when new preview data is available.
|
| - * Create the PDF plugin as needed.
|
| - * Called from PrintPreviewUI::PreviewDataIsAvailable().
|
| - * @param {string} previewUid Preview unique identifier.
|
| - * @param {number} previewResponseId The preview request id that resulted in
|
| - * this response.
|
| - */
|
| -function updatePrintPreview(previewUid, previewResponseId) {
|
| - if (!isExpectedPreviewResponse(previewResponseId))
|
| - return;
|
| -
|
| - if (!previewModifiable) {
|
| - // If the preview is not modifiable the plugin has not been created yet.
|
| - currentPreviewUid = previewUid;
|
| - hasPendingPreviewRequest = false;
|
| - previewArea.createOrReloadPDFPlugin(PRINT_READY_DATA_INDEX);
|
| - } else {
|
| - isPrintReadyMetafileReady = true;
|
| - }
|
| -
|
| - cr.dispatchSimpleEvent(document, customEvents.UPDATE_PRINT_BUTTON);
|
| - if (previewModifiable)
|
| - sendPrintDocumentRequestIfNeeded();
|
| -}
|
| -
|
| -/**
|
| - * Checks to see if the requested print data is available for printing and
|
| - * sends a print document request if needed.
|
| - */
|
| -function sendPrintDocumentRequestIfNeeded() {
|
| - if (!hasPendingPrintDocumentRequest || !isFirstPageLoaded)
|
| - return;
|
| -
|
| - // If the selected printer is PRINT_TO_PDF or PRINT_WITH_CLOUD_PRINT or
|
| - // the preview source is not modifiable, we need the print ready data for
|
| - // printing. If the preview source is modifiable, we need to wait till all
|
| - // the requested pages are loaded in the plugin for printing.
|
| - var selectedPrinter = getSelectedPrinterName();
|
| - var printToDialog = selectedPrinter == PRINT_TO_PDF ||
|
| - selectedPrinter == PRINT_WITH_CLOUD_PRINT;
|
| - if (((printToDialog || !previewModifiable) && !isPrintReadyMetafileReady) ||
|
| - (previewModifiable && hasPendingPreviewRequest)) {
|
| - return;
|
| - }
|
| -
|
| - hasPendingPrintDocumentRequest = false;
|
| -
|
| - if (!areSettingsValid()) {
|
| - cancelPendingPrintRequest();
|
| - return;
|
| - }
|
| - sendPrintDocumentRequest();
|
| -}
|
| -
|
| -/**
|
| - * 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());
|
| -}
|
| -
|
| -/**
|
| - * Called either when there is a scroll event or when the plugin size changes.
|
| - */
|
| -function onPreviewPositionChanged() {
|
| - marginSettings.onPreviewPositionChanged();
|
| -}
|
| -
|
| -/**
|
| - * @return {boolean} true if a compatible pdf plugin exists.
|
| - */
|
| -function checkCompatiblePluginExists() {
|
| - var dummyPlugin = $('dummy-viewer');
|
| - var pluginInterface = [dummyPlugin.onload,
|
| - dummyPlugin.goToPage,
|
| - dummyPlugin.removePrintButton,
|
| - dummyPlugin.loadPreviewPage,
|
| - dummyPlugin.printPreviewPageCount,
|
| - dummyPlugin.resetPrintPreviewUrl,
|
| - dummyPlugin.onPluginSizeChanged,
|
| - dummyPlugin.onScroll,
|
| - dummyPlugin.pageXOffset,
|
| - dummyPlugin.pageYOffset,
|
| - dummyPlugin.setZoomLevel,
|
| - dummyPlugin.setPageNumbers,
|
| - dummyPlugin.setPageXOffset,
|
| - dummyPlugin.setPageYOffset,
|
| - dummyPlugin.getHorizontalScrollbarThickness,
|
| - dummyPlugin.getVerticalScrollbarThickness,
|
| - dummyPlugin.getPageLocationNormalized,
|
| - dummyPlugin.getHeight,
|
| - dummyPlugin.getWidth];
|
| -
|
| - for (var i = 0; i < pluginInterface.length; i++) {
|
| - if (!pluginInterface[i])
|
| - return false;
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -/**
|
| - * Sets the default values and sends a request to regenerate preview data.
|
| - * Resets the margin options only if |resetMargins| is true.
|
| - * @param {boolean} resetMargins True if margin settings should be resetted.
|
| - */
|
| -function setDefaultValuesAndRegeneratePreview(resetMargins) {
|
| - if (resetMargins)
|
| - marginSettings.resetMarginsIfNeeded();
|
| - pageSettings.resetState();
|
| - requestPrintPreview();
|
| -}
|
| -
|
| -/**
|
| - * Class that represents the state of the print settings.
|
| - * @constructor
|
| - */
|
| -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();
|
| -};
|
| -
|
| -/**
|
| - * Updates the title of the print preview tab according to |initiatorTabTitle|.
|
| - * @param {string} initiatorTabTitle The title of the initiator tab.
|
| - */
|
| -function setInitiatorTabTitle(initiatorTabTitle) {
|
| - if (initiatorTabTitle == '')
|
| - return;
|
| - document.title = localStrings.getStringF(
|
| - 'printPreviewTitleFormat', initiatorTabTitle);
|
| -}
|
| -
|
| -/**
|
| - * Closes this print preview tab.
|
| - */
|
| -function closePrintPreviewTab() {
|
| - window.removeEventListener('keydown', onKeyDown);
|
| - chrome.send('closePrintPreviewTab');
|
| - chrome.send('DialogClose');
|
| -}
|
| -
|
| -/**
|
| - * Pass certain directional keyboard events to the PDF viewer.
|
| - * @param {Event} e The keydown event.
|
| - */
|
| -function tryToHandleDirectionKeyDown(e) {
|
| - // Make sure the PDF plugin is there.
|
| - if (!previewArea.pdfPlugin)
|
| - return;
|
| -
|
| - // We only care about: PageUp, PageDown, Left, Up, Right, Down.
|
| - if (!(e.keyCode == 33 || e.keyCode == 34 ||
|
| - (e.keyCode >= 37 && e.keyCode <= 40))) {
|
| - return;
|
| - }
|
| -
|
| - // If the user is holding a modifier key, ignore.
|
| - if (e.metaKey || e.altKey || e.shiftKey || e.ctrlKey)
|
| - return;
|
| -
|
| - // Don't handle the key event for these elements.
|
| - var tagName = document.activeElement.tagName;
|
| - if (tagName == 'INPUT' || tagName == 'SELECT' || tagName == 'EMBED')
|
| - return;
|
| -
|
| - // For the most part, if any div of header was the last clicked element,
|
| - // then the active element is the body. Starting with the last clicked
|
| - // element, and work up the DOM tree to see if any element has a scrollbar.
|
| - // If there exists a scrollbar, do not handle the key event here.
|
| - var element = document.activeElement;
|
| - if (element == document.body) {
|
| - if (lastClickedElement)
|
| - element = lastClickedElement;
|
| - while (element) {
|
| - if (element.scrollHeight > element.clientHeight)
|
| + this.printDocumentOrOpenPdfPreview_(true /*isPdfPreview*/);
|
| + },
|
| +
|
| + /**
|
| + * Called when the print header's print button is clicked. Prints the
|
| + * document.
|
| + * @private
|
| + */
|
| + onPrintButtonClick_: function() {
|
| + assert(this.uiState_ == PrintPreview.UiState_.READY,
|
| + 'Trying to print when not in ready state: ' + this.uiState_);
|
| + this.printDocumentOrOpenPdfPreview_(false /*isPdfPreview*/);
|
| + },
|
| +
|
| + /**
|
| + * Called when the print header's cancel button is clicked. Closes the
|
| + * print dialog.
|
| + * @private
|
| + */
|
| + onCancelButtonClick_: function() {
|
| + this.close_();
|
| + },
|
| +
|
| + /**
|
| + * Consume escape key presses and ctrl + shift + p. Delegate everything else
|
| + * to the preview area.
|
| + * @param {KeyboardEvent} e The keyboard event.
|
| + * @private
|
| + */
|
| + onKeyDown_: function(e) {
|
| + // Escape key closes the dialog.
|
| + if (e.keyCode == 27 && !e.shiftKey && !e.ctrlKey && !e.altKey &&
|
| + !e.metaKey) {
|
| + this.close_();
|
| + e.preventDefault();
|
| return;
|
| - element = element.parentElement;
|
| + }
|
| +
|
| + // Ctrl + Shift + p / Mac equivalent.
|
| + if (e.keyCode == 80) {
|
| + if ((cr.isMac && e.metaKey && e.altKey && !e.shiftKey && !e.ctrlKey) ||
|
| + (!cr.isMac && e.shiftKey && e.ctrlKey && !e.altKey && !e.metaKey)) {
|
| + this.openSystemPrintDialog_();
|
| + e.preventDefault();
|
| + return;
|
| + }
|
| + }
|
| +
|
| + // Pass certain directional keyboard events to the PDF viewer.
|
| + this.previewArea_.handleDirectionalKeyEvent(e);
|
| + },
|
| +
|
| + /**
|
| + * Called when native layer receives invalid settings for a print request.
|
| + * @private
|
| + */
|
| + onSettingsInvalid_: function() {
|
| + this.uiState_ = PrintPreview.UiState_.ERROR;
|
| + this.previewArea_.showCustomMessage(
|
| + localStrings.getString('invalidPrinterSettings'));
|
| + },
|
| +
|
| + /**
|
| + * Called when the native layer dispatches a DISABLE_SCALING event. Updates
|
| + * the print ticket.
|
| + * @private
|
| + */
|
| + onDisableScaling_: function() {
|
| + this.printTicketStore_.updateFitToPage(false);
|
| + },
|
| +
|
| + /**
|
| + * Called when the user selects the "Manage printers..." option in the
|
| + * destination select.
|
| + * @private
|
| + */
|
| + onManagePrinters_: function() {
|
| + if (cr.isChromeOS) {
|
| + this.nativeLayer_.startManageCloudPrinters();
|
| + } else {
|
| + this.nativeLayer_.startManageLocalPrinters();
|
| + }
|
| }
|
| - }
|
| -
|
| - // No scroll bar anywhere, or the active element is something else, like a
|
| - // button. Note: buttons have a bigger scrollHeight than clientHeight.
|
| - previewArea.pdfPlugin.sendKeyEvent(e.keyCode);
|
| - e.preventDefault();
|
| -}
|
| -
|
| -/**
|
| - * Handle keyboard events.
|
| - * @param {KeyboardEvent} e The keyboard event.
|
| - */
|
| -function onKeyDown(e) {
|
| - // Escape key closes the dialog.
|
| - if (e.keyCode == 27 && !e.shiftKey && !e.ctrlKey && !e.altKey && !e.metaKey) {
|
| - printHeader.disableCancelButton();
|
| - closePrintPreviewTab();
|
| - e.preventDefault();
|
| - }
|
| - // Ctrl + Shift + p / Mac equivalent.
|
| - if (e.keyCode == 80) {
|
| - if ((cr.isMac && e.metaKey && e.altKey && !e.shiftKey && !e.ctrlKey) ||
|
| - (!cr.isMac && e.shiftKey && e.ctrlKey && !e.altKey && !e.metaKey)) {
|
| - window.removeEventListener('keydown', onKeyDown);
|
| - onSystemDialogLinkClicked();
|
| - e.preventDefault();
|
| - }
|
| - }
|
| -
|
| - tryToHandleDirectionKeyDown(e);
|
| -}
|
| -
|
| -window.addEventListener('DOMContentLoaded', onLoad);
|
| -window.addEventListener('keydown', onKeyDown);
|
| -
|
| -/// Pull in all other scripts in a single shot.
|
| + };
|
| +
|
| + // Export
|
| + return {
|
| + PrintPreview: PrintPreview
|
| + };
|
| +});
|
| +
|
| +// Pull in all other scripts in a single shot.
|
| +<include src="data/page_number_set.js"/>
|
| +<include src="data/destination.js"/>
|
| +<include src="data/local_parsers.js"/>
|
| +<include src="data/cloud_parsers.js"/>
|
| +<include src="data/chromium_capabilities.js"/>
|
| +<include src="data/cloud_capabilities.js"/>
|
| +<include src="data/destination_store.js"/>
|
| +<include src="data/margins.js"/>
|
| +<include src="data/document_info.js"/>
|
| +<include src="data/printable_area.js"/>
|
| +<include src="data/measurement_system.js"/>
|
| +<include src="data/print_ticket_store.js"/>
|
| +<include src="data/coordinate2d.js"/>
|
| +<include src="data/size.js"/>
|
| +<include src="data/capabilities_holder.js"/>
|
| +
|
| +<include src="data/ticket_items/ticket_item.js"/>
|
| +
|
| +<include src="data/ticket_items/custom_margins.js"/>
|
| +<include src="data/ticket_items/collate.js"/>
|
| +<include src="data/ticket_items/color.js"/>
|
| +<include src="data/ticket_items/copies.js"/>
|
| +<include src="data/ticket_items/duplex.js"/>
|
| +<include src="data/ticket_items/header_footer.js"/>
|
| +<include src="data/ticket_items/landscape.js"/>
|
| +<include src="data/ticket_items/margins_type.js"/>
|
| +<include src="data/ticket_items/page_range.js"/>
|
| +<include src="data/ticket_items/fit_to_page.js"/>
|
| +
|
| +<include src="native_layer.js"/>
|
| <include src="print_preview_animations.js"/>
|
| -<include src="print_preview_cloud.js"/>
|
| +<include src="cloud_print_interface.js"/>
|
| <include src="print_preview_utils.js"/>
|
| <include src="print_header.js"/>
|
| -<include src="page_settings.js"/>
|
| -<include src="copies_settings.js"/>
|
| -<include src="header_footer_settings.js"/>
|
| -<include src="fit_to_page_settings.js"/>
|
| -<include src="layout_settings.js"/>
|
| -<include src="color_settings.js"/>
|
| -<include src="margin_settings.js"/>
|
| -<include src="margin_textbox.js"/>
|
| -<include src="margin_utils.js"/>
|
| -<include src="margins_ui.js"/>
|
| -<include src="margins_ui_pair.js"/>
|
| -<include src="more_options.js"/>
|
| -<include src="preview_area.js"/>
|
| +
|
| +<include src="settings/page_settings.js"/>
|
| +<include src="settings/copies_settings.js"/>
|
| +<include src="settings/layout_settings.js"/>
|
| +<include src="settings/color_settings.js"/>
|
| +<include src="settings/margin_settings.js"/>
|
| +<include src="settings/destination_settings.js"/>
|
| +<include src="settings/other_options_settings.js"/>
|
| +
|
| +<include src="previewarea/margin_control.js"/>
|
| +<include src="previewarea/margin_control_container.js"/>
|
| +<include src="previewarea/preview_area.js"/>
|
| +<include src="preview_generator.js"/>
|
| +
|
| +var printPreview = new print_preview.PrintPreview();
|
|
|