| Index: remoting/webapp/crd/js/clipboard.js
|
| diff --git a/remoting/webapp/crd/js/clipboard.js b/remoting/webapp/crd/js/clipboard.js
|
| index 0d116779e34f6ea19489c4e0e6e6b6ca863f73bc..9d2b48c0bd75bc6fb080c002eb812e13eb5f8885 100644
|
| --- a/remoting/webapp/crd/js/clipboard.js
|
| +++ b/remoting/webapp/crd/js/clipboard.js
|
| @@ -1,4 +1,4 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| +// 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.
|
|
|
| @@ -7,52 +7,60 @@
|
| * A class for moving clipboard items between the plugin and the OS.
|
| */
|
|
|
| -'use strict';
|
| -
|
| /** @suppress {duplicate} */
|
| var remoting = remoting || {};
|
|
|
| -/**
|
| - * @constructor
|
| - */
|
| -remoting.Clipboard = function() {
|
| -};
|
| +(function() {
|
| +
|
| +'use strict';
|
|
|
| /**
|
| * @private
|
| * @enum {string}
|
| */
|
| -remoting.Clipboard.prototype.ItemTypes = {
|
| +var ItemTypes = {
|
| TEXT_TYPE: 'text/plain',
|
| TEXT_UTF8_TYPE: 'text/plain; charset=UTF-8'
|
| };
|
|
|
| -/** @private {string} */
|
| -remoting.Clipboard.prototype.previousContent = "";
|
| +/**
|
| + * @constructor
|
| + * @param {remoting.ClientPlugin} plugin
|
| + * @implements {base.Disposable}
|
| + */
|
| +remoting.Clipboard = function(plugin) {
|
| + /** @private {string} */
|
| + this.previousContent_ = '';
|
|
|
| -/** @private {boolean} */
|
| -remoting.Clipboard.prototype.itemFromHostTextPending = false;
|
| + /** @private {boolean} */
|
| + this.itemFromHostTextPending_ = false;
|
|
|
| -/** @private {boolean} */
|
| -remoting.Clipboard.prototype.blockOneClipboardSend_ = false;
|
| + /** @private {boolean} */
|
| + this.blockOneClipboardSend_ = true;
|
|
|
| -/**
|
| - * Notifies this object that a session has started.
|
| - *
|
| - * @return {void} Nothing.
|
| - */
|
| -remoting.Clipboard.prototype.startSession = function() {
|
| - // Clear the store of items sent and received. Those items now relate to a
|
| - // previous session.
|
| - this.previousContent = "";
|
| - this.itemFromHostTextPending = false;
|
| + /** @private */
|
| + this.plugin_ = plugin;
|
| +
|
| + /** @private */
|
| + this.eventHooks_ = new base.Disposables(
|
| + new base.DomEventHook(plugin.element(), 'focus',
|
| + this.initiateToHost_.bind(this), false),
|
| + new base.DomEventHook(window, 'paste', this.onPaste_.bind(this), false),
|
| + new base.DomEventHook(window, 'copy', this.onCopy_.bind(this), false));
|
|
|
| // Do a paste operation, but make sure the resulting clipboard data isn't sent
|
| // to the host. This stops the host seeing items that were placed on the
|
| // clipboard before the session began. The user may not have intended such
|
| // items to be sent to the host.
|
| - this.blockOneClipboardSend_ = true;
|
| - this.initiateToHost();
|
| + this.initiateToHost_();
|
| + this.plugin_.setClipboardHandler(this.fromHost_.bind(this));
|
| +};
|
| +
|
| +remoting.Clipboard.prototype.dispose = function() {
|
| + this.plugin_.setClipboardHandler(base.doNothing);
|
| + this.plugin_ = null;
|
| + base.dispose(this.eventHooks_);
|
| + this.eventHooks_ = null;
|
| };
|
|
|
| /**
|
| @@ -63,37 +71,34 @@ remoting.Clipboard.prototype.startSession = function() {
|
| *
|
| * @param {ClipboardData} clipboardData
|
| * @return {void} Nothing.
|
| + * @private
|
| */
|
| -remoting.Clipboard.prototype.toHost = function(clipboardData) {
|
| +remoting.Clipboard.prototype.toHost_ = function(clipboardData) {
|
| if (!clipboardData || !clipboardData.types || !clipboardData.getData) {
|
| console.log('Got invalid clipboardData.');
|
| return;
|
| }
|
| - if (!remoting.clientSession) {
|
| - return;
|
| - }
|
| for (var i = 0; i < clipboardData.types.length; i++) {
|
| var type = clipboardData.types[i];
|
| var item = clipboardData.getData(type);
|
| if (!item) {
|
| - item = "";
|
| + item = '';
|
| }
|
| console.log('Got clipboard from OS, type: ' + type +
|
| ' length: ' + item.length + ' new: ' +
|
| - (item != this.previousContent) + ' blocking-send: ' +
|
| + (item != this.previousContent_) + ' blocking-send: ' +
|
| this.blockOneClipboardSend_);
|
| // The browser presents text clipboard items as 'text/plain'.
|
| - if (type == this.ItemTypes.TEXT_TYPE) {
|
| + if (type == ItemTypes.TEXT_TYPE) {
|
| // Don't send the same item more than once. Otherwise the item may be
|
| // sent to and fro indefinitely.
|
| - if (item != this.previousContent) {
|
| + if (item != this.previousContent_) {
|
| if (!this.blockOneClipboardSend_) {
|
| // The plugin's JSON reader emits UTF-8.
|
| console.log('Sending clipboard to host.');
|
| - remoting.clientSession.sendClipboardItem(
|
| - this.ItemTypes.TEXT_UTF8_TYPE, item);
|
| + this.plugin_.sendClipboardItem(ItemTypes.TEXT_UTF8_TYPE, item);
|
| }
|
| - this.previousContent = item;
|
| + this.previousContent_ = item;
|
| }
|
| }
|
| }
|
| @@ -108,21 +113,21 @@ remoting.Clipboard.prototype.toHost = function(clipboardData) {
|
| * @param {string} item The clipboard item.
|
| * @return {void} Nothing.
|
| */
|
| -remoting.Clipboard.prototype.fromHost = function(mimeType, item) {
|
| +remoting.Clipboard.prototype.fromHost_ = function(mimeType, item) {
|
| // The plugin's JSON layer will correctly convert only UTF-8 data sent from
|
| // the host.
|
| console.log('Got clipboard from host, type: ' + mimeType +
|
| ' length: ' + item.length + ' new: ' +
|
| - (item != this.previousContent));
|
| - if (mimeType != this.ItemTypes.TEXT_UTF8_TYPE) {
|
| + (item != this.previousContent_));
|
| + if (mimeType != ItemTypes.TEXT_UTF8_TYPE) {
|
| return;
|
| }
|
| - if (item == this.previousContent) {
|
| + if (item == this.previousContent_) {
|
| return;
|
| }
|
| - this.previousContent = item;
|
| - this.itemFromHostTextPending = true;
|
| - this.initiateToOs();
|
| + this.previousContent_ = item;
|
| + this.itemFromHostTextPending_ = true;
|
| + this.initiateToOs_();
|
| };
|
|
|
| /**
|
| @@ -131,9 +136,10 @@ remoting.Clipboard.prototype.fromHost = function(mimeType, item) {
|
| * @param {ClipboardData} clipboardData
|
| * @return {boolean} Whether any clipboard items were moved to the ClipboardData
|
| * object.
|
| + * @private
|
| */
|
| -remoting.Clipboard.prototype.toOs = function(clipboardData) {
|
| - if (!this.itemFromHostTextPending) {
|
| +remoting.Clipboard.prototype.toOs_ = function(clipboardData) {
|
| + if (!this.itemFromHostTextPending_) {
|
| console.log('Got unexpected clipboard copy event.');
|
| return false;
|
| }
|
| @@ -141,9 +147,9 @@ remoting.Clipboard.prototype.toOs = function(clipboardData) {
|
| // JS string encoding. The browser will convert JS strings to the correct
|
| // encoding, per OS and locale conventions, provided the data type is
|
| // 'text/plain'.
|
| - console.log('Setting OS clipboard, length: ' + this.previousContent.length);
|
| - clipboardData.setData(this.ItemTypes.TEXT_TYPE, this.previousContent);
|
| - this.itemFromHostTextPending = false;
|
| + console.log('Setting OS clipboard, length: ' + this.previousContent_.length);
|
| + clipboardData.setData(ItemTypes.TEXT_TYPE, this.previousContent_);
|
| + this.itemFromHostTextPending_ = false;
|
| return true;
|
| };
|
|
|
| @@ -154,12 +160,13 @@ remoting.Clipboard.prototype.toOs = function(clipboardData) {
|
| * This method makes the browser fire a paste event, which provides access to
|
| * the OS clipboard. That event will be caught by a handler in the document,
|
| * which will call toHost().
|
| + * @private
|
| */
|
| -remoting.Clipboard.prototype.initiateToHost = function() {
|
| +remoting.Clipboard.prototype.initiateToHost_ = function() {
|
| // It would be cleaner to send a paste command to the plugin element,
|
| // but that's not supported.
|
| //console.log('Initiating clipboard paste.');
|
| - document.execCommand("paste");
|
| + document.execCommand('paste');
|
| };
|
|
|
| /**
|
| @@ -169,13 +176,40 @@ remoting.Clipboard.prototype.initiateToHost = function() {
|
| * This method makes the browser fire a copy event, which provides access to
|
| * the OS clipboard. That event will be caught by a handler in the document,
|
| * which will call toOs().
|
| + * @private
|
| */
|
| -remoting.Clipboard.prototype.initiateToOs = function() {
|
| +remoting.Clipboard.prototype.initiateToOs_ = function() {
|
| // It would be cleaner to send a paste command to the plugin element,
|
| // but that's not supported.
|
| console.log('Initiating clipboard copy.');
|
| - document.execCommand("copy");
|
| + document.execCommand('copy');
|
| +};
|
| +
|
| +/**
|
| + * Callback function called when the browser window gets a paste operation.
|
| + *
|
| + * @param {Event} event
|
| + * @return {void} Nothing.
|
| + * @private
|
| + */
|
| +remoting.Clipboard.prototype.onPaste_ = function(event) {
|
| + if (event && event.clipboardData) {
|
| + this.toHost_(event.clipboardData);
|
| + }
|
| +};
|
| +
|
| +/**
|
| + * Callback function called when the browser window gets a copy operation.
|
| + *
|
| + * @param {Event} event
|
| + * @return {void} Nothing.
|
| + * @private
|
| + */
|
| +remoting.Clipboard.prototype.onCopy_ = function(event) {
|
| + if (event && event.clipboardData && this.toOs_(event.clipboardData)) {
|
| + // The default action may overwrite items that we added to clipboardData.
|
| + event.preventDefault();
|
| + }
|
| };
|
|
|
| -/** @type {remoting.Clipboard} */
|
| -remoting.clipboard = null;
|
| +})();
|
|
|