| Index: chrome/browser/resources/print_preview/native_layer.js
|
| diff --git a/chrome/browser/resources/print_preview/native_layer.js b/chrome/browser/resources/print_preview/native_layer.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..be43a8ee5868ddadcf52d230f73456693189c3fc
|
| --- /dev/null
|
| +++ b/chrome/browser/resources/print_preview/native_layer.js
|
| @@ -0,0 +1,433 @@
|
| +// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +cr.define('print_preview', function() {
|
| + 'use strict';
|
| +
|
| + /**
|
| + * An interface to the native Chromium printing system layer.
|
| + *
|
| + * @constructor
|
| + * @extends {cr.EventTarget}
|
| + */
|
| + function NativeLayer() {
|
| + cr.EventTarget.call(this);
|
| + };
|
| +
|
| + /**
|
| + * Events dispatched from the Chromium native layer.
|
| + * @enum {string}
|
| + * @const
|
| + */
|
| + NativeLayer.Event = {
|
| + CAPABILITIES_SET: 'print_preview.NativeLayer.CAPABILITIES_SET',
|
| + CLOUD_PRINT_ENABLE: 'print_preview.NativeLayer.CLOUD_PRINT_ENABLE',
|
| + DESTINATIONS_RELOAD: 'print_preview.NativeLayer.DESTINATIONS_RELOAD',
|
| + FILE_SELECTION_CANCEL: 'print_preview.NativeLayer.FILE_SELECTION_CANCEL',
|
| + FILE_SELECTION_COMPLETE:
|
| + 'print_preview.NativeLayer.FILE_SELECTION_COMPLETE',
|
| + INITIAL_SETTINGS_SET: 'print_preview.NativeLayer.INITIAL_SETTINGS_SET',
|
| + LOCAL_DESTINATIONS_SET: 'print_preview.NativeLayer.LOCAL_DESTINATIONS_SET',
|
| + PAGE_COUNT_CHANGE: 'print_preview.NativeLayer.PAGE_COUNT_CHANGE',
|
| + PAGE_LAYOUT_CHANGE: 'print_preview.NativeLayer.PAGE_LAYOUT_CHANGE',
|
| + PAGE_PREVIEW_READY: 'print_preview.NativeLayer.PAGE_PREVIEW_READY',
|
| + PREVIEW_GENERATION_DONE:
|
| + 'print_preview.NativeLayer.PREVIEW_GENERATION_DONE',
|
| + PREVIEW_GENERATION_FAIL:
|
| + 'print_preview.NativeLayer.PREVIEW_GENERATION_FAIL',
|
| + PREVIEW_RELOAD: 'print_preview.NativeLayer.PREVIEW_RELOAD',
|
| + PRINT_TO_CLOUD: 'print_preview.NativeLayer.PRINT_TO_CLOUD',
|
| + SETTINGS_INVALID: 'print_preview.NativeLayer.SETTINGS_INVALID'
|
| + };
|
| +
|
| + NativeLayer.prototype = {
|
| + __proto__: cr.EventTarget.prototype,
|
| +
|
| + // TODO Remove me
|
| + dispatchEvent: function(evt) {
|
| + log(evt.type);
|
| + cr.EventTarget.prototype.dispatchEvent.call(this, evt);
|
| + },
|
| +
|
| + /** Gets the initial settings to initialize the print preview with. */
|
| + startGetInitialSettings: function() {
|
| + chrome.send('getInitialSettings');
|
| + },
|
| +
|
| + /**
|
| + * Requests the system's local print destinations. A LOCAL_DESTINATIONS_SET
|
| + * event will be dispatched in response.
|
| + */
|
| + startGetLocalDestinations: function() {
|
| + chrome.send('getPrinters');
|
| + },
|
| +
|
| + /**
|
| + * Requests the destination's printing capabilities. A CAPABILITIES_SET
|
| + * event will be dispatched in response.
|
| + * @param {string} destinationId ID of the destination.
|
| + */
|
| + startGetLocalDestinationCapabilities: function(destinationId) {
|
| + chrome.send('getPrinterCapabilities', [destinationId]);
|
| + },
|
| +
|
| + /**
|
| + * Requests that a preview be generated. The following events may be
|
| + * dispatched in response:
|
| + * - PAGE_COUNT_CHANGE
|
| + * - PAGE_LAYOUT_CHANGE
|
| + * - PAGE_PREVIEW_READY
|
| + * - PREVIEW_GENERATION_DONE
|
| + * - PREVIEW_GENERATION_FAIL
|
| + * - PREVIEW_RELOAD
|
| + * @param {print_preview.Destination?} destination Destination to print to.
|
| + * @param {print_preview.PrintTicketStore!} printTicketStore Used to get the
|
| + * state of the print ticket.
|
| + * @param {number} ID of the preview request.
|
| + */
|
| + startGetPreview: function(destination, printTicketStore, requestId) {
|
| + if (!printTicketStore.isTicketValid()) {
|
| + throw Error('Trying to generate preview when ticket is not valid');
|
| + }
|
| +
|
| + var ticket = {
|
| + 'pageRange': [], // TODO this.ticket_.pageRangeSequence,
|
| + 'landscape': printTicketStore.isLandscapeEnabled(),
|
| + 'color': printTicketStore.getColorMode(),
|
| + 'headerFooterEnabled': printTicketStore.isHeaderFooterEnabled(),
|
| + 'marginsType': printTicketStore.getMarginsType(),
|
| + 'isFirstRequest': requestId == 0,
|
| + 'requestID': requestId,
|
| + 'previewModifiable': printTicketStore.isDocumentModifiable,
|
| + 'printToPDF': destination != null && destination.isPrintToPdf,
|
| + 'printWithCloudPrint': destination != null && !destination.isLocal,
|
| + 'deviceName': destination == null ? 'foo' : destination.id,
|
| + 'cloudPrintID': destination == null ? 'foo' : destination.id,
|
| +
|
| + // This field seems to issue a reloadPreviewPages call when true.
|
| + 'generateDraftData': true, // TODO What should this value be?
|
| +
|
| + // NOTE: Even though the following fields don't directly relate to the
|
| + // preview, they still need to be included.
|
| + 'duplex': printTicketStore.getDuplexMode(),
|
| + 'copies': printTicketStore.getCopies(),
|
| + 'collate': printTicketStore.isCollateEnabled()
|
| + };
|
| +
|
| + if (printTicketStore.getMarginsType() ==
|
| + print_preview.Margins.Type.CUSTOM) {
|
| + var customMargins = printTicketStore.getCustomMargins();
|
| + ticket['marginsCustom'] = {
|
| + 'marginTop': customMargins.top,
|
| + 'marginRight': customMargins.right,
|
| + 'marginBottom': customMargins.bottom,
|
| + 'marginLeft': customMargins.left
|
| + };
|
| + }
|
| +
|
| + var pageCount = requestId == 0 ? -1 : printTicketStore.pageCount;
|
| + // TODO this.printTicketStore_.getPageNumberSet().size,
|
| + chrome.send(
|
| + 'getPreview',
|
| + [JSON.stringify(ticket),
|
| + pageCount,
|
| + printTicketStore.isDocumentModifiable]);
|
| + },
|
| +
|
| + /**
|
| + * Persists the selected destination and print ticket for the next print
|
| + * session.
|
| + * @param {string} destinatId ID of the destination.
|
| + * @param {string} serializedTicket Serialized form of the print ticket.
|
| + */
|
| + startSaveDestinationAndTicket: function(destinationId, serializedTicket) {
|
| + chrome.send('saveLastPrinter', [destinationId, serializedTicket]);
|
| + },
|
| +
|
| + /**
|
| + * Requests that the document be printed.
|
| + * @param {print_preview.Destination!} destination Destination to print to.
|
| + * @param {print_preview.PrintTicketStore!} printTicketStore Used to get the
|
| + * state of the print ticket.
|
| + * @param {print_preview.CloudPrintInterface?} cloudPrintInterface Interface
|
| + * to Google Cloud Print.
|
| + */
|
| + startPrint: function(destination, printTicketStore, cloudPrintInterface) {
|
| + if (!printTicketStore.isTicketValid()) {
|
| + throw Error(
|
| + 'Requesting ticket for preview generator when ticket is not valid');
|
| + }
|
| +
|
| + var ticket = {
|
| + 'pageRange': [], // TODO this.ticket_.pageRangeSequence,
|
| + 'landscape': printTicketStore.isLandscapeEnabled(),
|
| + 'color': printTicketStore.getColorMode(),
|
| + 'headerFooterEnabled': printTicketStore.isHeaderFooterEnabled(),
|
| + 'marginsType': printTicketStore.getMarginsType(),
|
| + 'generateDraftData': true, // TODO What should this value be?
|
| + 'duplex': printTicketStore.getDuplexMode(),
|
| + 'copies': printTicketStore.getCopies(),
|
| + 'collate': printTicketStore.isCollateEnabled(),
|
| + 'previewModifiable': printTicketStore.isDocumentModifiable,
|
| + 'printToPDF': destination.isPrintToPdf,
|
| + 'printWithCloudPrint': !destination.isLocal,
|
| + 'deviceName': destination.id,
|
| + 'isFirstRequest': false,
|
| + 'requestID': -1
|
| + };
|
| +
|
| + if (!destination.isLocal && !destination.isPrintWithCloudPrint) {
|
| + // We can't set cloudPrintID if the destination is "Print with Cloud
|
| + // Print" because the native system will try to print to Google Cloud
|
| + // Print with this ID instead of opening a Google Cloud Print dialog.
|
| + ticket['cloudPrintID'] = destination.id;
|
| + }
|
| +
|
| + if (printTicketStore.getMarginsType() ==
|
| + print_preview.Margins.Type.CUSTOM) {
|
| + var customMargins = printTicketStore.getCustomMargins();
|
| + ticket['marginsCustom'] = {
|
| + 'marginTop': customMargins.top,
|
| + 'marginRight': customMargins.right,
|
| + 'marginBottom': customMargins.bottom,
|
| + 'marginLeft': customMargins.left
|
| + };
|
| + }
|
| +
|
| + var cloudTicket = null;
|
| + if (!destination.isLocal) {
|
| + if (!cloudPrintInterface) {
|
| + throw Error(
|
| + 'Trying to print to a cloud destination but Google Cloud Print ' +
|
| + 'integration is disabled');
|
| + }
|
| + cloudTicket = cloudPrintInterface.createPrintTicket(
|
| + destination, printTicketStore);
|
| + cloudTicket = JSON.stringify(cloudTicket);
|
| + }
|
| +
|
| + chrome.send('print', [JSON.stringify(ticket), cloudTicket]);
|
| + },
|
| +
|
| + /** Requests that the current pending print request be cancelled. */
|
| + startCancelPendingPrint: function() {
|
| + chrome.send('cancelPendingPrintRequest');
|
| + },
|
| +
|
| + /** Shows the system's native printing dialog. */
|
| + startShowSystemDialog: function() {
|
| + chrome.send('showSystemDialog');
|
| + },
|
| +
|
| + /** Closes the print preview dialog. */
|
| + startCloseDialog: function() {
|
| + chrome.send('closePrintPreviewTab');
|
| + chrome.send('DialogClose');
|
| + },
|
| +
|
| + /**
|
| + * Opens the Google Cloud Print sign-in dialog. The DESTINATIONS_RELOAD
|
| + * event will be dispatched in response.
|
| + */
|
| + startCloudPrintSignIn: function() {
|
| + chrome.send('signIn');
|
| + },
|
| +
|
| + /** Navigates the user to the system printer settings interface. */
|
| + startManageLocalPrinters: function() {
|
| + chrome.send('manageLocalPrinters');
|
| + },
|
| +
|
| + /** Navigates the user to the Google Cloud Print management page. */
|
| + startManageCloudPrinters: function() {
|
| + chrome.send('manageCloudPrinters');
|
| + }
|
| + };
|
| +
|
| + return {
|
| + NativeLayer: NativeLayer
|
| + };
|
| +});
|
| +
|
| +var nativeLayer = new print_preview.NativeLayer();
|
| +
|
| +/** @param {object} initialSettings Object containing all initial settings. */
|
| +function setInitialSettings(initialSettings) {
|
| + var initialSettingsSetEvt = new cr.Event(
|
| + print_preview.NativeLayer.Event.INITIAL_SETTINGS_SET);
|
| + initialSettingsSetEvt.initialSettings = initialSettings;
|
| + nativeLayer.dispatchEvent(initialSettingsSetEvt);
|
| +}
|
| +
|
| +/**
|
| + * Turn on the integration of Cloud Print.
|
| + * @param {string} cloudPrintURL The URL to use for cloud print servers.
|
| + */
|
| +function setUseCloudPrint(cloudPrintURL) {
|
| + var cloudPrintEnableEvt = new cr.Event(
|
| + print_preview.NativeLayer.Event.CLOUD_PRINT_ENABLE);
|
| + cloudPrintEnableEvt.baseCloudPrintUrl = cloudPrintURL;
|
| + nativeLayer.dispatchEvent(cloudPrintEnableEvt);
|
| +}
|
| +
|
| +/**
|
| + * Updates the print preview with local printers.
|
| + * Called from PrintPreviewHandler::SetupPrinterList().
|
| + * @param {Array} printers Array of printer info objects.
|
| + */
|
| +function setPrinters(printers) {
|
| + var localDestsSetEvt = new cr.Event(
|
| + print_preview.NativeLayer.Event.LOCAL_DESTINATIONS_SET);
|
| + localDestsSetEvt.destinationInfos = printers;
|
| + nativeLayer.dispatchEvent(localDestsSetEvt);
|
| +}
|
| +
|
| +/**
|
| + * Called when native layer gets settings information for a requested local
|
| + * destination.
|
| + * @param {Object} settingsInfo printer setting information.
|
| + */
|
| +function updateWithPrinterCapabilities(settingsInfo) {
|
| + var capsSetEvt = new cr.Event(
|
| + print_preview.NativeLayer.Event.CAPABILITIES_SET);
|
| + capsSetEvt.settingsInfo = settingsInfo;
|
| + nativeLayer.dispatchEvent(capsSetEvt);
|
| +}
|
| +
|
| +/** Reloads the printer list. */
|
| +function reloadPrintersList() {
|
| + cr.dispatchSimpleEvent(
|
| + nativeLayer, print_preview.NativeLayer.Event.DESTINATIONS_RELOAD);
|
| +}
|
| +
|
| +/**
|
| + * Called from the C++ layer.
|
| + * 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) {
|
| + var printToCloudEvt = new cr.Event(
|
| + print_preview.NativeLayer.Event.PRINT_TO_CLOUD);
|
| + printToCloudEvt.data = data;
|
| + nativeLayer.dispatchEvent(printToCloudEvt);
|
| +}
|
| +
|
| +/**
|
| + * Called from PrintPreviewUI::OnFileSelectionCancelled to notify the print
|
| + * preview tab regarding the file selection cancel event.
|
| + */
|
| +function fileSelectionCancelled() {
|
| + cr.dispatchSimpleEvent(
|
| + nativeLayer, print_preview.NativeLayer.Event.FILE_SELECTION_CANCEL);
|
| +}
|
| +
|
| +/**
|
| + * 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.
|
| + cr.dispatchSimpleEvent(
|
| + nativeLayer, print_preview.NativeLayer.Event.FILE_SELECTION_COMPLETE);
|
| +}
|
| +
|
| +/**
|
| + * Display an error message when print preview fails.
|
| + * Called from PrintPreviewMessageHandler::OnPrintPreviewFailed().
|
| + */
|
| +function printPreviewFailed() {
|
| + cr.dispatchSimpleEvent(
|
| + nativeLayer, print_preview.NativeLayer.Event.PREVIEW_GENERATION_FAIL);
|
| +}
|
| +
|
| +/**
|
| + * Display an error message when encountered invalid printer settings.
|
| + * Called from PrintPreviewMessageHandler::OnInvalidPrinterSettings().
|
| + */
|
| +function invalidPrinterSettings() {
|
| + cr.dispatchSimpleEvent(
|
| + nativeLayer, print_preview.NativeLayer.Event.SETTINGS_INVALID);
|
| +}
|
| +
|
| +/**
|
| + * @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) {
|
| + var pageLayoutChangeEvt = new cr.Event(
|
| + print_preview.NativeLayer.Event.PAGE_LAYOUT_CHANGE);
|
| + pageLayoutChangeEvt.pageLayout = pageLayout;
|
| + pageLayoutChangeEvt.hasCustomPageSizeStyle = hasCustomPageSizeStyle;
|
| + nativeLayer.dispatchEvent(pageLayoutChangeEvt);
|
| +}
|
| +
|
| +/**
|
| + * 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) {
|
| + var pageCountChangeEvt = new cr.Event(
|
| + print_preview.NativeLayer.Event.PAGE_COUNT_CHANGE);
|
| + pageCountChangeEvt.pageCount = pageCount;
|
| + pageCountChangeEvt.previewResponseId = previewResponseId;
|
| + nativeLayer.dispatchEvent(pageCountChangeEvt);
|
| +}
|
| +
|
| +/**
|
| + * 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) {
|
| + var previewReloadEvt = new cr.Event(
|
| + print_preview.NativeLayer.Event.PREVIEW_RELOAD);
|
| + previewReloadEvt.previewUid = previewUid;
|
| + previewReloadEvt.previewResponseId = previewResponseId;
|
| + nativeLayer.dispatchEvent(previewReloadEvt);
|
| +}
|
| +
|
| +/**
|
| + * 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) {
|
| + var pagePreviewGenEvt = new cr.Event(
|
| + print_preview.NativeLayer.Event.PAGE_PREVIEW_READY);
|
| + pagePreviewGenEvt.pageIndex = pageNumber;
|
| + pagePreviewGenEvt.previewUid = previewUid;
|
| + pagePreviewGenEvt.previewResponseId = previewResponseId;
|
| + nativeLayer.dispatchEvent(pagePreviewGenEvt);
|
| +}
|
| +
|
| +/**
|
| + * 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) {
|
| + var previewGenDoneEvt = new cr.Event(
|
| + print_preview.NativeLayer.Event.PREVIEW_GENERATION_DONE);
|
| + previewGenDoneEvt.previewUid = previewUid;
|
| + previewGenDoneEvt.previewResponseId = previewResponseId;
|
| + nativeLayer.dispatchEvent(previewGenDoneEvt);
|
| +}
|
|
|