| Index: remoting/webapp/app_remoting/js/cloud_print_dialog_container.js
|
| diff --git a/remoting/webapp/app_remoting/js/cloud_print_dialog_container.js b/remoting/webapp/app_remoting/js/cloud_print_dialog_container.js
|
| deleted file mode 100644
|
| index a927ec6fa4df65aaac70cf4775246fde03bf87a2..0000000000000000000000000000000000000000
|
| --- a/remoting/webapp/app_remoting/js/cloud_print_dialog_container.js
|
| +++ /dev/null
|
| @@ -1,331 +0,0 @@
|
| -/* Copyright 2015 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.
|
| - */
|
| -
|
| -/**
|
| - * @fileoverview
|
| - * The application side of the application/cloud print dialog interface, used
|
| - * by the application to exchange messages with the dialog.
|
| - */
|
| -
|
| -/** @suppress {duplicate} */
|
| -var remoting = remoting || {};
|
| -
|
| -/**
|
| - * According to https://developer.chrome.com/apps/tags/webview, the level
|
| - * ranges from 0 to 4. But in real life they are -1 (debug), 0 (log and info),
|
| - * 1 (warn), and 2 (error). See crbug.com/499408
|
| - *
|
| - * @enum {number}
|
| - */
|
| -remoting.ConsoleMessageLevel = {
|
| - // console.debug
|
| - VERBOSE: -1,
|
| - // console.info or console.log
|
| - INFO: 0,
|
| - // console.warn
|
| - WARNING: 1,
|
| - //console.err
|
| - ERROR: 2
|
| -};
|
| -
|
| -(function() {
|
| -
|
| -'use strict';
|
| -
|
| -/**
|
| - * Interval to refresh the access token used by the cloud print dialog.
|
| - * Refreshing the token every 30 minutes should be good enough because the
|
| - * access token will be valid for an hour.
|
| - *
|
| - * @const {number}
|
| - */
|
| -var CLOUD_PRINT_DIALOG_TOKEN_REFRESH_INTERVAL_MS = 30 * 60 * 1000;
|
| -
|
| -/**
|
| - * @param {!Webview} webview The webview hosting the cloud cloud print dialog.
|
| - * @param {remoting.WindowShape} windowShape
|
| - * @param {base.WindowMessageDispatcher} windowMessageDispatcher
|
| - * @param {!remoting.ConnectedView} connectedView
|
| - * @constructor
|
| - * @implements {remoting.WindowShape.ClientUI}
|
| - * @implements {base.Disposable}
|
| - */
|
| -remoting.CloudPrintDialogContainer =
|
| - function(webview, windowShape, windowMessageDispatcher, connectedView) {
|
| - /** @private {!Webview} */
|
| - this.webview_ = webview;
|
| -
|
| - /** @private {remoting.WindowShape} */
|
| - this.windowShape_ = windowShape;
|
| -
|
| - /** @private {!remoting.ConnectedView} */
|
| - this.connectedView_ = connectedView;
|
| -
|
| - // TODO (weitaosu): This is only needed if the cloud print webview is on the
|
| - // same page as the plugin. We should remove it if we move the webview to a
|
| - // standalone message window.
|
| - this.connectedView_.allowFocus(webview);
|
| -
|
| - /** @private {string} */
|
| - this.accessToken_ = '';
|
| -
|
| - /** @private {base.WindowMessageDispatcher} */
|
| - this.windowMessageDispatcher_ = windowMessageDispatcher;
|
| -
|
| - this.windowMessageDispatcher_.registerMessageHandler(
|
| - 'cloud-print-dialog', this.onMessage_.bind(this));
|
| -
|
| - /** @private {base.RepeatingTimer} */
|
| - this.timer_ = new base.RepeatingTimer(
|
| - this.cacheAccessToken_.bind(this),
|
| - CLOUD_PRINT_DIALOG_TOKEN_REFRESH_INTERVAL_MS, true);
|
| -
|
| - // Adding a synchronous (blocking) handler so that the reqeust headers can
|
| - // be modified on the spot.
|
| - webview.request.onBeforeSendHeaders.addListener(
|
| - this.setAuthHeaders_.bind(this),
|
| - /** @type {!RequestFilter} */ ({urls: ['https://*.google.com/*']}),
|
| - ['requestHeaders','blocking']);
|
| -};
|
| -
|
| -remoting.CloudPrintDialogContainer.INJECTED_SCRIPT =
|
| - '_modules/koejkfhmphamcgafjmkellhnekdkopod/cloud_print_dialog_injected.js';
|
| -remoting.CloudPrintDialogContainer.CLOUD_PRINT_DIALOG_URL =
|
| - 'https://www.google.com/cloudprint/dialog.html?';
|
| -
|
| -remoting.CloudPrintDialogContainer.prototype.dispose = function() {
|
| - this.windowMessageDispatcher_.unregisterMessageHandler('cloud-print-dialog');
|
| - this.timer_.dispose();
|
| -};
|
| -
|
| -/**
|
| - * Timer callback to cache the access token.
|
| - * @private
|
| - */
|
| -remoting.CloudPrintDialogContainer.prototype.cacheAccessToken_ = function() {
|
| - /** @type {remoting.CloudPrintDialogContainer} */
|
| - var that = this;
|
| - remoting.identity.getNewToken().then(
|
| - function(/** string */ token){
|
| - console.assert(token !== that.accessToken_);
|
| - that.accessToken_ = token;
|
| - }).catch(remoting.Error.handler(function(/** remoting.Error */ error) {
|
| - console.log('Failed to refresh access token: ' + error.toString());
|
| - }));
|
| -};
|
| -
|
| -/**
|
| - * @param {Array<{left: number, top: number, width: number, height: number}>}
|
| - * rects List of rectangles.
|
| - */
|
| -remoting.CloudPrintDialogContainer.prototype.addToRegion = function(rects) {
|
| - var rect =
|
| - /** @type {ClientRect} */(this.webview_.getBoundingClientRect());
|
| - rects.push({left: rect.left,
|
| - top: rect.top,
|
| - width: rect.width,
|
| - height: rect.height});
|
| -};
|
| -
|
| -/**
|
| - * Show the cloud print dialog.
|
| - */
|
| -remoting.CloudPrintDialogContainer.prototype.showCloudPrintUI = function() {
|
| - // TODO (weitaosu): Considering showing the cloud print dialog in a separate
|
| - // window or using remoting.Html5ModalDialog to show the modal dialog.
|
| - this.webview_.hidden = false;
|
| - this.windowShape_.registerClientUI(this);
|
| - this.windowShape_.centerToDesktop(this.webview_);
|
| -};
|
| -
|
| -/**
|
| - * Hide the cloud print dialog.
|
| - */
|
| -remoting.CloudPrintDialogContainer.prototype.hideCloudPrintUI = function() {
|
| - this.webview_.hidden = true;
|
| - this.windowShape_.unregisterClientUI(this);
|
| - this.connectedView_.returnFocusToPlugin();
|
| -}
|
| -
|
| -/**
|
| - * Event handler to process messages from the webview.
|
| - *
|
| - * @param {Event} event
|
| - * @private
|
| - */
|
| -remoting.CloudPrintDialogContainer.prototype.onMessage_ = function(event) {
|
| - var data = event.data;
|
| - console.assert(typeof data === 'object' &&
|
| - data['source'] == 'cloud-print-dialog');
|
| -
|
| - switch (event.data['command']) {
|
| - case 'cp-dialog-on-init::':
|
| - // We actually never receive this message because the cloud print dialog
|
| - // has already been initialized by the time the injected script finishes
|
| - // executing.
|
| - break;
|
| -
|
| - case 'cp-dialog-on-close::':
|
| - this.hideCloudPrintUI();
|
| - break;
|
| -
|
| - default:
|
| - console.error('Unexpected message:', event.data['command'], event.data);
|
| - }
|
| -};
|
| -
|
| -/**
|
| - * Retrieve the file specified by |fileName| in the app package and pass its
|
| - * content to the onDone callback.
|
| - *
|
| - * @param {string} fileName Name of the file in the app package to be read.
|
| - * @param {!function(string):void} onDone Callback to be invoked on success.
|
| - * @param {!function(*):void} onError Callback to be invoked on failure.
|
| - */
|
| -remoting.CloudPrintDialogContainer.readFile =
|
| - function(fileName, onDone, onError) {
|
| - var fileUrl = chrome.runtime.getURL(fileName);
|
| - var xhr = new remoting.Xhr({ method: 'GET', url: fileUrl});
|
| -
|
| - xhr.start().then(function(/** !remoting.Xhr.Response */ response) {
|
| - if (response.status == 200) {
|
| - onDone(response.getText());
|
| - } else {
|
| - onError('xhr.status = ' + response.status);
|
| - }
|
| - });
|
| -};
|
| -
|
| -/**
|
| - * Lanunch the cloud print dialog to print the document.
|
| - *
|
| - * @param {string} title Title of the print job.
|
| - * @param {string} type Type of the storage of the document (url, gdrive, etc).
|
| - * @param {string} data Meaning of this field depends on the |type| parameter.
|
| - */
|
| -remoting.CloudPrintDialogContainer.prototype.printDocument =
|
| - function(title, type, data) {
|
| - var dialogUrl = remoting.CloudPrintDialogContainer.CLOUD_PRINT_DIALOG_URL;
|
| - dialogUrl += 'title=' + encodeURIComponent(title) + '&';
|
| -
|
| - switch (type) {
|
| - case 'url':
|
| - // 'data' should contain the url to the document to be printed.
|
| - if (data.substr(0, 7) !== 'http://' && data.substr(0, 8) !== 'https://') {
|
| - console.error('Bad URL: ' + data);
|
| - return;
|
| - }
|
| - dialogUrl += 'type=url&url=' + encodeURIComponent(data);
|
| - break;
|
| - case 'google.drive':
|
| - // 'data' should contain the doc id of the gdrive document to be printed.
|
| - dialogUrl += 'type=google.drive&content=' + encodeURIComponent(data);
|
| - break;
|
| - default:
|
| - console.error('Unknown content type for the printDocument command.');
|
| - return;
|
| - }
|
| -
|
| - // TODO (weitaosu); Consider moving the event registration to the ctor
|
| - // and add unregistration in the dtor.
|
| - var that = this;
|
| -
|
| - /** @param {string} script */
|
| - var showDialog = function(script) {
|
| - /** @type {Webview} */
|
| - var webview = that.webview_;
|
| -
|
| - var sendHandshake = function() {
|
| - webview.contentWindow.postMessage('app-remoting-handshake', '*');
|
| - }
|
| -
|
| - /** @param {Event} event */
|
| - var redirectConsoleOutput = function(event) {
|
| -
|
| - var e = /** @type {chrome.ConsoleMessageBrowserEvent} */ (event);
|
| - var message = 'console message from webviwe: {' +
|
| - 'level=' + e.level + ', ' +
|
| - 'source=' + e.sourceId + ', ' +
|
| - 'line=' + e.line + ', ' +
|
| - 'message="' + e.message + '"}';
|
| -
|
| - switch (e['level']) {
|
| - case remoting.ConsoleMessageLevel.VERBOSE:
|
| - console.debug(message);
|
| - break;
|
| - case remoting.ConsoleMessageLevel.INFO:
|
| - console.info(message);
|
| - break;
|
| - case remoting.ConsoleMessageLevel.WARNING:
|
| - console.warn(message);
|
| - break;
|
| - case remoting.ConsoleMessageLevel.ERROR:
|
| - console.error(message);
|
| - break;
|
| - default:
|
| - console.error('unrecognized message level. ' + message);
|
| - break;
|
| - }
|
| - }
|
| -
|
| - webview.addEventListener('consolemessage', redirectConsoleOutput);
|
| -
|
| - // Inject the script and send a handshake message to the cloud print dialog
|
| - // after the injected script has been executed.
|
| - webview.addEventListener("loadstart", function(event) {
|
| - console.log('"loadstart" captured in webview containier.');
|
| - // TODO (weitaosu): Consider switching to addContentScripts when M44
|
| - // is released.
|
| - webview.executeScript(
|
| - {code: script + ' //# sourceURL=cloud_print_dialog_injected.js'},
|
| - sendHandshake);
|
| - });
|
| -
|
| - // We need to show the cloud print UI here because we will never receive
|
| - // the 'cp-dialog-on-init::' message.
|
| - webview.src = dialogUrl;
|
| - that.showCloudPrintUI();
|
| - }
|
| -
|
| - /** @param {*} errorMsg */
|
| - var onError = function(errorMsg) {
|
| - console.error('Failed to retrieve the script: ', errorMsg);
|
| - }
|
| -
|
| - remoting.CloudPrintDialogContainer.readFile(
|
| - remoting.CloudPrintDialogContainer.INJECTED_SCRIPT, showDialog, onError);
|
| -};
|
| -
|
| -/**
|
| - * Handler of the onBeforeSendHeaders event for the webview. It adds the auth
|
| - * header to the request being send. Note that this handler is synchronous so
|
| - * modifications to the requst must happen before it returns.
|
| - *
|
| - * @param {Object} details Details of the WebRequest.
|
| - * @return {!BlockingResponse} The modified request headers.
|
| - * @private
|
| - */
|
| -remoting.CloudPrintDialogContainer.prototype.setAuthHeaders_ =
|
| - function(details) {
|
| - var url = /** @type {string} */ (details['url']);
|
| - console.log('Setting auth token for request: ', url);
|
| -
|
| - var headers = /** @type {Array} */ (details['requestHeaders']) || [];
|
| - if (this.accessToken_.length == 0) {
|
| - console.error('No auth token available for the request: ', url);
|
| - return /** @type {!BlockingResponse} */ ({'requestHeaders': headers});
|
| - }
|
| -
|
| - // Make fresh copy of the headers array.
|
| - var newHeaders = /** @type {Array} */ (headers.slice());
|
| - newHeaders.push({
|
| - 'name': 'Authorization',
|
| - 'value': 'Bearer ' + this.accessToken_
|
| - });
|
| -
|
| - return /** @type {!BlockingResponse} */ ({'requestHeaders': newHeaders});
|
| -};
|
| -
|
| -})();
|
|
|